﻿2026-08-28T09:54:45.9930640Z ##[group]Run ./traceable-reqs check --json
2026-08-28T09:54:45.9931179Z [36;1m./traceable-reqs check --json[0m
2026-08-28T09:54:45.9944778Z shell: /usr/bin/bash -e {0}
2026-08-28T09:54:45.9945193Z ##[endgroup]
2026-08-28T09:54:46.0899952Z {
2026-08-28T09:54:46.0900759Z   "schemaVersion": 1,
2026-08-28T09:54:46.0901497Z   "summary": {
2026-08-28T09:54:46.0902122Z     "requirementCount": 855,
2026-08-28T09:54:46.0902826Z     "completeCount": 855,
2026-08-28T09:54:46.0903504Z     "incompleteCount": 0,
2026-08-28T09:54:46.0904688Z     "findingCount": 0
2026-08-28T09:54:46.0907047Z   },
2026-08-28T09:54:46.0907622Z   "requirements": [
2026-08-28T09:54:46.0908218Z     {
2026-08-28T09:54:46.0908871Z       "id": "REQ-ACCESS-RETIRED-VERB-REFUSAL",
2026-08-28T09:54:46.0926400Z       "title": "A RETIRED SUBCOMMAND OF `spt endpoint access` REFUSES BY NAME RATHER THAN FALLING THROUGH ITS OWN OPTIONAL POSITIONAL AND ANSWERING PLAUSIBLY. `access` takes an optional endpoint id positionally, so once `list` and `rules` stopped being subcommands (retired when the roster views replaced them) clap handed those tokens to the POSITIONAL, and the view reported `no access entities ruled for 'list'` at exit 0 -- a well-formed, confident report about an entity nobody has ever created. Found by flynn in the v0.49.0 field verify (releases#67). THE DEFECT IS NOT A MISSING ERROR MESSAGE, IT IS AN ANSWER: the sentence is TRUE of any name nobody has ruled, so it is indistinguishable from the real result for a real endpoint, and an operator or agent still carrying the old form reads it as a report and stops looking. The same failure shape as a stale carried-forward instruction -- the surface looks diligent and is wrong. MEASURED BEFORE THE FIX, and the measurement widened the filing: `rules` falls through IDENTICALLY, so the population is the retired-token FAMILY and not the one token the issue named. The node tier is NOT affected and that was checked rather than assumed: `spt node access` declares no positional at all, so clap refuses an extra argument natively. THE REFUSAL FAILS OPEN ONTO A REAL ENDPOINT. This guard is added to a path that previously accepted EVERY positional, so it is a narrowing, and a narrowing has an unruled arm: an endpoint genuinely named `list` must stay viewable. The known-target check therefore runs FIRST and wins -- a fix that made a real target unreachable would be a new defect wearing the old one's repair. Known means the access store rules it or a local perch carries the id; the store is already loaded at that point, so the check costs no read. The token match is case-folded, because an operator who typed the old verb in any casing typed the old verb. Gate: impl -- the retired-token table with its replacement guidance, the case-folded lookup, the refusal composer naming token then retirement then the working form, and the guard placed AFTER the known-target check inside the view; unit -- a decision table whose expectations are WRITTEN OUT AS LITERALS: each retired token refuses with a nonzero exit and names its replacement, an ordinary unruled endpoint id still gets the honest roster sentence (the silence the fix must not swallow), a real endpoint that happens to BE named `list` is viewed rather than refused, the casing variants refuse alike, and every token in the table is a token the current grammar does NOT accept as a subcommand -- walked against the real parser, so a token that comes BACK as a verb cannot sit here refusing itself.",
2026-08-28T09:54:46.0944490Z       "requiredStages": [
2026-08-28T09:54:46.0944949Z         "impl",
2026-08-28T09:54:46.0945330Z         "unit"
2026-08-28T09:54:46.0945706Z       ],
2026-08-28T09:54:46.0946064Z       "stages": {
2026-08-28T09:54:46.0946449Z         "doc": {
2026-08-28T09:54:46.0946839Z           "complete": false,
2026-08-28T09:54:46.0947281Z           "evidence": []
2026-08-28T09:54:46.0947706Z         },
2026-08-28T09:54:46.0948074Z         "impl": {
2026-08-28T09:54:46.0948464Z           "complete": true,
2026-08-28T09:54:46.0948893Z           "evidence": [
2026-08-28T09:54:46.0949735Z             {
2026-08-28T09:54:46.0950153Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0950697Z               "line": 19985
2026-08-28T09:54:46.0951117Z             },
2026-08-28T09:54:46.0951483Z             {
2026-08-28T09:54:46.0951869Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0952306Z               "line": 20005
2026-08-28T09:54:46.0952669Z             },
2026-08-28T09:54:46.0952992Z             {
2026-08-28T09:54:46.0953350Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0953789Z               "line": 20016
2026-08-28T09:54:46.0954152Z             },
2026-08-28T09:54:46.0954490Z             {
2026-08-28T09:54:46.0954846Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0955289Z               "line": 20040
2026-08-28T09:54:46.0955651Z             }
2026-08-28T09:54:46.0955966Z           ]
2026-08-28T09:54:46.0956276Z         },
2026-08-28T09:54:46.0956605Z         "int": {
2026-08-28T09:54:46.0956961Z           "complete": false,
2026-08-28T09:54:46.0957351Z           "evidence": []
2026-08-28T09:54:46.0957898Z         },
2026-08-28T09:54:46.0958371Z         "unit": {
2026-08-28T09:54:46.0958876Z           "complete": true,
2026-08-28T09:54:46.0959545Z           "evidence": [
2026-08-28T09:54:46.0960065Z             {
2026-08-28T09:54:46.0960581Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0961219Z               "line": 35324
2026-08-28T09:54:46.0961782Z             },
2026-08-28T09:54:46.0962258Z             {
2026-08-28T09:54:46.0962790Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0963429Z               "line": 35358
2026-08-28T09:54:46.0963962Z             },
2026-08-28T09:54:46.0964458Z             {
2026-08-28T09:54:46.0964969Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.0965615Z               "line": 35404
2026-08-28T09:54:46.0966150Z             }
2026-08-28T09:54:46.0966618Z           ]
2026-08-28T09:54:46.0967069Z         }
2026-08-28T09:54:46.0967531Z       }
2026-08-28T09:54:46.0967978Z     },
2026-08-28T09:54:46.0968640Z     {
2026-08-28T09:54:46.0969355Z       "id": "REQ-ACCESS-VERDICT-REASON",
2026-08-28T09:54:46.0986022Z       "title": "The endpoint access gate reports WHY a pass passed, not merely THAT it passed: the gate's verdict carries, on its allow arm, the reason the chain admitted the interaction — the same-node short-circuit, the reply exemption, an entry whose subject NAMED the peer (a proven sender endpoint or the origin node), an entry that matched only by SUBNET WILDCARD (an entry, but one that never named this peer), or a posture pass (an endpoint / node / captured-subnet mode, or the implicit-open bottom of the chain). The reason is computed AT THE GATE, in the one place that holds the whole chain, and travels with the decision. The alternative — a downstream consumer re-deriving it — means RE-OPENING the access store after the gate has closed it, which is both a second read of a value that may already have moved (the stale-snapshot class) and a second entry point into the security chain; the trust warning is a consumer of the decision, never a second decider. Refusals stay BARE: a denial's diagnostic tier is already printed where it is refused, and no enforcement caller does anything with a deny but drop it, so giving Deny a payload would force every refusal site to destructure a field it never reads. Enforcement sites therefore gate on a refusal PREDICATE, which is what keeps the ripple across them rename-shaped rather than a scatter of partial matches. Same-node and reply are carried as reasons in their own right precisely so that a consumer can never warn on them: same-node is inside the node's own trust unit, and a reply is traffic the receiving agent itself invited. Gate: impl — the pass-reason type, the payload on the allow arm, the tier-to-reason classification, and the predicate helpers, with every production enforcement site converted to the predicate; unit — one row per pass arm produced by the REAL gate rather than by calling the classifier directly, each row arranged so that only its own arm can produce the pass (the named-entry rows sit on a closed endpoint, the wildcard row's peer is a subnet member no rule names, and the same closed endpoint is asserted to refuse a non-member), plus the helper split: the refusal predicate is true for exactly the refusal, its complement holds for every pass reason, and no pass reason is readable from a denial.",
2026-08-28T09:54:46.1038198Z       "requiredStages": [
2026-08-28T09:54:46.1039084Z         "impl",
2026-08-28T09:54:46.1039714Z         "unit"
2026-08-28T09:54:46.1040319Z       ],
2026-08-28T09:54:46.1040906Z       "stages": {
2026-08-28T09:54:46.1041543Z         "doc": {
2026-08-28T09:54:46.1042094Z           "complete": false,
2026-08-28T09:54:46.1042738Z           "evidence": []
2026-08-28T09:54:46.1043319Z         },
2026-08-28T09:54:46.1043811Z         "impl": {
2026-08-28T09:54:46.1044363Z           "complete": true,
2026-08-28T09:54:46.1044975Z           "evidence": [
2026-08-28T09:54:46.1045605Z             {
2026-08-28T09:54:46.1046206Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.1046939Z               "line": 103
2026-08-28T09:54:46.1047528Z             },
2026-08-28T09:54:46.1048053Z             {
2026-08-28T09:54:46.1048663Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.1049470Z               "line": 109
2026-08-28T09:54:46.1050053Z             },
2026-08-28T09:54:46.1050589Z             {
2026-08-28T09:54:46.1051156Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.1051856Z               "line": 116
2026-08-28T09:54:46.1052378Z             },
2026-08-28T09:54:46.1052883Z             {
2026-08-28T09:54:46.1053465Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.1054208Z               "line": 131
2026-08-28T09:54:46.1054789Z             },
2026-08-28T09:54:46.1055298Z             {
2026-08-28T09:54:46.1055880Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.1056628Z               "line": 355
2026-08-28T09:54:46.1057518Z             }
2026-08-28T09:54:46.1058031Z           ]
2026-08-28T09:54:46.1058546Z         },
2026-08-28T09:54:46.1059124Z         "int": {
2026-08-28T09:54:46.1059661Z           "complete": false,
2026-08-28T09:54:46.1060294Z           "evidence": []
2026-08-28T09:54:46.1060876Z         },
2026-08-28T09:54:46.1061401Z         "unit": {
2026-08-28T09:54:46.1061994Z           "complete": true,
2026-08-28T09:54:46.1062611Z           "evidence": [
2026-08-28T09:54:46.1063190Z             {
2026-08-28T09:54:46.1063819Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1064603Z               "line": 994
2026-08-28T09:54:46.1065185Z             },
2026-08-28T09:54:46.1065699Z             {
2026-08-28T09:54:46.1066301Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1067064Z               "line": 1127
2026-08-28T09:54:46.1067650Z             }
2026-08-28T09:54:46.1068195Z           ]
2026-08-28T09:54:46.1068701Z         }
2026-08-28T09:54:46.1069272Z       }
2026-08-28T09:54:46.1069759Z     },
2026-08-28T09:54:46.1070271Z     {
2026-08-28T09:54:46.1070845Z       "id": "REQ-ACL-ACCESS-REFRESH-ER-ONLY",
2026-08-28T09:54:46.1080940Z       "title": "spt api access-refresh stops refusing and becomes real, gated to the engine room, updating ONLY the node's captured subnet-level fallbacks (ADR-0052 decision 6; the W2 refusal REQ-ACL-ACCESS-REFRESH-VERB was minted precisely so this wave changes one behavior rather than adding a surface and its gate). The refresh is the CONSENTED half of advisory gossip: a subnet-mode change reaches a member as a notification, the engine room is briefed with the exact new posture, and a human decides whether this node adopts it — which is why the verb writes the captured fallbacks and never the node's own rules, and why no remote actor can invoke it. Its authentication is the same shared engine-room function empower uses. The W2 refusal test is repinned to the new contract in this same change, not left asserting a behavior the wave removed. Gate: doc — ADR-0052 decision 6 and the CONTEXT.md capture-refresh sentence; impl — the real refresh behind the shared engine-room gate, writing captured subnet fallbacks only; unit — an engine-room caller refreshes and the chain's bottom tier changes, a non-engine-room caller is refused, the node's own rules are untouched, and the repinned W2 test asserts the new contract.",
2026-08-28T09:54:46.1091899Z       "requiredStages": [
2026-08-28T09:54:46.1092710Z         "doc",
2026-08-28T09:54:46.1093406Z         "impl",
2026-08-28T09:54:46.1094036Z         "unit"
2026-08-28T09:54:46.1094666Z       ],
2026-08-28T09:54:46.1095301Z       "stages": {
2026-08-28T09:54:46.1095972Z         "doc": {
2026-08-28T09:54:46.1096726Z           "complete": true,
2026-08-28T09:54:46.1097466Z           "evidence": [
2026-08-28T09:54:46.1098066Z             {
2026-08-28T09:54:46.1098691Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.1099536Z               "line": 384
2026-08-28T09:54:46.1100009Z             }
2026-08-28T09:54:46.1100515Z           ]
2026-08-28T09:54:46.1100905Z         },
2026-08-28T09:54:46.1101345Z         "impl": {
2026-08-28T09:54:46.1101917Z           "complete": true,
2026-08-28T09:54:46.1102468Z           "evidence": [
2026-08-28T09:54:46.1102932Z             {
2026-08-28T09:54:46.1103518Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.1104161Z               "line": 558
2026-08-28T09:54:46.1104718Z             },
2026-08-28T09:54:46.1105188Z             {
2026-08-28T09:54:46.1105908Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1106782Z               "line": 417
2026-08-28T09:54:46.1107576Z             },
2026-08-28T09:54:46.1108326Z             {
2026-08-28T09:54:46.1109199Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1110148Z               "line": 66
2026-08-28T09:54:46.1110937Z             },
2026-08-28T09:54:46.1111591Z             {
2026-08-28T09:54:46.1112530Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1113390Z               "line": 83
2026-08-28T09:54:46.1114078Z             },
2026-08-28T09:54:46.1114761Z             {
2026-08-28T09:54:46.1115469Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1116412Z               "line": 440
2026-08-28T09:54:46.1117150Z             },
2026-08-28T09:54:46.1117822Z             {
2026-08-28T09:54:46.1118620Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1119560Z               "line": 455
2026-08-28T09:54:46.1120495Z             },
2026-08-28T09:54:46.1121153Z             {
2026-08-28T09:54:46.1122006Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1122912Z               "line": 547
2026-08-28T09:54:46.1123665Z             },
2026-08-28T09:54:46.1124382Z             {
2026-08-28T09:54:46.1125143Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.1126132Z               "line": 329
2026-08-28T09:54:46.1126894Z             }
2026-08-28T09:54:46.1127573Z           ]
2026-08-28T09:54:46.1128207Z         },
2026-08-28T09:54:46.1128867Z         "int": {
2026-08-28T09:54:46.1129690Z           "complete": false,
2026-08-28T09:54:46.1130410Z           "evidence": []
2026-08-28T09:54:46.1131169Z         },
2026-08-28T09:54:46.1131839Z         "unit": {
2026-08-28T09:54:46.1132562Z           "complete": true,
2026-08-28T09:54:46.1133511Z           "evidence": [
2026-08-28T09:54:46.1134168Z             {
2026-08-28T09:54:46.1134907Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1136118Z               "line": 611
2026-08-28T09:54:46.1136936Z             },
2026-08-28T09:54:46.1137612Z             {
2026-08-28T09:54:46.1138342Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1139375Z               "line": 847
2026-08-28T09:54:46.1220994Z             },
2026-08-28T09:54:46.1222629Z             {
2026-08-28T09:54:46.1223071Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1223719Z               "line": 1013
2026-08-28T09:54:46.1224270Z             },
2026-08-28T09:54:46.1224755Z             {
2026-08-28T09:54:46.1225290Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.1225957Z               "line": 1177
2026-08-28T09:54:46.1226499Z             }
2026-08-28T09:54:46.1226955Z           ]
2026-08-28T09:54:46.1227423Z         }
2026-08-28T09:54:46.1227870Z       }
2026-08-28T09:54:46.1228319Z     },
2026-08-28T09:54:46.1228763Z     {
2026-08-28T09:54:46.1229343Z       "id": "REQ-ACL-ACCESS-REFRESH-VERB",
2026-08-28T09:54:46.1234996Z       "title": "`spt api access-refresh` is MINTED THIS WAVE BUT REFUSES — the verb exists, parses and is documented, and its refusal names why: the capture-refresh is engine-room-only, and engine-room enforcement (ADR-0052) does not land until W3. Minting the refusing verb now is deliberate: it fixes the contract adapters and the engine-room brief will be built against, and it makes the wave that implements enforcement a change to ONE behavior rather than a new surface plus its gate. A refusal that merely says 'unknown command' would invite an adapter to route around it. When it does light up it updates ONLY the node's captured subnet-level fallbacks — never the node's own rules, which are the operator's, not the subnet's. Gate: doc — the CONTEXT.md capture-refresh sentence naming the verb and its engine-room-only gate; impl — the verb, parsing, and a clear refusal naming the W3 dependency; unit — invoking it refuses with the engine-room diagnostic, changes no stored state, and is not reachable as an unknown-command fallthrough.",
2026-08-28T09:54:46.1239746Z       "requiredStages": [
2026-08-28T09:54:46.1240132Z         "doc",
2026-08-28T09:54:46.1240456Z         "impl",
2026-08-28T09:54:46.1240780Z         "unit"
2026-08-28T09:54:46.1241095Z       ],
2026-08-28T09:54:46.1241414Z       "stages": {
2026-08-28T09:54:46.1241749Z         "doc": {
2026-08-28T09:54:46.1242265Z           "complete": true,
2026-08-28T09:54:46.1242632Z           "evidence": [
2026-08-28T09:54:46.1242999Z             {
2026-08-28T09:54:46.1243342Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1243739Z               "line": 879
2026-08-28T09:54:46.1244102Z             }
2026-08-28T09:54:46.1244426Z           ]
2026-08-28T09:54:46.1244736Z         },
2026-08-28T09:54:46.1245044Z         "impl": {
2026-08-28T09:54:46.1245380Z           "complete": true,
2026-08-28T09:54:46.1245743Z           "evidence": [
2026-08-28T09:54:46.1246086Z             {
2026-08-28T09:54:46.1246434Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.1246872Z               "line": 328
2026-08-28T09:54:46.1247221Z             }
2026-08-28T09:54:46.1247529Z           ]
2026-08-28T09:54:46.1247832Z         },
2026-08-28T09:54:46.1248146Z         "int": {
2026-08-28T09:54:46.1248485Z           "complete": false,
2026-08-28T09:54:46.1248868Z           "evidence": []
2026-08-28T09:54:46.1249429Z         },
2026-08-28T09:54:46.1249744Z         "unit": {
2026-08-28T09:54:46.1250079Z           "complete": true,
2026-08-28T09:54:46.1250444Z           "evidence": [
2026-08-28T09:54:46.1250783Z             {
2026-08-28T09:54:46.1251570Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.1252227Z               "line": 1177
2026-08-28T09:54:46.1252727Z             }
2026-08-28T09:54:46.1253173Z           ]
2026-08-28T09:54:46.1253578Z         }
2026-08-28T09:54:46.1254018Z       }
2026-08-28T09:54:46.1254470Z     },
2026-08-28T09:54:46.1254885Z     {
2026-08-28T09:54:46.1255357Z       "id": "REQ-ACL-DISCOVER-DEFAULT-ON",
2026-08-28T09:54:46.1272863Z       "title": "DISCOVER IS ON BY DEFAULT: a `closed` posture at ANY mode tier -- endpoint mode, node mode, or the join-time-captured subnet mode -- no longer implies a DISCOVER deny, and the ONLY thing that closes DISCOVER is a deny that NAMES it: an access rule row, or a `per_surface` mode entry (engine-room-set at the node tier). Operator-ruled 2026-08-17 (releases#180/#181): being findable is what makes a knock -- the ask to be admitted -- possible at all, so a node that closed its posture to say 'do not talk to me' had also silently said 'and you may not ask', which was never the choice being made; the messaging-first majority pays for a discovery decision they never took. THE DEFAULT LIVES IN THE SURFACE VOCABULARY, NOT BESIDE THE CHAIN: the `surface::TABLE` row grows a `default_on` discriminant (single-source, the shape `attributable` already established) and exactly ONE method reads it -- `Modes::for_surface_governing`, which for a default-on surface resolves `per_surface` ALONE (exact key then case-fold, the releases#66 precedence rule VERBATIM) and declines the `self.all` blanket fallback. `Modes::for_surface` is untouched, so every reader that asks 'what posture is set here' keeps its present meaning; only the readers that DECIDE change. ALL THREE MODE TIERS AND `effective_posture` ROUTE THROUGH IT: the posture reading is deliberately the chain's own tiers in the chain's own order, so leaving it on the blanket would put two accounts of one fact out of agreement -- the exact failure that method exists to prevent -- and the `may_grant_node_subject` consequence is CONSISTENT rather than a hole, since post-change a node-subject DISCOVER allow admits nothing the default already does not. `MatchedTier::SurfaceDefaultOpen` is minted: a pass by surface default and a pass by chain bottom are different facts, needed by the ER/DISCOVER conjunction notice and the trust warning's pass-reason, and cheap only at mint. WHAT DOES NOT MOVE: ADR-0053's degrade (a store that cannot be read still refuses DISCOVER outright -- the default is a posture carve-out, never a licence to advertise policy we cannot read), REQ-ER-NOT-ADVERTISED's pre-chain engine-room carve-out (posture beats whitelist), and the redemption path, which is DISCOVER-free by design and node-tier-routed. Gate: doc -- the CONTEXT.md mode-tier entry stating the carve-out as ratified vocabulary, naming the one off-switch and the three things that do not move; impl -- the table discriminant, its single table-driven reader, the governing resolver, the three tiers, `effective_posture`, and the new tier; unit -- a blanket-closed node admits DISCOVER and STILL refuses MSG in one cell, an explicit DISCOVER-naming mode closes it at each of the three tiers SEPARATELY, a DISCOVER-naming deny ROW still denies, the case-folded key is honoured ON THE NEW PATH with exact-match precedence intact, the chain and `effective_posture` agree in both directions, the default-open pass is distinguishable from the implicit-open bottom, the reader is proven a function OF THE TABLE against a fixture the shipped table cannot express, and a degraded store refuses DISCOVER beside a readable blanket-closed one that admits it.",
2026-08-28T09:54:46.1288641Z       "requiredStages": [
2026-08-28T09:54:46.1289195Z         "doc",
2026-08-28T09:54:46.1289665Z         "impl",
2026-08-28T09:54:46.1290086Z         "unit",
2026-08-28T09:54:46.1290498Z         "int"
2026-08-28T09:54:46.1291045Z       ],
2026-08-28T09:54:46.1291462Z       "stages": {
2026-08-28T09:54:46.1291918Z         "doc": {
2026-08-28T09:54:46.1292368Z           "complete": true,
2026-08-28T09:54:46.1292824Z           "evidence": [
2026-08-28T09:54:46.1293324Z             {
2026-08-28T09:54:46.1293767Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1294278Z               "line": 879
2026-08-28T09:54:46.1294749Z             }
2026-08-28T09:54:46.1295161Z           ]
2026-08-28T09:54:46.1295629Z         },
2026-08-28T09:54:46.1296076Z         "impl": {
2026-08-28T09:54:46.1296515Z           "complete": true,
2026-08-28T09:54:46.1297011Z           "evidence": [
2026-08-28T09:54:46.1297446Z             {
2026-08-28T09:54:46.1297952Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1298506Z               "line": 193
2026-08-28T09:54:46.1298925Z             },
2026-08-28T09:54:46.1299616Z             {
2026-08-28T09:54:46.1300066Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1300652Z               "line": 206
2026-08-28T09:54:46.1301144Z             },
2026-08-28T09:54:46.1301543Z             {
2026-08-28T09:54:46.1302059Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1302594Z               "line": 303
2026-08-28T09:54:46.1303069Z             },
2026-08-28T09:54:46.1303488Z             {
2026-08-28T09:54:46.1303947Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1304519Z               "line": 316
2026-08-28T09:54:46.1304957Z             },
2026-08-28T09:54:46.1305361Z             {
2026-08-28T09:54:46.1305898Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1306451Z               "line": 333
2026-08-28T09:54:46.1306923Z             },
2026-08-28T09:54:46.1307342Z             {
2026-08-28T09:54:46.1307778Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1308366Z               "line": 364
2026-08-28T09:54:46.1308822Z             },
2026-08-28T09:54:46.1309318Z             {
2026-08-28T09:54:46.1309809Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1310348Z               "line": 797
2026-08-28T09:54:46.1310861Z             },
2026-08-28T09:54:46.1311284Z             {
2026-08-28T09:54:46.1311751Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1312319Z               "line": 1194
2026-08-28T09:54:46.1312761Z             },
2026-08-28T09:54:46.1313206Z             {
2026-08-28T09:54:46.1313676Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1314192Z               "line": 1683
2026-08-28T09:54:46.1314701Z             },
2026-08-28T09:54:46.1315103Z             {
2026-08-28T09:54:46.1315631Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1316168Z               "line": 1756
2026-08-28T09:54:46.1316596Z             },
2026-08-28T09:54:46.1317064Z             {
2026-08-28T09:54:46.1317511Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1318304Z               "line": 1799
2026-08-28T09:54:46.1318774Z             },
2026-08-28T09:54:46.1319330Z             {
2026-08-28T09:54:46.1319830Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1320402Z               "line": 1839
2026-08-28T09:54:46.1320904Z             },
2026-08-28T09:54:46.1321322Z             {
2026-08-28T09:54:46.1321777Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.1322368Z               "line": 154
2026-08-28T09:54:46.1322799Z             },
2026-08-28T09:54:46.1323208Z             {
2026-08-28T09:54:46.1323709Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.1324255Z               "line": 90
2026-08-28T09:54:46.1324718Z             },
2026-08-28T09:54:46.1325186Z             {
2026-08-28T09:54:46.1325615Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1326191Z               "line": 19573
2026-08-28T09:54:46.1326653Z             },
2026-08-28T09:54:46.1327080Z             {
2026-08-28T09:54:46.1327537Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1328058Z               "line": 19607
2026-08-28T09:54:46.1328540Z             },
2026-08-28T09:54:46.1329035Z             {
2026-08-28T09:54:46.1329463Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1330089Z               "line": 19630
2026-08-28T09:54:46.1330534Z             },
2026-08-28T09:54:46.1330991Z             {
2026-08-28T09:54:46.1331426Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1331930Z               "line": 19647
2026-08-28T09:54:46.1332438Z             }
2026-08-28T09:54:46.1332834Z           ]
2026-08-28T09:54:46.1333252Z         },
2026-08-28T09:54:46.1333706Z         "int": {
2026-08-28T09:54:46.1334125Z           "complete": true,
2026-08-28T09:54:46.1334632Z           "evidence": [
2026-08-28T09:54:46.1335097Z             {
2026-08-28T09:54:46.1335879Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.1336460Z               "line": 2550
2026-08-28T09:54:46.1336919Z             },
2026-08-28T09:54:46.1337359Z             {
2026-08-28T09:54:46.1337812Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.1338359Z               "line": 2573
2026-08-28T09:54:46.1338852Z             },
2026-08-28T09:54:46.1339347Z             {
2026-08-28T09:54:46.1339829Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.1340455Z               "line": 2597
2026-08-28T09:54:46.1340879Z             }
2026-08-28T09:54:46.1341352Z           ]
2026-08-28T09:54:46.1341770Z         },
2026-08-28T09:54:46.1342195Z         "unit": {
2026-08-28T09:54:46.1342647Z           "complete": true,
2026-08-28T09:54:46.1343107Z           "evidence": [
2026-08-28T09:54:46.1343580Z             {
2026-08-28T09:54:46.1344047Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1344652Z               "line": 418
2026-08-28T09:54:46.1345125Z             },
2026-08-28T09:54:46.1345534Z             {
2026-08-28T09:54:46.1346019Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1346568Z               "line": 567
2026-08-28T09:54:46.1346988Z             },
2026-08-28T09:54:46.1347451Z             {
2026-08-28T09:54:46.1347919Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1348506Z               "line": 617
2026-08-28T09:54:46.1349049Z             },
2026-08-28T09:54:46.1349478Z             {
2026-08-28T09:54:46.1350032Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.1350583Z               "line": 385
2026-08-28T09:54:46.1351063Z             },
2026-08-28T09:54:46.1351481Z             {
2026-08-28T09:54:46.1351926Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1352518Z               "line": 3021
2026-08-28T09:54:46.1352965Z             },
2026-08-28T09:54:46.1353372Z             {
2026-08-28T09:54:46.1354077Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1355002Z               "line": 3066
2026-08-28T09:54:46.1355786Z             },
2026-08-28T09:54:46.1356442Z             {
2026-08-28T09:54:46.1357176Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1358129Z               "line": 3095
2026-08-28T09:54:46.1358832Z             },
2026-08-28T09:54:46.1359600Z             {
2026-08-28T09:54:46.1360240Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1360821Z               "line": 3139
2026-08-28T09:54:46.1361327Z             },
2026-08-28T09:54:46.1361784Z             {
2026-08-28T09:54:46.1362272Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1362844Z               "line": 3162
2026-08-28T09:54:46.1363287Z             },
2026-08-28T09:54:46.1363724Z             {
2026-08-28T09:54:46.1364195Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1388255Z               "line": 3195
2026-08-28T09:54:46.1388771Z             },
2026-08-28T09:54:46.1389171Z             {
2026-08-28T09:54:46.1389552Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1390019Z               "line": 3239
2026-08-28T09:54:46.1390404Z             },
2026-08-28T09:54:46.1390865Z             {
2026-08-28T09:54:46.1391238Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1391699Z               "line": 4328
2026-08-28T09:54:46.1392062Z             },
2026-08-28T09:54:46.1392391Z             {
2026-08-28T09:54:46.1392757Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1393208Z               "line": 5062
2026-08-28T09:54:46.1393556Z             },
2026-08-28T09:54:46.1393867Z             {
2026-08-28T09:54:46.1394223Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.1394657Z               "line": 520
2026-08-28T09:54:46.1395001Z             },
2026-08-28T09:54:46.1395569Z             {
2026-08-28T09:54:46.1395913Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1396351Z               "line": 36158
2026-08-28T09:54:46.1396715Z             },
2026-08-28T09:54:46.1397030Z             {
2026-08-28T09:54:46.1397377Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1397805Z               "line": 36257
2026-08-28T09:54:46.1398158Z             }
2026-08-28T09:54:46.1398473Z           ]
2026-08-28T09:54:46.1398773Z         }
2026-08-28T09:54:46.1399163Z       }
2026-08-28T09:54:46.1399464Z     },
2026-08-28T09:54:46.1399760Z     {
2026-08-28T09:54:46.1400089Z       "id": "REQ-ACL-DISCOVER-GATE",
2026-08-28T09:54:46.1406496Z       "title": "DISCOVER is a real gated surface: registry resolve/advertise and the resources blurb are filtered per viewer, so discovery leaks nothing a viewer could not reach. ADR-0009 NAMED this leg — 'discovery (resource advertisement) is gated by the first two gates' — and CONTEXT.md's resource-advertisement entry promises that an endpoint whose access rules exclude the viewer's node by naming DISCOVER in a deny never appears in that view; a legacy grant plus blanket-closed posture does not imply that exclusion because DISCOVER is default-on. Only the VISIBILITY half was ever built; the access half has been an unbuilt promise since M4. Un-gated discovery on a shared subnet is an inventory of every agent on every member node, including the ones an operator deliberately walled off — and a resources blurb is a yellow-pages description written to attract exactly the collaboration the access rules refuse. Gate: doc — the CONTEXT.md resource-advertisement entry (the promise this closes) and the control-surface entry minting the id; impl — the DISCOVER check on the registry resolve/advertise path plus per-viewer filtering of the resources blurb; unit — a viewer denied by a DISCOVER-naming rule sees neither the endpoint row nor its blurb, while a viewer allowed DISCOVER sees both, legacy blanket closure alone remains disclosed, and the filter is per-viewer rather than global.",
2026-08-28T09:54:46.1412863Z       "requiredStages": [
2026-08-28T09:54:46.1413230Z         "doc",
2026-08-28T09:54:46.1413549Z         "impl",
2026-08-28T09:54:46.1413877Z         "unit"
2026-08-28T09:54:46.1414189Z       ],
2026-08-28T09:54:46.1414499Z       "stages": {
2026-08-28T09:54:46.1414823Z         "doc": {
2026-08-28T09:54:46.1415152Z           "complete": true,
2026-08-28T09:54:46.1415525Z           "evidence": [
2026-08-28T09:54:46.1415869Z             {
2026-08-28T09:54:46.1416208Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1416606Z               "line": 794
2026-08-28T09:54:46.1416963Z             }
2026-08-28T09:54:46.1417276Z           ]
2026-08-28T09:54:46.1417591Z         },
2026-08-28T09:54:46.1417901Z         "impl": {
2026-08-28T09:54:46.1418239Z           "complete": true,
2026-08-28T09:54:46.1418606Z           "evidence": [
2026-08-28T09:54:46.1418945Z             {
2026-08-28T09:54:46.1419388Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1419851Z               "line": 193
2026-08-28T09:54:46.1420203Z             },
2026-08-28T09:54:46.1420518Z             {
2026-08-28T09:54:46.1420875Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1421339Z               "line": 233
2026-08-28T09:54:46.1421685Z             },
2026-08-28T09:54:46.1422312Z             {
2026-08-28T09:54:46.1422798Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.1423295Z               "line": 172
2026-08-28T09:54:46.1423704Z             },
2026-08-28T09:54:46.1424028Z             {
2026-08-28T09:54:46.1424409Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.1424883Z               "line": 270
2026-08-28T09:54:46.1425426Z             },
2026-08-28T09:54:46.1425942Z             {
2026-08-28T09:54:46.1426782Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.1427436Z               "line": 277
2026-08-28T09:54:46.1428114Z             }
2026-08-28T09:54:46.1428523Z           ]
2026-08-28T09:54:46.1428899Z         },
2026-08-28T09:54:46.1429495Z         "int": {
2026-08-28T09:54:46.1429852Z           "complete": false,
2026-08-28T09:54:46.1430277Z           "evidence": []
2026-08-28T09:54:46.1430640Z         },
2026-08-28T09:54:46.1430945Z         "unit": {
2026-08-28T09:54:46.1431284Z           "complete": true,
2026-08-28T09:54:46.1431655Z           "evidence": [
2026-08-28T09:54:46.1432007Z             {
2026-08-28T09:54:46.1432381Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1432843Z               "line": 542
2026-08-28T09:54:46.1433207Z             },
2026-08-28T09:54:46.1433522Z             {
2026-08-28T09:54:46.1433888Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1434322Z               "line": 600
2026-08-28T09:54:46.1434694Z             },
2026-08-28T09:54:46.1435011Z             {
2026-08-28T09:54:46.1435415Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.1435967Z               "line": 335
2026-08-28T09:54:46.1436335Z             },
2026-08-28T09:54:46.1436655Z             {
2026-08-28T09:54:46.1437042Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.1437517Z               "line": 412
2026-08-28T09:54:46.1437862Z             }
2026-08-28T09:54:46.1438172Z           ]
2026-08-28T09:54:46.1438487Z         }
2026-08-28T09:54:46.1438793Z       }
2026-08-28T09:54:46.1439169Z     },
2026-08-28T09:54:46.1439488Z     {
2026-08-28T09:54:46.1439851Z       "id": "REQ-ACL-ER-DISCOVER-CONJUNCTION-NOTICE",
2026-08-28T09:54:46.1454689Z       "title": "AN ACCEPTED RULE THAT CANNOT CURRENTLY TAKE EFFECT SAYS SO: an endpoint-scoped access mutation naming the ENGINE ROOM is accepted and, when its `DISCOVER` half cannot presently disclose anything, the accept site prints a LOUD CONJUNCTION NOTICE naming the engine room's advertisement whitelist as the other lever and its current posture. Disclosure of the engine room is an AND across two records: `DiscoverGate` checks the ER advertisement filter BEFORE the access chain (REQ-ER-NOT-ADVERTISED, ratified and unchanged by this requirement), so a rule accepted against an empty whitelist discloses NOTHING while reading as policy in force. Field case: ENLYZEAM's sole `DISCOVER` allow was ER-scoped `any-of SPT_DEV` with an empty whitelist, and every SPT_DEV peer saw only its own rows (hertz RCA 2026-08-05). THE RULED SHAPE (doyle, releases#163) IS ACCEPT-AND-TELL, and both halves of it are load-bearing: do NOT refuse the mutation -- the rule IS the conjunction's legitimate chain half and refusing it would make the only expressible half unexpressible -- and do NOT route it into the ER whitelist, because that record is the human/engine-room seat's authority and an AGENT-INVOCABLE VERB MUST NOT MUTATE IT. Kin doctrine: refused-rather-than-quietly-ignored (#5); the defect is DECLARE-SITE VS ENFORCE-SITE SILENCE, and acceptance is not the defect. WHICH HALF IS MISSING IS NAMED, not merely that one is: the whitelist names nobody; the whitelist does not name the machine this rule admits (checkable EXACTLY for a node subject, because the whitelist is node-keyed -- an advertisement lands on a peer NODE and every endpoint there reads it -- and deliberately NOT guessed for a subnet wildcard, which this site cannot enumerate into node keys, NOR for a sender-endpoint subject, which names no node at all: resolving that id to a machine would be a guess wearing a lookup, since the directory answers where this node last SAW that endpoint and not where the grant will be exercised from, so a notice built on it would name the wrong machine with full confidence. Both fall-throughs are the same non-guess doctrine and both are PINNED BY A CELL, because an unstated deliberate silence is indistinguishable from an unhandled arm to the next reader (doyle, #146 review); or the whitelist would disclose and the posture withholds ahead of it. GAPS ARE REPORTED WHITELIST-FIRST THOUGH THE GATE CHECKS POSTURE FIRST: posture is a state that changes the moment a controller attaches, the whitelist is the durable lever the operator must actually edit, and naming a transient blocker while a permanent one sits underneath sends them to fix the wrong thing. ONLY AN ALLOW IS CLASSIFIED -- a deny's `DISCOVER` half takes effect the moment it lands, so a notice there would teach that a refusal is conditional when it is not -- and a REMOVAL never reaches the notice by an explicit op guard rather than by the decision it carries, since a removal restates the tuple with the WIDENING polarity the gate wanted and not the rule's own. The record is read only when the target IS the engine room, so an ordinary rule mutation gains no file read. Gate: doc -- the CONTEXT.md entry stating the conjunction, the accept-and-tell shape, the whitelist-first order and what must not happen; impl -- the pure classifier over (target-is-ER, rule, whitelist, posture), the notice composer, and the accept-site call after the acceptance line; unit -- each gap arm classified apart, an ALLOW that the whitelist DOES name plus an online posture yields NO notice (the silence is earned, not merely unimplemented), a deny and a removal are silent, a non-ER target is silent, and the notice text names the whitelist as the other lever and the posture as its current state.",
2026-08-28T09:54:46.1470951Z       "requiredStages": [
2026-08-28T09:54:46.1471322Z         "doc",
2026-08-28T09:54:46.1471646Z         "impl",
2026-08-28T09:54:46.1472008Z         "unit",
2026-08-28T09:54:46.1472328Z         "int"
2026-08-28T09:54:46.1472642Z       ],
2026-08-28T09:54:46.1472947Z       "stages": {
2026-08-28T09:54:46.1473266Z         "doc": {
2026-08-28T09:54:46.1473605Z           "complete": true,
2026-08-28T09:54:46.1473976Z           "evidence": [
2026-08-28T09:54:46.1474323Z             {
2026-08-28T09:54:46.1474659Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1475065Z               "line": 885
2026-08-28T09:54:46.1475423Z             }
2026-08-28T09:54:46.1475734Z           ]
2026-08-28T09:54:46.1476176Z         },
2026-08-28T09:54:46.1476509Z         "impl": {
2026-08-28T09:54:46.1476852Z           "complete": true,
2026-08-28T09:54:46.1477219Z           "evidence": [
2026-08-28T09:54:46.1477569Z             {
2026-08-28T09:54:46.1477936Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1478395Z               "line": 703
2026-08-28T09:54:46.1478752Z             },
2026-08-28T09:54:46.1479177Z             {
2026-08-28T09:54:46.1479525Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1479953Z               "line": 15955
2026-08-28T09:54:46.1480319Z             },
2026-08-28T09:54:46.1480642Z             {
2026-08-28T09:54:46.1480991Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1481428Z               "line": 15994
2026-08-28T09:54:46.1481792Z             },
2026-08-28T09:54:46.1482102Z             {
2026-08-28T09:54:46.1482450Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1482883Z               "line": 16025
2026-08-28T09:54:46.1483249Z             },
2026-08-28T09:54:46.1483560Z             {
2026-08-28T09:54:46.1483898Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1484317Z               "line": 16077
2026-08-28T09:54:46.1484675Z             }
2026-08-28T09:54:46.1484983Z           ]
2026-08-28T09:54:46.1485286Z         },
2026-08-28T09:54:46.1485582Z         "int": {
2026-08-28T09:54:46.1485930Z           "complete": true,
2026-08-28T09:54:46.1486417Z           "evidence": [
2026-08-28T09:54:46.1486779Z             {
2026-08-28T09:54:46.1487156Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.1487619Z               "line": 2619
2026-08-28T09:54:46.1487970Z             }
2026-08-28T09:54:46.1488279Z           ]
2026-08-28T09:54:46.1488579Z         },
2026-08-28T09:54:46.1488884Z         "unit": {
2026-08-28T09:54:46.1489342Z           "complete": true,
2026-08-28T09:54:46.1489843Z           "evidence": [
2026-08-28T09:54:46.1490229Z             {
2026-08-28T09:54:46.1490625Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1491064Z               "line": 35981
2026-08-28T09:54:46.1491446Z             },
2026-08-28T09:54:46.1491770Z             {
2026-08-28T09:54:46.1492123Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1492566Z               "line": 36218
2026-08-28T09:54:46.1492938Z             }
2026-08-28T09:54:46.1493242Z           ]
2026-08-28T09:54:46.1493547Z         }
2026-08-28T09:54:46.1493847Z       }
2026-08-28T09:54:46.1494148Z     },
2026-08-28T09:54:46.1494448Z     {
2026-08-28T09:54:46.1494768Z       "id": "REQ-ACL-FAIL-CLOSED",
2026-08-28T09:54:46.1507104Z       "title": "A corrupt or unreadable access store degrades CLOSED, loudly (ADR-0053 — an ADR-level flip of ADR-0009's deliberate fail-open ruling). ADR-0009 justified fail-open explicitly: the whitelist was 'a same-subnet convenience boundary layered inside subnet membership, not the system's outer wall', because every member node was the one user's own machine. The SHARED SUBNET ruling breaks that premise — member nodes now belong to different human operators and the access layer gates agents — and a boundary that evaporates when its store file corrupts is not a boundary an operator can reason about. So a store that CANNOT BE READ refuses unlisted-subject traffic on every surface rather than admitting it, and says so on the refusing node naming the store path (silence plus refusal reads as network failure and burns diagnosis time). TWO THINGS SURVIVE THE DEGRADE: the stateful-firewall reply exemption (correlation state is a separate file keyed on the endpoint's own recent outbound — a degraded node keeps its own conversations alive) and the same-node loopback Allow. THE SPLIT THAT MAKES THIS SHIPPABLE: an ABSENT store file is NOT a degrade. It is the unconfigured baseline — every fleet node today has no access.json, and reading absence as closed would refuse all unsolicited cross-node traffic fleet-wide on upgrade. The two cases split on std::io::ErrorKind::NotFound and nothing else: never-created reads as an empty store whose chain bottoms out open; any other io error or a parse failure is a degrade. Absent-is-open keeps an unconfigured fleet reachable, unreadable-is-closed makes the boundary real. Consequence accepted per ADR-0053: a personal fleet with zero configured rules now blocks unsolicited cross-node traffic if its store file CORRUPTS — the failure is loud, local, and repairable, and the alternative (silent admission on a shared subnet) is the worse lie. Existing fail-open tests are repinned to the new contract as part of this diff (a product contract change, not a test fixup). Gate: doc — ADR-0053 and the CONTEXT.md control-surface-modes entry carrying the degrade rule; impl — AccessStore::load_checked/load_checked_from returning AccessDegraded (path + cause) with the NotFound split, and the daemon gate's refuse-plus-diagnostic arm ordered AFTER the reply exemption; unit — the degrade split (absent is baseline, corrupt and unreadable both degrade, diagnostic names the path) and the gate-level proof that the same call is allowed before corruption, refused on every surface during it, still allowed as a reply throughout, and allowed again once the store is repaired without a restart.",
2026-08-28T09:54:46.1518850Z       "requiredStages": [
2026-08-28T09:54:46.1519337Z         "doc",
2026-08-28T09:54:46.1519655Z         "impl",
2026-08-28T09:54:46.1519964Z         "unit"
2026-08-28T09:54:46.1520293Z       ],
2026-08-28T09:54:46.1520593Z       "stages": {
2026-08-28T09:54:46.1520908Z         "doc": {
2026-08-28T09:54:46.1521232Z           "complete": true,
2026-08-28T09:54:46.1521599Z           "evidence": [
2026-08-28T09:54:46.1521942Z             {
2026-08-28T09:54:46.1522277Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1522686Z               "line": 879
2026-08-28T09:54:46.1523035Z             }
2026-08-28T09:54:46.1523345Z           ]
2026-08-28T09:54:46.1523650Z         },
2026-08-28T09:54:46.1524104Z         "impl": {
2026-08-28T09:54:46.1524447Z           "complete": true,
2026-08-28T09:54:46.1524809Z           "evidence": [
2026-08-28T09:54:46.1525147Z             {
2026-08-28T09:54:46.1525518Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1525972Z               "line": 194
2026-08-28T09:54:46.1526325Z             },
2026-08-28T09:54:46.1526635Z             {
2026-08-28T09:54:46.1526993Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1527436Z               "line": 947
2026-08-28T09:54:46.1527779Z             },
2026-08-28T09:54:46.1528089Z             {
2026-08-28T09:54:46.1528452Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1528897Z               "line": 1452
2026-08-28T09:54:46.1529324Z             },
2026-08-28T09:54:46.1529634Z             {
2026-08-28T09:54:46.1529987Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1530428Z               "line": 1460
2026-08-28T09:54:46.1530786Z             },
2026-08-28T09:54:46.1531106Z             {
2026-08-28T09:54:46.1531454Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1531901Z               "line": 1505
2026-08-28T09:54:46.1532259Z             }
2026-08-28T09:54:46.1532563Z           ]
2026-08-28T09:54:46.1532866Z         },
2026-08-28T09:54:46.1533162Z         "int": {
2026-08-28T09:54:46.1533495Z           "complete": false,
2026-08-28T09:54:46.1533867Z           "evidence": []
2026-08-28T09:54:46.1534205Z         },
2026-08-28T09:54:46.1534511Z         "unit": {
2026-08-28T09:54:46.1534849Z           "complete": true,
2026-08-28T09:54:46.1535213Z           "evidence": [
2026-08-28T09:54:46.1535558Z             {
2026-08-28T09:54:46.1535984Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1536436Z               "line": 335
2026-08-28T09:54:46.1536784Z             },
2026-08-28T09:54:46.1537079Z             {
2026-08-28T09:54:46.1537438Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1538063Z               "line": 600
2026-08-28T09:54:46.1538411Z             },
2026-08-28T09:54:46.1538721Z             {
2026-08-28T09:54:46.1539166Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.1539618Z               "line": 649
2026-08-28T09:54:46.1539956Z             },
2026-08-28T09:54:46.1540261Z             {
2026-08-28T09:54:46.1540613Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1541060Z               "line": 4108
2026-08-28T09:54:46.1541403Z             },
2026-08-28T09:54:46.1541709Z             {
2026-08-28T09:54:46.1542066Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1542509Z               "line": 4141
2026-08-28T09:54:46.1542848Z             }
2026-08-28T09:54:46.1543152Z           ]
2026-08-28T09:54:46.1543459Z         }
2026-08-28T09:54:46.1543760Z       }
2026-08-28T09:54:46.1544055Z     },
2026-08-28T09:54:46.1544351Z     {
2026-08-28T09:54:46.1544732Z       "id": "REQ-ACL-FORK-WITHOUT-DISCOVER-CONSEQUENCE",
2026-08-28T09:54:46.1557400Z       "title": "A `FORK` GRANT WHOSE SUBJECT CANNOT RESOLVE THE ENDPOINT SAYS SO AT WRITE TIME -- a stated consequence, never a refusal: the rule lands exactly as typed and the operator is told that as written the subject cannot resolve the endpoint it may now fork, so the attempt fails later as an unresolvable subject. Forking a remote endpoint takes TWO surfaces and only one is obvious: `FORK` authorizes the operation, `DISCOVER` is what lets the grantee resolve the row at all. Field origin (releases#76, from the releases#29 cross-node rung): node B granted node A `FORK` alone, A could never fork, and granting the pair fixed it -- diagnosed empirically, not by reading. The operator-facing defect was never that the pair is required; it is that the requirement was INVISIBLE, since the write succeeds and reads back as typed. THE CONDITION IS THE CHAIN'S OWN `DISCOVER` VERDICT FOR THE SUBJECT, NEVER RULE-ROW PRESENCE, and the re-derivation matters because #76's own filed premise stopped being true inside this milestone: the filing reasoned that per-surface isolation closes every unlisted surface so a FORK-only grant DENIES DISCOVER, but read against the code a FORK rule simply does not COVER DISCOVER (`AccessRule::covers`), so DISCOVER fell THROUGH to the mode tiers and it was the blanket-closed posture there that refused it -- exactly what REQ-ACL-DISCOVER-DEFAULT-ON removed. A row-scan condition would therefore now be wrong in BOTH directions: silent on the explicit deny that still bites, loud on the blanket close that no longer does. ONE VERDICT, TWO CONSUMERS: the same predicate answers this write-time consequence and REQ-KNOCK-PRESCRIBES-FORK-PAIR, asked of one function rather than described twice -- this file already records what a second copy of an approval classifier cost. SUBJECT SHAPES ARE ANSWERED HONESTLY OR NOT AT ALL: a NODE subject is exact; a SUBNET WILDCARD is one rule with a verdict per machine, so the refused members are NAMED (with the count this node can SEE stated beside them, because a roster is this node's view and not the subnet's truth); a SENDER-ENDPOINT subject is deliberately NOT answered, since `FORK` carries no proven sender and such a rule matches no traffic at all -- its real defect is a different sentence owned by the attributability surface, and adding 'it could not resolve either' would rank a second problem above the first. A blanket rule (empty surface list) covers `DISCOVER` by definition and is never a gap; a DENY is never a gap. Gate: doc -- the CONTEXT.md entry stating the pair, the verdict-not-rows condition and the re-derivation that makes it necessary; impl -- the shared verdict function over a caller-held roster/subnet snapshot, the gap classifier, the consequence line, and the accept-site call; unit -- a FORK-only allow to a DISCOVER-denied node states the consequence, the same grant to a node that CAN resolve is silent (the earned silence), a FORK+DISCOVER grant is silent, a blanket grant is silent, a deny is silent, a subnet subject names the refused members apart from the seen count, and a sender-endpoint subject is silent by ruling rather than by accident.",
2026-08-28T09:54:46.1570702Z       "requiredStages": [
2026-08-28T09:54:46.1571065Z         "doc",
2026-08-28T09:54:46.1571375Z         "impl",
2026-08-28T09:54:46.1571690Z         "unit",
2026-08-28T09:54:46.1572005Z         "int"
2026-08-28T09:54:46.1572322Z       ],
2026-08-28T09:54:46.1572625Z       "stages": {
2026-08-28T09:54:46.1572944Z         "doc": {
2026-08-28T09:54:46.1573268Z           "complete": true,
2026-08-28T09:54:46.1573636Z           "evidence": [
2026-08-28T09:54:46.1573971Z             {
2026-08-28T09:54:46.1574305Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1574701Z               "line": 883
2026-08-28T09:54:46.1575046Z             }
2026-08-28T09:54:46.1575350Z           ]
2026-08-28T09:54:46.1575651Z         },
2026-08-28T09:54:46.1575960Z         "impl": {
2026-08-28T09:54:46.1576304Z           "complete": true,
2026-08-28T09:54:46.1576670Z           "evidence": [
2026-08-28T09:54:46.1577013Z             {
2026-08-28T09:54:46.1577362Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1577790Z               "line": 15977
2026-08-28T09:54:46.1578138Z             },
2026-08-28T09:54:46.1578444Z             {
2026-08-28T09:54:46.1578777Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1579277Z               "line": 16132
2026-08-28T09:54:46.1579630Z             },
2026-08-28T09:54:46.1579940Z             {
2026-08-28T09:54:46.1580280Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1580700Z               "line": 16159
2026-08-28T09:54:46.1581049Z             },
2026-08-28T09:54:46.1581369Z             {
2026-08-28T09:54:46.1581693Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1582111Z               "line": 16202
2026-08-28T09:54:46.1582469Z             },
2026-08-28T09:54:46.1582778Z             {
2026-08-28T09:54:46.1583224Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1583649Z               "line": 19648
2026-08-28T09:54:46.1583992Z             }
2026-08-28T09:54:46.1584288Z           ]
2026-08-28T09:54:46.1584588Z         },
2026-08-28T09:54:46.1584894Z         "int": {
2026-08-28T09:54:46.1585218Z           "complete": true,
2026-08-28T09:54:46.1585587Z           "evidence": [
2026-08-28T09:54:46.1585925Z             {
2026-08-28T09:54:46.1586287Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:46.1586735Z               "line": 919
2026-08-28T09:54:46.1587078Z             }
2026-08-28T09:54:46.1587383Z           ]
2026-08-28T09:54:46.1587679Z         },
2026-08-28T09:54:46.1587984Z         "unit": {
2026-08-28T09:54:46.1588316Z           "complete": true,
2026-08-28T09:54:46.1588717Z           "evidence": [
2026-08-28T09:54:46.1589132Z             {
2026-08-28T09:54:46.1589475Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1589899Z               "line": 35427
2026-08-28T09:54:46.1590262Z             },
2026-08-28T09:54:46.1590580Z             {
2026-08-28T09:54:46.1590922Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1591399Z               "line": 35511
2026-08-28T09:54:46.1591751Z             }
2026-08-28T09:54:46.1592061Z           ]
2026-08-28T09:54:46.1592372Z         }
2026-08-28T09:54:46.1592671Z       }
2026-08-28T09:54:46.1592981Z     },
2026-08-28T09:54:46.1593277Z     {
2026-08-28T09:54:46.1593617Z       "id": "REQ-ACL-GRANT-NODES-POLICY",
2026-08-28T09:54:46.1601202Z       "title": "ENDPOINTS_CAN_GRANT_NODES is a node-tier policy toggle, settable only via the engine-room, gating whether an ordinary endpoint may write a NODE-SUBJECT entry into its own whitelist — the widened grant a non-attributable-surface approval produces. Explicitly set it is true or false; UNSET DERIVES PER-DECISION from the effective posture of the REQUESTED SURFACE at the target node: open => endpoints may self-approve (an allow entry on an open surface punches no hole), closed => engine-room only (a node-subject allow would punch a hole in a closed posture). The gate applies in BOTH POLARITIES — adding a node allow and removing a node deny are the same widening act — and it is enforced at the STORE MUTATION SEAM rather than in any one caller, so neither the CLI nor the knock-answer path can bypass it. It is distinct from the resolution chain's node-scope TIER: per-node chain entries are engine-room-owned always, policy or no policy; this toggle governs only the SUBJECT side of self-sovereign whitelists. The engine-room is not bound by it — its bring-up gate is the authorizing ceremony. Name caveat accepted at mint: 'grant nodes' means node-SUBJECT grants, not node-tier rules. Gate: doc — the CONTEXT.md policy entry; impl — the toggle, the unset-derivation from the requested surface's effective posture, and the both-polarity check at the mutation seam; unit — explicit true and false both honored, unset derives open-permits and closed-refuses from the requested surface, removing a node deny is gated exactly as adding a node allow, and neither the CLI nor the knock-answer path can reach a widening write without passing the seam.",
2026-08-28T09:54:46.1608417Z       "requiredStages": [
2026-08-28T09:54:46.1608780Z         "doc",
2026-08-28T09:54:46.1609177Z         "impl",
2026-08-28T09:54:46.1609504Z         "unit"
2026-08-28T09:54:46.1609824Z       ],
2026-08-28T09:54:46.1610119Z       "stages": {
2026-08-28T09:54:46.1617221Z         "doc": {
2026-08-28T09:54:46.1617619Z           "complete": true,
2026-08-28T09:54:46.1618004Z           "evidence": [
2026-08-28T09:54:46.1618348Z             {
2026-08-28T09:54:46.1618729Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1619235Z               "line": 946
2026-08-28T09:54:46.1619583Z             }
2026-08-28T09:54:46.1619921Z           ]
2026-08-28T09:54:46.1620216Z         },
2026-08-28T09:54:46.1620655Z         "impl": {
2026-08-28T09:54:46.1621003Z           "complete": true,
2026-08-28T09:54:46.1621599Z           "evidence": [
2026-08-28T09:54:46.1621948Z             {
2026-08-28T09:54:46.1622332Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1622788Z               "line": 1000
2026-08-28T09:54:46.1623150Z             },
2026-08-28T09:54:46.1623460Z             {
2026-08-28T09:54:46.1623822Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1624272Z               "line": 1295
2026-08-28T09:54:46.1624634Z             },
2026-08-28T09:54:46.1624949Z             {
2026-08-28T09:54:46.1625303Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1625755Z               "line": 1838
2026-08-28T09:54:46.1626108Z             },
2026-08-28T09:54:46.1626418Z             {
2026-08-28T09:54:46.1626772Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1627214Z               "line": 1872
2026-08-28T09:54:46.1627571Z             },
2026-08-28T09:54:46.1627884Z             {
2026-08-28T09:54:46.1628245Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1628723Z               "line": 1889
2026-08-28T09:54:46.1629166Z             },
2026-08-28T09:54:46.1629481Z             {
2026-08-28T09:54:46.1629843Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1630287Z               "line": 1902
2026-08-28T09:54:46.1630648Z             },
2026-08-28T09:54:46.1630958Z             {
2026-08-28T09:54:46.1631306Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1631735Z               "line": 15827
2026-08-28T09:54:46.1632092Z             },
2026-08-28T09:54:46.1632412Z             {
2026-08-28T09:54:46.1632759Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1633191Z               "line": 19849
2026-08-28T09:54:46.1633549Z             }
2026-08-28T09:54:46.1633859Z           ]
2026-08-28T09:54:46.1634169Z         },
2026-08-28T09:54:46.1634479Z         "int": {
2026-08-28T09:54:46.1634808Z           "complete": true,
2026-08-28T09:54:46.1635180Z           "evidence": [
2026-08-28T09:54:46.1635518Z             {
2026-08-28T09:54:46.1636077Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:46.1636535Z               "line": 973
2026-08-28T09:54:46.1636883Z             }
2026-08-28T09:54:46.1637188Z           ]
2026-08-28T09:54:46.1637497Z         },
2026-08-28T09:54:46.1637807Z         "unit": {
2026-08-28T09:54:46.1638136Z           "complete": true,
2026-08-28T09:54:46.1638514Z           "evidence": [
2026-08-28T09:54:46.1638867Z             {
2026-08-28T09:54:46.1639321Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1639759Z               "line": 2393
2026-08-28T09:54:46.1640112Z             },
2026-08-28T09:54:46.1640413Z             {
2026-08-28T09:54:46.1640761Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1641213Z               "line": 2470
2026-08-28T09:54:46.1641566Z             },
2026-08-28T09:54:46.1641872Z             {
2026-08-28T09:54:46.1642228Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1642676Z               "line": 2522
2026-08-28T09:54:46.1643025Z             },
2026-08-28T09:54:46.1643333Z             {
2026-08-28T09:54:46.1643683Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1644128Z               "line": 2565
2026-08-28T09:54:46.1644481Z             },
2026-08-28T09:54:46.1644795Z             {
2026-08-28T09:54:46.1645158Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1645621Z               "line": 2599
2026-08-28T09:54:46.1645969Z             },
2026-08-28T09:54:46.1646286Z             {
2026-08-28T09:54:46.1646652Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1647095Z               "line": 3195
2026-08-28T09:54:46.1647443Z             },
2026-08-28T09:54:46.1647753Z             {
2026-08-28T09:54:46.1648250Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1648692Z               "line": 25037
2026-08-28T09:54:46.1649276Z             }
2026-08-28T09:54:46.1649595Z           ]
2026-08-28T09:54:46.1649910Z         }
2026-08-28T09:54:46.1650220Z       }
2026-08-28T09:54:46.1650516Z     },
2026-08-28T09:54:46.1650821Z     {
2026-08-28T09:54:46.1651155Z       "id": "REQ-ACL-INTRA-NODE-SELF",
2026-08-28T09:54:46.1669718Z       "title": "INTRA-NODE GOVERNANCE IS A SELF-REFERENTIAL NODE SUBJECT AT THE EXISTING TIERS, NOT A NEW TIER. Operator-rephrased 2026-08-22, superseding in full the v1 reading (a slot-3.5 rules tier with a mode twin at 6.5): #211 adds NO tier, NO Subject kind and NO schema change. A rule whose subject is THIS NODE'S OWN id governs traffic authored on this node, and it does so through machinery that already shipped. Two effects, both operator-confirmed: a NODE-SCOPE own-node rule governs intra-node actions for every endpoint hosted here, and a PER-ENDPOINT own-node rule governs incoming actions from other same-node endpoints. The third -- endpoint-targeted rules evaluate before node-targeted -- is the chain's existing order and nothing moves. THE MECHANISM AND THE CLAIM ARE DIFFERENT THINGS, AND ONLY THE MECHANISM WAS ALREADY PINNED. REQ-ACL-LOCAL-ORIGIN-TIERS stopped local traffic short-circuiting above `AccessStore::decide` and its unit cell `a_rule_naming_the_local_origin_still_governs_it` already proves a node-scope DENY naming the local origin refuses a local MSG, and that the RULE tier answered rather than a mode. THAT CELL CANNOT PROVE THIS REQUIREMENT, AND ITS OWN HELPER IS WHY: `req_local` constructs `Origin::LocalNode` DIRECTLY and carries an ARBITRARY origin string (\"beef\"), never `local_node_hex()`. So it proves the chain governs a request ALREADY classified local whose origin string a rule HAPPENS to name. This requirement's claim is a JOIN of two facts that sit on opposite sides of that helper: the local authoring path SUPPLIES THIS NODE'S OWN HEX as `origin_node` (`gate::admit_local_delivery` passes `local_node_hex()`), and therefore the string an operator actually WRITES -- their own node's key hex -- is the one that matches. MEASURED AT 2b855595: no test in the tree, unit or integration, constructs `Subject::Node { node: <own hex> }`; `er_inbound_local.rs` writes a `SubnetWildcard` DENY, which is the hole-punch negative and a different claim. The join has no unit form for the same reason REQ-ER-INBOUND-LOCK-ALL-PATHS's did: the authoring verb decides what reaches the chain, and only the real binary runs the authoring verb. RULES-ONLY, AND THE MODES KEEP ABSTAINING FOR LOCAL ORIGIN exactly as REQ-ACL-LOCAL-ORIGIN-TIERS built them -- the hole-punch property (a closed node/endpoint/subnet mode never severs the box's own agents) holds by construction, and #211's original default-deny example is expressed as a node-scope own-node DENY on MSG rather than as a posture. PRECEDENCE ABOVE THE CHAIN IS UNCHANGED AND RESTATED RATHER THAN IMPLIED: the engine room's inbound lock is step 0 and a self-referential rule never touches it (ADR-0052); a correlated local reply is admitted with no rule of its own (REQ-SEC-1), own-node deny included; and KNOCK is its own surface, so an own-node MSG deny leaves knocking to KNOCK's own evaluation. AN OWN-NODE SUBJECT CAN NEVER MATCH A REMOTE ORIGIN -- hex inequality, and the classification puts any request whose origin equals the own hex on the LocalNode arm before the chain runs. LOCAL GOVERNANCE IS IMPOSSIBLE BY CONSTRUCTION ON A NODE WITH NO IDENTITY, and that is a design property rather than a hole: `admit_local_delivery` passes `local_node_hex().unwrap_or_default()`, so an unprovisioned node hands in an EMPTY origin_node -- it still classifies LocalNode and still flows, but no rule can name a hex that does not exist. An unprovisioned node is exactly the state a first-run operator is in, so the property is asserted rather than left to be reported as a bug later. Gate: int -- the JOIN, driven through the real binary with no daemon: an ungoverned local send ADMITTED as the control on the same store, then refused under a NODE-SCOPE rule whose subject is the hex the binary itself minted, then refused again under a PER-ENDPOINT rule with the node-scope rule CLEARED so it cannot be the thing answering; each rule read back OUT OF THE STORE by match count rather than echoed from the argument, and each refusal asserted to have spooled NO row, so a slow delivery cannot pass as a refusal. Kin REQ-ACL-LOCAL-ORIGIN-TIERS (the axis this runs on, and whose synthetic-origin helper is why this evidence is owed), REQ-ACL-SUBJECT-CHAIN (the tier order it uses unchanged), REQ-ER-INBOUND-LOCK-ALL-PATHS (the admission site the local path crosses), REQ-SEC-1 (the reply exemption that outranks an own-node deny).",
2026-08-28T09:54:46.1687756Z       "requiredStages": [
2026-08-28T09:54:46.1688137Z         "doc",
2026-08-28T09:54:46.1688465Z         "impl",
2026-08-28T09:54:46.1688792Z         "unit",
2026-08-28T09:54:46.1689198Z         "int"
2026-08-28T09:54:46.1689513Z       ],
2026-08-28T09:54:46.1689822Z       "stages": {
2026-08-28T09:54:46.1690152Z         "doc": {
2026-08-28T09:54:46.1690490Z           "complete": true,
2026-08-28T09:54:46.1690871Z           "evidence": [
2026-08-28T09:54:46.1691216Z             {
2026-08-28T09:54:46.1691545Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1691954Z               "line": 872
2026-08-28T09:54:46.1692307Z             },
2026-08-28T09:54:46.1692622Z             {
2026-08-28T09:54:46.1693019Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:46.1693504Z               "line": 99
2026-08-28T09:54:46.1693852Z             }
2026-08-28T09:54:46.1694161Z           ]
2026-08-28T09:54:46.1694466Z         },
2026-08-28T09:54:46.1694781Z         "impl": {
2026-08-28T09:54:46.1695110Z           "complete": true,
2026-08-28T09:54:46.1695482Z           "evidence": [
2026-08-28T09:54:46.1695825Z             {
2026-08-28T09:54:46.1696201Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.1696667Z               "line": 345
2026-08-28T09:54:46.1697024Z             },
2026-08-28T09:54:46.1697338Z             {
2026-08-28T09:54:46.1697701Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.1698259Z               "line": 297
2026-08-28T09:54:46.1698625Z             },
2026-08-28T09:54:46.1699044Z             {
2026-08-28T09:54:46.1699385Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1699839Z               "line": 15603
2026-08-28T09:54:46.1700192Z             },
2026-08-28T09:54:46.1700506Z             {
2026-08-28T09:54:46.1700853Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1701284Z               "line": 15668
2026-08-28T09:54:46.1701640Z             },
2026-08-28T09:54:46.1701947Z             {
2026-08-28T09:54:46.1702286Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1702710Z               "line": 15858
2026-08-28T09:54:46.1703063Z             },
2026-08-28T09:54:46.1703377Z             {
2026-08-28T09:54:46.1703725Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1704155Z               "line": 19817
2026-08-28T09:54:46.1704517Z             },
2026-08-28T09:54:46.1704850Z             {
2026-08-28T09:54:46.1705190Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1705613Z               "line": 19882
2026-08-28T09:54:46.1705980Z             }
2026-08-28T09:54:46.1706290Z           ]
2026-08-28T09:54:46.1706590Z         },
2026-08-28T09:54:46.1706907Z         "int": {
2026-08-28T09:54:46.1707451Z           "complete": true,
2026-08-28T09:54:46.1707889Z           "evidence": [
2026-08-28T09:54:46.1708251Z             {
2026-08-28T09:54:46.1708637Z               "path": "crates/spt/tests/intra_node_degrade.rs",
2026-08-28T09:54:46.1709229Z               "line": 58
2026-08-28T09:54:46.1709590Z             },
2026-08-28T09:54:46.1709902Z             {
2026-08-28T09:54:46.1710265Z               "path": "crates/spt/tests/intra_node_self.rs",
2026-08-28T09:54:46.1710719Z               "line": 146
2026-08-28T09:54:46.1711080Z             }
2026-08-28T09:54:46.1711386Z           ]
2026-08-28T09:54:46.1711819Z         },
2026-08-28T09:54:46.1712128Z         "unit": {
2026-08-28T09:54:46.1712469Z           "complete": true,
2026-08-28T09:54:46.1712827Z           "evidence": [
2026-08-28T09:54:46.1713151Z             {
2026-08-28T09:54:46.1713495Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1713947Z               "line": 4758
2026-08-28T09:54:46.1714305Z             },
2026-08-28T09:54:46.1714624Z             {
2026-08-28T09:54:46.1714972Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1715415Z               "line": 4798
2026-08-28T09:54:46.1715769Z             },
2026-08-28T09:54:46.1716079Z             {
2026-08-28T09:54:46.1716432Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1716869Z               "line": 4844
2026-08-28T09:54:46.1717217Z             },
2026-08-28T09:54:46.1717524Z             {
2026-08-28T09:54:46.1717867Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1718297Z               "line": 24800
2026-08-28T09:54:46.1718651Z             },
2026-08-28T09:54:46.1719045Z             {
2026-08-28T09:54:46.1719379Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1719804Z               "line": 24888
2026-08-28T09:54:46.1720155Z             }
2026-08-28T09:54:46.1720467Z           ]
2026-08-28T09:54:46.1720763Z         }
2026-08-28T09:54:46.1721063Z       }
2026-08-28T09:54:46.1721364Z     },
2026-08-28T09:54:46.1721655Z     {
2026-08-28T09:54:46.1721983Z       "id": "REQ-ACL-LOCAL-ORIGIN-TIERS",
2026-08-28T09:54:46.1746339Z       "title": "WHERE AN INVOCATION CAME FROM IS DATA THE CHAIN REASONS ABOUT, NOT A SHORT-CIRCUIT BEFORE IT. Until releases#209 the chain's step 1 was `if local, return Allow(SameNode)`, so locally-authored traffic never reached `AccessStore::decide` at all. That was invisible while local traffic was ungated, and it is exactly what would have foreclosed the operator's intra-node governance surface (releases#211) — which under the ruled shape is NOT a new tier between the per-endpoint entries and the node tier, but SELF-REFERENTIAL Node subjects at the EXISTING tiers (v1's slot-3.5 reading withdrawn in full, operator-rephrased 2026-08-22). A tier the local path short-circuits past is not a tier. So `AccessRequest` carries an `Origin` SET AT EXACTLY ONE CONSTRUCTION SITE — the chain's own — and never re-derived per call site, because a discriminant with two derivations is one that will eventually disagree with itself. THE LOCAL VARIANT CARRIES THE ORIGIN ENDPOINT ID, not merely the fact of locality: same-node governance discriminates by SENDER at the EXISTING tier-1 `SenderEndpoint` subject, so the id has to reach `decide` as part of the origin rather than be re-derived at each call site. Dropping it at construction would cost a second plumbing pass through this very seam — and releases#215 measures precisely what re-derivation costs when it is left to call sites: three feeders hand this one parameter three different value shapes, and a tier-1 rule silently cannot match on one of them. It is carried from the first commit even though nothing consumes it yet, and it is carried in the VARIANT rather than beside it so that constructing a local origin without deciding what to put there is not expressible. Its provenance differs from the wire's and the type says so: a remote sender endpoint is DAEMON-STAMPED and session-proven, while a local one is SESSION-DETECTED in the authoring process — never the caller-supplied `from`, which an explicit `--from` owns and which would admit a forged subject (KNOWN-HAZARDS 7.5, the same reasoning that keeps `from` out of tier 1). The same-node allow is DEMOTED to the chain BOTTOM, where it always semantically belonged: nothing named this traffic, so it is the same-node operation it always was. THE FIX MUST WIDEN NOTHING, and two tiers would have widened it silently if left alone. (1) THE MODE TIERS ABSTAIN FOR A LOCAL ORIGIN. A mode is a blanket posture about who may reach this node FROM OUTSIDE it; `closed` has never in this codebase's history been asked about traffic authored on this machine, because such traffic never reached the function. Letting the modes answer now would convert every `closed` posture in the field into 'and also stop the agents on this box talking to each other' — the hole-punch failure arriving through a door nobody opened deliberately. (2) A LOCAL ORIGIN CARRIES NO SUBNETS. This node is a member of its own subnets, so handing them in would let a subnet-wildcard DENY — written to keep some peer group out — begin refusing locally-authored traffic the moment that traffic reached the chain. Only rules that NAME the local origin explicitly speak about it; everything else falls to the same-node bottom, so today's local behaviour is preserved BY CONSTRUCTION rather than by inspection. A STORE DEGRADE MUST NOT CLOSE THE NODE IN ON ITSELF: ADR-0053's fail-closed refusal protects the node from the network, and applied to local traffic it would stop the agents here talking to each other every time `access.json` was mid-write, so a local origin takes the chain bottom on a degrade. The engine room is unaffected by that arm — its lock is step 0, above all of this, and its own posture read is independently fail-closed. A NODE WITH NO IDENTITY reads as local: nothing can be proven remote either, since a wire arrival carries a handshake-proven hex by construction (REQ-HAZARD-WAN-ORIGIN-AUTH), so an empty origin can only have come from a local authoring path — and that is also the fail-open direction for the same-node hole-punch. THESE SEMANTICS ARE NOT DECIDED HERE. This requirement owes #211 a reachable slot and a carried subject, nothing more: the ORIGIN AXIS and the local sender it carries. NO NEW TIER AND NO MODE TWIN ARE OWED — the v1 shape (a slot 3.5 with a mode twin 6.5, whose twin would refuse local traffic rather than abstain) is WITHDRAWN IN FULL, operator-rephrased 2026-08-22: #211's intra-node governance is SELF-REFERENTIAL Node subjects at the EXISTING tiers, rules-only, with modes-only-abstain staying exactly as this requirement built it. The ER lock stays at step 0 regardless, because same-node governance is a rules surface and never a replacement for the ratified engine-room semantics. Gate: impl — the `Origin` axis on `AccessRequest` set at one site and carrying the local sender id, the mode-tier abstention, the empty local subnets, the demoted same-node bottom, and the local degrade arm (the v1 slot markers are NOT part of this requirement's evidence and are removed with the withdrawal above — a marker describing an unbuilt tier certifies a design, not an implementation); unit — the hole-punch negatives with a CONCRETE adversary rule in the store (a subnet-scoped DENY present, and a closed node mode present, and a local send still admitted under each), plus a remote send under the same store still refused, which is what proves the abstention did not simply disable the tiers rather than scope them. Kin REQ-ACL-SUBJECT-CHAIN (the tier order this inserts into), REQ-ER-INBOUND-LOCK-ALL-PATHS (the lane that needed the axis), REQ-SEC-1.",
2026-08-28T09:54:46.1769533Z       "requiredStages": [
2026-08-28T09:54:46.1769927Z         "impl",
2026-08-28T09:54:46.1770245Z         "unit"
2026-08-28T09:54:46.1770559Z       ],
2026-08-28T09:54:46.1770865Z       "stages": {
2026-08-28T09:54:46.1771188Z         "doc": {
2026-08-28T09:54:46.1771522Z           "complete": false,
2026-08-28T09:54:46.1771899Z           "evidence": []
2026-08-28T09:54:46.1772242Z         },
2026-08-28T09:54:46.1772546Z         "impl": {
2026-08-28T09:54:46.1772880Z           "complete": true,
2026-08-28T09:54:46.1773244Z           "evidence": [
2026-08-28T09:54:46.1773587Z             {
2026-08-28T09:54:46.1773945Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1774403Z               "line": 1124
2026-08-28T09:54:46.1774760Z             },
2026-08-28T09:54:46.1775071Z             {
2026-08-28T09:54:46.1775427Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1775883Z               "line": 1140
2026-08-28T09:54:46.1776379Z             },
2026-08-28T09:54:46.1776694Z             {
2026-08-28T09:54:46.1777046Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1777495Z               "line": 1698
2026-08-28T09:54:46.1777844Z             }
2026-08-28T09:54:46.1778144Z           ]
2026-08-28T09:54:46.1778447Z         },
2026-08-28T09:54:46.1778742Z         "int": {
2026-08-28T09:54:46.1779163Z           "complete": false,
2026-08-28T09:54:46.1779539Z           "evidence": []
2026-08-28T09:54:46.1779873Z         },
2026-08-28T09:54:46.1780173Z         "unit": {
2026-08-28T09:54:46.1780501Z           "complete": true,
2026-08-28T09:54:46.1780871Z           "evidence": [
2026-08-28T09:54:46.1781205Z             {
2026-08-28T09:54:46.1781557Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1782007Z               "line": 4650
2026-08-28T09:54:46.1782354Z             },
2026-08-28T09:54:46.1782664Z             {
2026-08-28T09:54:46.1783022Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1783468Z               "line": 4708
2026-08-28T09:54:46.1783818Z             }
2026-08-28T09:54:46.1784133Z           ]
2026-08-28T09:54:46.1784434Z         }
2026-08-28T09:54:46.1784729Z       }
2026-08-28T09:54:46.1785021Z     },
2026-08-28T09:54:46.1785325Z     {
2026-08-28T09:54:46.1786006Z       "id": "REQ-ACL-LOCAL-SUBJECT-ONE-SHAPE",
2026-08-28T09:54:46.1805107Z       "title": "EVERY LOCAL FEEDER OF THE ADMISSION GATE HANDS IT A PROVEN ENDPOINT ID OR NOTHING — ONE MEANING, ONE SPELLING (releases#215): `gate::admit_local_delivery`'s `sender` is a SUBJECT (`Subject::SenderEndpoint` matches it by equality), and its three local feeders disagreed on what they put there — `spt send` passed the session-proven bare id, `spt ring` passed `resolve_from(--from)` (where an EXPLICIT `--from` BEATS session detection), and `notify` passed `NotifRow.from_id`, the COMPOSITE `{issuer}@{node_hex}`. A tier-1 rule an operator wrote for endpoint `ling`, that the CLI accepted and the view renders, therefore covered two of three local delivery verbs and COULD NEVER MATCH ON NOTIFY: it failed in the SILENT direction. `access_check_with_sender`'s own doc already forbade exactly this (NEVER pass `WanMessage.from` here -- an explicit `--from` beats session detection in `resolve_from`, so it would admit a forged subject), as does REQ-ACL-SUBJECT-CHAIN's ratified title — the code contradicted three landed documents. NOT FILED AS A SECURITY CLAIM, deliberately: REQ-ER-INBOUND-LOCK-ALL-PATHS already publishes same-user local code as outside what any spt gate holds, so a forged-subject framing would overclaim against a boundary we published ourselves. THE REMEDY IS ONE DERIVATION SITE, NOT THREE CORRECTIONS: `session_proven_sender` is threaded IN from the CLI (`ring::ring` gains a `sender_proven` parameter in `cmd_send`'s shape) rather than re-derived inside each verb, and `cmd_notify`'s INLINE RE-SPELLING of `resolve_from`'s body — the drift mechanism that let two sites diverge with neither looking wrong on its face — is replaced by a call to it. NOTIFY PASSES `None` AND TIER 1 ABSTAINS (doyle ruling 6): the chain falls to the node tier, byte-for-byte the documented behaviour for a sender who proved nothing. Splitting the composite at `@` is REFUSED as a fix — deriving a subject from a DISPLAY string is the same defect one layer down, and `from_id` legitimately carries the composite FOR RENDERING, which a fix blaming it would break. THE SMALLER PROMISE IS RECORDED, NOT SWALLOWED: a tier-1 rule about `ling` still does not MATCH on notify — it abstains BY DESIGN — and carrying a proven-sender field on the row so it could match is tracked as a separate EVAL item, never as delivered here. THE AUTHORING-TIME REFUSAL GAINS THE OTHER HALF OF THE SAME CONFUSION (doyle ruling 5): `build_access_rule` already refuses a sender-endpoint rule on a surface carrying no proven sender (`ACCESS_DEAD_SUBJECT`, REQ-ACL-SURFACE-ATTRIBUTABILITY) — it now also refuses a COMPOSITE typed into the bare-id slot (`--endpoint ling@<node>`), which can never equal a proven bare id, in that arm's existing vocabulary. A rule that can never match must refuse at authoring time whichever half of the confusion produced it. SIDE EFFECT PINNED, NOT LEFT INCIDENTAL (doyle ruling 9): `admit_local_delivery` records the stateful-firewall reply window with `note_outbound(sender, …)` — the SAME string — so a caller-chosen id could open a reply window it never earned; one argument feeds both, so normalizing the feeders closes it BY CONSTRUCTION and a unit asserts that rather than leaving it to be re-derived. That closure is reported on the ticket carrying its own limit verbatim: its consumers were read, never measured. Gate: impl — the threaded `sender_proven` parameter + the notify `None` + the `cmd_notify` call to `resolve_from` + the composite-subject refusal; unit — the three feeders asserted TOGETHER (send and ring hand a proven bare id or None; ring's gate subject is UNCHANGED by an explicit `--from`, the arm that fails on the pre-fix spelling; notify hands None so tier 1 abstains rather than judging a display string), the composite-into-bare-slot refusal named and distinct from `ACCESS_DEAD_SUBJECT`'s surface arm, and the `note_outbound` window opening only for a proven subject.",
2026-08-28T09:54:46.1824494Z       "requiredStages": [
2026-08-28T09:54:46.1824881Z         "impl",
2026-08-28T09:54:46.1825201Z         "unit"
2026-08-28T09:54:46.1825511Z       ],
2026-08-28T09:54:46.1825814Z       "stages": {
2026-08-28T09:54:46.1826141Z         "doc": {
2026-08-28T09:54:46.1826470Z           "complete": false,
2026-08-28T09:54:46.1826847Z           "evidence": []
2026-08-28T09:54:46.1827204Z         },
2026-08-28T09:54:46.1827509Z         "impl": {
2026-08-28T09:54:46.1827838Z           "complete": true,
2026-08-28T09:54:46.1828200Z           "evidence": [
2026-08-28T09:54:46.1828540Z             {
2026-08-28T09:54:46.1828902Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:46.1829442Z               "line": 247
2026-08-28T09:54:46.1829794Z             },
2026-08-28T09:54:46.1830291Z             {
2026-08-28T09:54:46.1830650Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.1831090Z               "line": 179
2026-08-28T09:54:46.1831457Z             },
2026-08-28T09:54:46.1831767Z             {
2026-08-28T09:54:46.1832130Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.1832612Z               "line": 212
2026-08-28T09:54:46.1832960Z             },
2026-08-28T09:54:46.1833275Z             {
2026-08-28T09:54:46.1833634Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1834067Z               "line": 8900
2026-08-28T09:54:46.1834434Z             },
2026-08-28T09:54:46.1834740Z             {
2026-08-28T09:54:46.1835078Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1835498Z               "line": 11667
2026-08-28T09:54:46.1835869Z             },
2026-08-28T09:54:46.1836222Z             {
2026-08-28T09:54:46.1836558Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1836986Z               "line": 15759
2026-08-28T09:54:46.1837350Z             }
2026-08-28T09:54:46.1837665Z           ]
2026-08-28T09:54:46.1837970Z         },
2026-08-28T09:54:46.1838280Z         "int": {
2026-08-28T09:54:46.1838614Z           "complete": false,
2026-08-28T09:54:46.1839068Z           "evidence": []
2026-08-28T09:54:46.1839448Z         },
2026-08-28T09:54:46.1839754Z         "unit": {
2026-08-28T09:54:46.1840120Z           "complete": true,
2026-08-28T09:54:46.1840492Z           "evidence": [
2026-08-28T09:54:46.1840832Z             {
2026-08-28T09:54:46.1841238Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:46.1841689Z               "line": 826
2026-08-28T09:54:46.1842257Z             },
2026-08-28T09:54:46.1842786Z             {
2026-08-28T09:54:46.1843238Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.1843687Z               "line": 426
2026-08-28T09:54:46.1844038Z             },
2026-08-28T09:54:46.1844504Z             {
2026-08-28T09:54:46.1844856Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1845280Z               "line": 24720
2026-08-28T09:54:46.1845634Z             }
2026-08-28T09:54:46.1845939Z           ]
2026-08-28T09:54:46.1846293Z         }
2026-08-28T09:54:46.1846782Z       }
2026-08-28T09:54:46.1847290Z     },
2026-08-28T09:54:46.1847610Z     {
2026-08-28T09:54:46.1847939Z       "id": "REQ-ACL-LOCKED-POSTURE",
2026-08-28T09:54:46.1865268Z       "title": "The **locked** claim is one predicate, and it asks the CHAIN. `ACCESS_LOCKED` (the `revoke` arm) and the access view's `locked` field are two renderings of a single fact — this endpoint refuses ALL unsolicited remote inbound — and both take that fact from ONE predicate, `AccessStore::is_locked(endpoint)`. It is CHAIN-SCOPED by necessity, not by preference: the superseded `EndpointAcl::is_locked` was record-scoped and therefore structurally unable to answer, because an endpoint that names no posture of its own inherits one from the node mode and from captured subnet modes, neither of which a record can see; it counted node-subject allows (`allowed_nodes().is_empty()`) and never read a mode at all, so a `revoke` on a default-open endpoint told the operator their endpoint now refuses all remote inbound while the chain admitted everyone, and `--json` said `locked: true` about a store the human view correctly rendered as open in the same breath (releases#206). LOCKED MEANS, for every surface in the set: the effective posture is closed AND no ALLOW rule at endpoint-or-node scope covers it. BOTH halves are load-bearing — posture alone re-mints the same false sentence in mirror image, since rules outrank modes (tiers 1-5 above 6-8) and a closed endpoint carrying one allow row still admits somebody. Only ALLOW rows are holes (a deny row is the posture agreeing with itself), an allow qualified by origin class is still a hole because it still admits somebody, and the hole-scan reads surface coverage through the chain's OWN matching machinery rather than re-deriving what covers means — a second reading of rule semantics is precisely how the two renderings drifted apart. THE SET IS DERIVED, never enumerated: every non-default-on row of the surface table, so a later wave's surface joins the claim by the sole act of existing, and the derivation is proven against a FIXTURE table whose default-on row is not DISCOVER (with `TABLE` a const, a reader hardcoded to all-but-DISCOVER agrees with every shipped row and no test over `TABLE` can tell the two apart). DISCOVER — the one default-on row — is deliberately OUTSIDE the predicate: a blanket `closed` never GOVERNS it (releases#180), so a literal reading of the sentence would be false for every blanket-closed endpoint in the fleet and the line could never truthfully fire at all. That fact is carried BESIDE the sentence by `discover_still_open_line`, required ADJACENT IN THE SAME EMISSION wherever the locked claim prints, sibling-arm precedent: the sentence alone is the overclaim, sentence-plus-caveat is the honest composite, and the `ACCESS_LOCKED` wording itself is unchanged under this shape. The JSON view exposes the same facts from the same predicate and the same composer data, so the machine and human accounts cannot disagree. Scope of the claim is REMOTE — same-node reach and the reply exemption lie outside what the sentence asserts. Separately but in the same lane: `AccessStore::revoke` prunes a record left carrying neither rules nor modes, as `apply_mutation` already does on a Remove, because `is_vacant`'s own doc names a vacant record as the shape that must not persist — it read as restricted through the old predicate. Gate: doc — the CONTEXT.md locked-claim entry; impl — the one chain-scoped predicate, the derived surface set, the chain-machinery hole-scan, the adjacent discover caveat at every emission site, and the vacant prune in revoke; unit — a revoked default-open endpoint is not locked, a node-wide close locks an endpoint that names no posture, a closed endpoint with an allow hole is not locked while a deny row does not unlock, an origin-qualified allow still counts as a hole, a node-scope allow holes an endpoint's lock, DISCOVER stays outside the claim while a fully closed endpoint still reads locked, the surface set derives from a fixture table carrying an invented row, and revoking the last rule leaves no vacant record.",
2026-08-28T09:54:46.1882224Z       "requiredStages": [
2026-08-28T09:54:46.1882600Z         "doc",
2026-08-28T09:54:46.1882920Z         "impl",
2026-08-28T09:54:46.1883243Z         "unit"
2026-08-28T09:54:46.1883553Z       ],
2026-08-28T09:54:46.1883906Z       "stages": {
2026-08-28T09:54:46.1884235Z         "doc": {
2026-08-28T09:54:46.1884563Z           "complete": true,
2026-08-28T09:54:46.1884935Z           "evidence": [
2026-08-28T09:54:46.1885278Z             {
2026-08-28T09:54:46.1885608Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1886009Z               "line": 887
2026-08-28T09:54:46.1886365Z             }
2026-08-28T09:54:46.1886692Z           ]
2026-08-28T09:54:46.1887003Z         },
2026-08-28T09:54:46.1887317Z         "impl": {
2026-08-28T09:54:46.1887956Z           "complete": true,
2026-08-28T09:54:46.1888446Z           "evidence": [
2026-08-28T09:54:46.1917888Z             {
2026-08-28T09:54:46.1918678Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1919235Z               "line": 332
2026-08-28T09:54:46.1919608Z             },
2026-08-28T09:54:46.1919951Z             {
2026-08-28T09:54:46.1920336Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1920807Z               "line": 342
2026-08-28T09:54:46.1921153Z             },
2026-08-28T09:54:46.1921468Z             {
2026-08-28T09:54:46.1921831Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1922274Z               "line": 363
2026-08-28T09:54:46.1922616Z             },
2026-08-28T09:54:46.1922927Z             {
2026-08-28T09:54:46.1923279Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1923777Z               "line": 375
2026-08-28T09:54:46.1924474Z             },
2026-08-28T09:54:46.1924789Z             {
2026-08-28T09:54:46.1925145Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1925594Z               "line": 1798
2026-08-28T09:54:46.1925938Z             },
2026-08-28T09:54:46.1926250Z             {
2026-08-28T09:54:46.1926604Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1927033Z               "line": 1813
2026-08-28T09:54:46.1927395Z             },
2026-08-28T09:54:46.1927705Z             {
2026-08-28T09:54:46.1928058Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1928500Z               "line": 2062
2026-08-28T09:54:46.1928851Z             },
2026-08-28T09:54:46.1929243Z             {
2026-08-28T09:54:46.1929590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1930014Z               "line": 15540
2026-08-28T09:54:46.1930372Z             },
2026-08-28T09:54:46.1930701Z             {
2026-08-28T09:54:46.1931040Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1931477Z               "line": 19606
2026-08-28T09:54:46.1931834Z             }
2026-08-28T09:54:46.1932143Z           ]
2026-08-28T09:54:46.1932444Z         },
2026-08-28T09:54:46.1932749Z         "int": {
2026-08-28T09:54:46.1933087Z           "complete": false,
2026-08-28T09:54:46.1933473Z           "evidence": []
2026-08-28T09:54:46.1933806Z         },
2026-08-28T09:54:46.1934105Z         "unit": {
2026-08-28T09:54:46.1934438Z           "complete": true,
2026-08-28T09:54:46.1934800Z           "evidence": [
2026-08-28T09:54:46.1935143Z             {
2026-08-28T09:54:46.1935500Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1936006Z               "line": 4901
2026-08-28T09:54:46.1936387Z             },
2026-08-28T09:54:46.1936711Z             {
2026-08-28T09:54:46.1937068Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1937508Z               "line": 4939
2026-08-28T09:54:46.1938008Z             },
2026-08-28T09:54:46.1938328Z             {
2026-08-28T09:54:46.1938685Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1939259Z               "line": 4956
2026-08-28T09:54:46.1939611Z             },
2026-08-28T09:54:46.1939921Z             {
2026-08-28T09:54:46.1940279Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1940723Z               "line": 4974
2026-08-28T09:54:46.1941077Z             },
2026-08-28T09:54:46.1941377Z             {
2026-08-28T09:54:46.1941748Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1942197Z               "line": 4992
2026-08-28T09:54:46.1942545Z             },
2026-08-28T09:54:46.1942860Z             {
2026-08-28T09:54:46.1943223Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1943657Z               "line": 5014
2026-08-28T09:54:46.1944005Z             },
2026-08-28T09:54:46.1944315Z             {
2026-08-28T09:54:46.1944683Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1945126Z               "line": 5036
2026-08-28T09:54:46.1945479Z             },
2026-08-28T09:54:46.1945785Z             {
2026-08-28T09:54:46.1946138Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1946581Z               "line": 5061
2026-08-28T09:54:46.1946929Z             },
2026-08-28T09:54:46.1947238Z             {
2026-08-28T09:54:46.1947596Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1948039Z               "line": 5086
2026-08-28T09:54:46.1948402Z             },
2026-08-28T09:54:46.1948712Z             {
2026-08-28T09:54:46.1949245Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1949697Z               "line": 5125
2026-08-28T09:54:46.1950044Z             },
2026-08-28T09:54:46.1950354Z             {
2026-08-28T09:54:46.1950711Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1951172Z               "line": 5180
2026-08-28T09:54:46.1951516Z             },
2026-08-28T09:54:46.1951826Z             {
2026-08-28T09:54:46.1952012Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1952175Z               "line": 36158
2026-08-28T09:54:46.1952327Z             },
2026-08-28T09:54:46.1952482Z             {
2026-08-28T09:54:46.1952668Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1952829Z               "line": 36188
2026-08-28T09:54:46.1952978Z             }
2026-08-28T09:54:46.1953129Z           ]
2026-08-28T09:54:46.1953282Z         }
2026-08-28T09:54:46.1953434Z       }
2026-08-28T09:54:46.1953582Z     },
2026-08-28T09:54:46.1953730Z     {
2026-08-28T09:54:46.1953930Z       "id": "REQ-ACL-MODE-ADVISORY-GOSSIP",
2026-08-28T09:54:46.1958165Z       "title": "A subnet-mode change gossips ADVISORILY — it produces a notification and nothing else. An existing member's EFFECTIVE posture never changes remotely: the captured mode (REQ-ACL-SUBNET-MODE-CAPTURE) is immutable except through the node's own refresh (REQ-ACL-ACCESS-REFRESH-VERB), so no remote party can reach into a member node and re-posture its gate. This is the difference between a subnet owner ADVISING members of a policy change and COMMANDING their enforcement — on a shared subnet whose members are different humans, only the former is defensible, and a producer that quietly applied would be a remote write to security material. Gate: doc — the CONTEXT.md control-surface-modes advisory-gossip sentence; impl — the notif producer on subnet-mode change, with NO apply path; unit — a mode-change gossip raises the notification and leaves the receiving node's captured mode and its decisions byte-identical.",
2026-08-28T09:54:46.1958366Z       "requiredStages": [
2026-08-28T09:54:46.1958522Z         "doc",
2026-08-28T09:54:46.1958676Z         "impl",
2026-08-28T09:54:46.1958833Z         "unit"
2026-08-28T09:54:46.1959085Z       ],
2026-08-28T09:54:46.1959243Z       "stages": {
2026-08-28T09:54:46.1959400Z         "doc": {
2026-08-28T09:54:46.1959696Z           "complete": true,
2026-08-28T09:54:46.1959877Z           "evidence": [
2026-08-28T09:54:46.1960029Z             {
2026-08-28T09:54:46.1960205Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.1960361Z               "line": 879
2026-08-28T09:54:46.1960517Z             },
2026-08-28T09:54:46.1960671Z             {
2026-08-28T09:54:46.1960924Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.1961089Z               "line": 394
2026-08-28T09:54:46.1961238Z             }
2026-08-28T09:54:46.1961385Z           ]
2026-08-28T09:54:46.1961534Z         },
2026-08-28T09:54:46.1961686Z         "impl": {
2026-08-28T09:54:46.1961853Z           "complete": true,
2026-08-28T09:54:46.1962019Z           "evidence": [
2026-08-28T09:54:46.1962173Z             {
2026-08-28T09:54:46.1962381Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1962549Z               "line": 681
2026-08-28T09:54:46.1962696Z             },
2026-08-28T09:54:46.1962860Z             {
2026-08-28T09:54:46.1963072Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1963247Z               "line": 700
2026-08-28T09:54:46.1963389Z             },
2026-08-28T09:54:46.1963538Z             {
2026-08-28T09:54:46.1963742Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1963904Z               "line": 757
2026-08-28T09:54:46.1964057Z             },
2026-08-28T09:54:46.1964210Z             {
2026-08-28T09:54:46.1964425Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1964581Z               "line": 775
2026-08-28T09:54:46.1964735Z             },
2026-08-28T09:54:46.1964882Z             {
2026-08-28T09:54:46.1965106Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1965302Z               "line": 802
2026-08-28T09:54:46.1965454Z             },
2026-08-28T09:54:46.1965609Z             {
2026-08-28T09:54:46.1965827Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:46.1965994Z               "line": 586
2026-08-28T09:54:46.1966256Z             },
2026-08-28T09:54:46.1966404Z             {
2026-08-28T09:54:46.1966619Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1966776Z               "line": 150
2026-08-28T09:54:46.1966939Z             },
2026-08-28T09:54:46.1967091Z             {
2026-08-28T09:54:46.1967297Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1967453Z               "line": 172
2026-08-28T09:54:46.1967617Z             },
2026-08-28T09:54:46.1967763Z             {
2026-08-28T09:54:46.1967969Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1968135Z               "line": 385
2026-08-28T09:54:46.1968279Z             }
2026-08-28T09:54:46.1968425Z           ]
2026-08-28T09:54:46.1968578Z         },
2026-08-28T09:54:46.1968735Z         "int": {
2026-08-28T09:54:46.1968902Z           "complete": false,
2026-08-28T09:54:46.1969150Z           "evidence": []
2026-08-28T09:54:46.1969307Z         },
2026-08-28T09:54:46.1969474Z         "unit": {
2026-08-28T09:54:46.1969641Z           "complete": true,
2026-08-28T09:54:46.1969798Z           "evidence": [
2026-08-28T09:54:46.1969951Z             {
2026-08-28T09:54:46.1970162Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1970327Z               "line": 929
2026-08-28T09:54:46.1970482Z             },
2026-08-28T09:54:46.1970637Z             {
2026-08-28T09:54:46.1970855Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1971015Z               "line": 972
2026-08-28T09:54:46.1971174Z             },
2026-08-28T09:54:46.1971315Z             {
2026-08-28T09:54:46.1971526Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1971682Z               "line": 1018
2026-08-28T09:54:46.1971831Z             },
2026-08-28T09:54:46.1971978Z             {
2026-08-28T09:54:46.1972184Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1972451Z               "line": 611
2026-08-28T09:54:46.1972608Z             },
2026-08-28T09:54:46.1972762Z             {
2026-08-28T09:54:46.1972961Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.1973109Z               "line": 668
2026-08-28T09:54:46.1973256Z             }
2026-08-28T09:54:46.1973415Z           ]
2026-08-28T09:54:46.1973565Z         }
2026-08-28T09:54:46.1973718Z       }
2026-08-28T09:54:46.1973868Z     },
2026-08-28T09:54:46.1974026Z     {
2026-08-28T09:54:46.1974221Z       "id": "REQ-ACL-MUTATION-HUSK-REFUSAL",
2026-08-28T09:54:46.1988126Z       "title": "ADR-0053'S FAIL-CLOSED HAS A WRITE SIDE, AND IT IS ENFORCED AT THE SAVE SEAM RATHER THAN AT THE MUTATION CALL SITES. `load_checked` split NotFound from corrupt and the gate refused a husk correctly -- but the store is READ-MODIFY-WRITE at every path that edits it, and `AccessStore::load` is `load_checked_from(..).unwrap_or_default()`, so a degrade was swallowed into an EMPTY document. The consequence inverted the guarantee (releases#57): the gate refused unsolicited traffic, and then the first `spt endpoint access` command an operator ran to investigate the refusal saved that empty document over the damaged file -- permanent rule loss, and a posture that flipped from degraded-closed to open-with-one-rule. The boundary held exactly until someone touched the CLI, and the command most likely to be run is the one an operator reaches for BECAUSE the gate is refusing. THE SWALLOWED DEGRADE IS THEREFORE CARRIED ON THE DOCUMENT (`StoreOrigin::Degraded`, `#[serde(skip)]`, never part of the record) AND `save_to` REFUSES IT. This placement is the requirement, not an implementation detail: converting the nine production mutation call sites to `load_checked` closes the population that exists today and leaves the next read-modify-write path free to re-open the class -- the same shape of defect as REQ-SEC-REPLY-EXEMPTION-SEND-LEG's per-caller write, which shipped inert because a rule satisfied by remembering to is satisfied until someone forgets. Every write of this document funnels through `save_to`, so a refusal there binds call sites that do not exist yet, and an audit is not what holds it. The call sites ARE converted as well, for the diagnostic: a refusal at the load names the store before anything is attempted, which reads better than one raised by a save the operator already believes succeeded. FRESH IS NOT DEGRADED: a document constructed in memory -- the minted baseline, a test fixture -- stands in for nothing on disk and stays writable, so mint-on-first-absence (the split that keeps an unconfigured fleet reachable) is untouched. The refusal names the store path per ADR-0053, names the cause, and names the way out, which is real rather than rhetorical: a store the operator MOVES ASIDE is re-minted empty by the next command, so starting from empty stays available as a deliberate, loud choice -- which is precisely what silently rewriting it from empty was not. Gate: impl -- `StoreOrigin` on `AccessStore` set by the loaders (`load_from` marks the swallowed degrade, `load_checked_from` marks a parsed store `Loaded`), the `save_to` refusal in the single voice of `husk_write_refusal`, and the nine production mutation sites loading checked (cli.rs `endpoint access` allow/revoke/open + subnet-mint capture + endpoint purge, api/engineroom.rs `enforce`/node-mode/node-surface-mode, daemon pairhost.rs join-time capture); unit -- a decision table over the three origins whose expectations are WRITTEN OUT rather than derived from the code under test, asserting on-disk bytes and not merely the returned Result: a husk-derived document refuses the write and the damaged file survives BYTE-FOR-BYTE, a loaded document's read-modify-write preserves the rules it did not touch, a fresh document writes, and the refusal names the store path.",
2026-08-28T09:54:46.1988536Z       "requiredStages": [
2026-08-28T09:54:46.1988698Z         "impl",
2026-08-28T09:54:46.1988854Z         "unit"
2026-08-28T09:54:46.1989265Z       ],
2026-08-28T09:54:46.1989419Z       "stages": {
2026-08-28T09:54:46.1989588Z         "doc": {
2026-08-28T09:54:46.1989756Z           "complete": false,
2026-08-28T09:54:46.1989917Z           "evidence": []
2026-08-28T09:54:46.1990099Z         },
2026-08-28T09:54:46.1990333Z         "impl": {
2026-08-28T09:54:46.1990580Z           "complete": true,
2026-08-28T09:54:46.1990827Z           "evidence": [
2026-08-28T09:54:46.1991066Z             {
2026-08-28T09:54:46.1991399Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.1991653Z               "line": 727
2026-08-28T09:54:46.1991842Z             },
2026-08-28T09:54:46.1991994Z             {
2026-08-28T09:54:46.1992202Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1992360Z               "line": 1012
2026-08-28T09:54:46.1992513Z             },
2026-08-28T09:54:46.1992670Z             {
2026-08-28T09:54:46.1992871Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1993032Z               "line": 1082
2026-08-28T09:54:46.1993186Z             },
2026-08-28T09:54:46.1993337Z             {
2026-08-28T09:54:46.1993543Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1993709Z               "line": 1436
2026-08-28T09:54:46.1993858Z             },
2026-08-28T09:54:46.1994010Z             {
2026-08-28T09:54:46.1994206Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1994372Z               "line": 1479
2026-08-28T09:54:46.1994516Z             },
2026-08-28T09:54:46.1994671Z             {
2026-08-28T09:54:46.1994871Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.1995036Z               "line": 1606
2026-08-28T09:54:46.1995190Z             },
2026-08-28T09:54:46.1995350Z             {
2026-08-28T09:54:46.1995599Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1995762Z               "line": 553
2026-08-28T09:54:46.1996190Z             },
2026-08-28T09:54:46.1996448Z             {
2026-08-28T09:54:46.1996815Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1997484Z               "line": 572
2026-08-28T09:54:46.1997790Z             },
2026-08-28T09:54:46.1997990Z             {
2026-08-28T09:54:46.1998280Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.1998490Z               "line": 641
2026-08-28T09:54:46.1998681Z             },
2026-08-28T09:54:46.1998871Z             {
2026-08-28T09:54:46.1999396Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.1999768Z               "line": 12924
2026-08-28T09:54:46.1999979Z             },
2026-08-28T09:54:46.2000171Z             {
2026-08-28T09:54:46.2000429Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2000639Z               "line": 19701
2026-08-28T09:54:46.2000835Z             },
2026-08-28T09:54:46.2001021Z             {
2026-08-28T09:54:46.2001293Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2001494Z               "line": 19840
2026-08-28T09:54:46.2001712Z             },
2026-08-28T09:54:46.2001908Z             {
2026-08-28T09:54:46.2002142Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2002346Z               "line": 19890
2026-08-28T09:54:46.2002531Z             },
2026-08-28T09:54:46.2002733Z             {
2026-08-28T09:54:46.2002968Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2003173Z               "line": 19915
2026-08-28T09:54:46.2003363Z             },
2026-08-28T09:54:46.2003564Z             {
2026-08-28T09:54:46.2003784Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2003949Z               "line": 24097
2026-08-28T09:54:46.2004113Z             }
2026-08-28T09:54:46.2004274Z           ]
2026-08-28T09:54:46.2004442Z         },
2026-08-28T09:54:46.2004603Z         "int": {
2026-08-28T09:54:46.2004780Z           "complete": false,
2026-08-28T09:54:46.2004951Z           "evidence": []
2026-08-28T09:54:46.2005203Z         },
2026-08-28T09:54:46.2005896Z         "unit": {
2026-08-28T09:54:46.2006074Z           "complete": true,
2026-08-28T09:54:46.2006239Z           "evidence": [
2026-08-28T09:54:46.2006388Z             {
2026-08-28T09:54:46.2006603Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2006765Z               "line": 4179
2026-08-28T09:54:46.2006922Z             }
2026-08-28T09:54:46.2007070Z           ]
2026-08-28T09:54:46.2007218Z         }
2026-08-28T09:54:46.2007366Z       }
2026-08-28T09:54:46.2007508Z     },
2026-08-28T09:54:46.2007657Z     {
2026-08-28T09:54:46.2007831Z       "id": "REQ-ACL-NODE-MODE-SET",
2026-08-28T09:54:46.2012835Z       "title": "The node's control-surface modes are settable through the engine room and nowhere else (ADR-0052 decisions 1 and 3, CONTEXT.md 'control-surface modes' — the node level of the three). Modes are exactly what a confused or adversarial agent would loosen, so the mutation surface must be the one place an agent cannot reach without passing a human-held TOTP; every other candidate — a plain CLI verb, an elevation-gated verb, a config file the daemon reads — is reachable by something running as the user. Subnet-scope mode authority is separate and rides empower (REQ-SUBNET-EMPOWER-VERB); this requirement is the node's own posture, which needs no empowerment because the bring-up gate already proved subnet membership. Gate: doc — the CONTEXT.md control-surface-modes entry naming the engine room as the node-level setter; impl — node-scope mode writes reachable only through an engine-room-authenticated path; unit — an engine-room caller sets a node mode, every other caller is refused, and the resolution chain reads the written mode at its node tier.",
2026-08-28T09:54:46.2013029Z       "requiredStages": [
2026-08-28T09:54:46.2013184Z         "doc",
2026-08-28T09:54:46.2013342Z         "impl",
2026-08-28T09:54:46.2013499Z         "unit"
2026-08-28T09:54:46.2013647Z       ],
2026-08-28T09:54:46.2013851Z       "stages": {
2026-08-28T09:54:46.2014071Z         "doc": {
2026-08-28T09:54:46.2014325Z           "complete": true,
2026-08-28T09:54:46.2014558Z           "evidence": [
2026-08-28T09:54:46.2014974Z             {
2026-08-28T09:54:46.2015236Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.2015396Z               "line": 27
2026-08-28T09:54:46.2015551Z             }
2026-08-28T09:54:46.2015697Z           ]
2026-08-28T09:54:46.2015858Z         },
2026-08-28T09:54:46.2016010Z         "impl": {
2026-08-28T09:54:46.2016175Z           "complete": true,
2026-08-28T09:54:46.2016334Z           "evidence": [
2026-08-28T09:54:46.2016485Z             {
2026-08-28T09:54:46.2016691Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2016863Z               "line": 67
2026-08-28T09:54:46.2017010Z             },
2026-08-28T09:54:46.2017153Z             {
2026-08-28T09:54:46.2017363Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2017522Z               "line": 84
2026-08-28T09:54:46.2017673Z             },
2026-08-28T09:54:46.2017827Z             {
2026-08-28T09:54:46.2018045Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2018203Z               "line": 564
2026-08-28T09:54:46.2018363Z             },
2026-08-28T09:54:46.2018516Z             {
2026-08-28T09:54:46.2018703Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2018867Z               "line": 374
2026-08-28T09:54:46.2019129Z             }
2026-08-28T09:54:46.2019295Z           ]
2026-08-28T09:54:46.2019440Z         },
2026-08-28T09:54:46.2019596Z         "int": {
2026-08-28T09:54:46.2019764Z           "complete": false,
2026-08-28T09:54:46.2019934Z           "evidence": []
2026-08-28T09:54:46.2020093Z         },
2026-08-28T09:54:46.2020235Z         "unit": {
2026-08-28T09:54:46.2020408Z           "complete": true,
2026-08-28T09:54:46.2020564Z           "evidence": [
2026-08-28T09:54:46.2020718Z             {
2026-08-28T09:54:46.2020926Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2021207Z               "line": 848
2026-08-28T09:54:46.2021360Z             },
2026-08-28T09:54:46.2021512Z             {
2026-08-28T09:54:46.2021727Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2021888Z               "line": 1052
2026-08-28T09:54:46.2022042Z             },
2026-08-28T09:54:46.2022189Z             {
2026-08-28T09:54:46.2022380Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2022536Z               "line": 1212
2026-08-28T09:54:46.2022709Z             }
2026-08-28T09:54:46.2022880Z           ]
2026-08-28T09:54:46.2023034Z         }
2026-08-28T09:54:46.2023185Z       }
2026-08-28T09:54:46.2023334Z     },
2026-08-28T09:54:46.2023485Z     {
2026-08-28T09:54:46.2023656Z       "id": "REQ-ACL-NODE-VIEW",
2026-08-28T09:54:46.2027108Z       "title": "`spt daemon access` is the node-tier roster: the entities the node-scope rules name (node and subnet-wildcard subjects — a node-scope sender-endpoint rule cannot exist by schema), this machine's own mode with its per-surface exceptions, and the captured subnet modes — the tier every hosted endpoint falls through to, in the same item grammar as the per-endpoint view so the two scopes read as one system. There is NO `spt subnet access`: a subnet is a subject tier and a mode source, never a rule-holding target — its mode facts surface on `spt subnet status` (REQ-SUBNET-STATUS-MODES). Gate: doc — the CONTEXT.md access-entity entry; impl — the node roster builder and the daemon verb; unit — the node roster's entities, mode-exception summary, and explicit empty rendering.",
2026-08-28T09:54:46.2027298Z       "requiredStages": [
2026-08-28T09:54:46.2027447Z         "doc",
2026-08-28T09:54:46.2027608Z         "impl",
2026-08-28T09:54:46.2027752Z         "unit"
2026-08-28T09:54:46.2027904Z       ],
2026-08-28T09:54:46.2028062Z       "stages": {
2026-08-28T09:54:46.2028213Z         "doc": {
2026-08-28T09:54:46.2028382Z           "complete": true,
2026-08-28T09:54:46.2028538Z           "evidence": [
2026-08-28T09:54:46.2028701Z             {
2026-08-28T09:54:46.2029104Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2029283Z               "line": 874
2026-08-28T09:54:46.2029447Z             },
2026-08-28T09:54:46.2029597Z             {
2026-08-28T09:54:46.2029846Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:46.2030005Z               "line": 3
2026-08-28T09:54:46.2030161Z             }
2026-08-28T09:54:46.2030314Z           ]
2026-08-28T09:54:46.2030466Z         },
2026-08-28T09:54:46.2030619Z         "impl": {
2026-08-28T09:54:46.2030785Z           "complete": true,
2026-08-28T09:54:46.2030944Z           "evidence": [
2026-08-28T09:54:46.2031100Z             {
2026-08-28T09:54:46.2031302Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2031463Z               "line": 208
2026-08-28T09:54:46.2031617Z             },
2026-08-28T09:54:46.2031776Z             {
2026-08-28T09:54:46.2031963Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2032128Z               "line": 20150
2026-08-28T09:54:46.2032287Z             }
2026-08-28T09:54:46.2032434Z           ]
2026-08-28T09:54:46.2032587Z         },
2026-08-28T09:54:46.2032744Z         "int": {
2026-08-28T09:54:46.2032907Z           "complete": false,
2026-08-28T09:54:46.2033073Z           "evidence": []
2026-08-28T09:54:46.2033217Z         },
2026-08-28T09:54:46.2033374Z         "unit": {
2026-08-28T09:54:46.2033532Z           "complete": true,
2026-08-28T09:54:46.2033693Z           "evidence": [
2026-08-28T09:54:46.2033851Z             {
2026-08-28T09:54:46.2034054Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2034221Z               "line": 476
2026-08-28T09:54:46.2034371Z             },
2026-08-28T09:54:46.2034525Z             {
2026-08-28T09:54:46.2034700Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2034864Z               "line": 31093
2026-08-28T09:54:46.2035010Z             }
2026-08-28T09:54:46.2035164Z           ]
2026-08-28T09:54:46.2035517Z         }
2026-08-28T09:54:46.2035716Z       }
2026-08-28T09:54:46.2035878Z     },
2026-08-28T09:54:46.2036179Z     {
2026-08-28T09:54:46.2036385Z       "id": "REQ-ACL-ORIGIN-QUALIFIER",
2026-08-28T09:54:46.2045982Z       "title": "An access rule may carry an ORIGIN QUALIFIER (any|user|agent) restricting it to invocations of that origin class, so a rule can say 'the humans on node A, not its agents' and let that node's agents fall through to the mode. TWO TYPES, NOT ONE (doyle-ruled design): the RULE side is a three-valued qualifier defaulting to `any` for N-1 records; the REQUEST side is a TOTAL two-valued class (user|agent) with no unknown arm, because `any` is a rule-side value that no classifier ever emits — a single three-valued type would let a classifier return `any`, which is meaningless. Classification is ambient and ceremony-free, performed by the SENDING daemon over the existing local-origin predicate (interactive terminal with no perch/broker ancestry => user; agent-session ancestry => agent) and carried to the receiving gate as a daemon-stamped sibling of the sender-endpoint stamp — the same shape of fact, so the same seam, never a parallel path. ABSENT OR UNCLASSIFIABLE MAPS TO agent AT THE RECEIVING BOUNDARY: the restrictive class, so a `user` rule never admits an unknown and N-1 senders land safe automatically without a compat flag. Honest limit, stated and never to be inflated: this is the honest member daemon's report — sound against agents on honest nodes (ancestry cannot be env-scrubbed away), NOT against a malicious node, and a detached process spawned outside an agent's session tree can launder to `user`. Defense-in-depth, not proof; a forged origin stamp sits at the same trust tier as a forged sender stamp and never elevates the subject chain. The `user-proven` TOTP-minted pid-linked token is FORWARD DESIGN and must not be built. Gate: doc — the CONTEXT.md origin-qualifier entry plus the amended wire-module identity-field doc carrying origin's forgery blast radius; impl — the two types, the rule field with its serde default, the request field, the chain's qualifier check, and the sending-daemon stamp; unit — the qualifier matches its own class and abstains on the other, `any` matches both, an absent request-side stamp evaluates as agent, an N-1 rule record with no qualifier decodes as `any`, and the wire field is additive in both directions exactly as the sender stamp is.",
2026-08-28T09:54:46.2046486Z       "requiredStages": [
2026-08-28T09:54:46.2046739Z         "doc",
2026-08-28T09:54:46.2046974Z         "impl",
2026-08-28T09:54:46.2047125Z         "unit"
2026-08-28T09:54:46.2047284Z       ],
2026-08-28T09:54:46.2047443Z       "stages": {
2026-08-28T09:54:46.2047596Z         "doc": {
2026-08-28T09:54:46.2047765Z           "complete": true,
2026-08-28T09:54:46.2047914Z           "evidence": [
2026-08-28T09:54:46.2048071Z             {
2026-08-28T09:54:46.2048238Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2048404Z               "line": 951
2026-08-28T09:54:46.2048562Z             }
2026-08-28T09:54:46.2048719Z           ]
2026-08-28T09:54:46.2048882Z         },
2026-08-28T09:54:46.2049134Z         "impl": {
2026-08-28T09:54:46.2049305Z           "complete": true,
2026-08-28T09:54:46.2049468Z           "evidence": [
2026-08-28T09:54:46.2049616Z             {
2026-08-28T09:54:46.2049817Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.2049977Z               "line": 904
2026-08-28T09:54:46.2050125Z             },
2026-08-28T09:54:46.2050280Z             {
2026-08-28T09:54:46.2050490Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:46.2050647Z               "line": 136
2026-08-28T09:54:46.2050795Z             },
2026-08-28T09:54:46.2050943Z             {
2026-08-28T09:54:46.2051144Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2051304Z               "line": 551
2026-08-28T09:54:46.2051458Z             },
2026-08-28T09:54:46.2051605Z             {
2026-08-28T09:54:46.2051943Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2052112Z               "line": 573
2026-08-28T09:54:46.2052263Z             },
2026-08-28T09:54:46.2052417Z             {
2026-08-28T09:54:46.2052616Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2052775Z               "line": 583
2026-08-28T09:54:46.2052925Z             },
2026-08-28T09:54:46.2053078Z             {
2026-08-28T09:54:46.2053277Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2053431Z               "line": 597
2026-08-28T09:54:46.2053583Z             },
2026-08-28T09:54:46.2053731Z             {
2026-08-28T09:54:46.2053931Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2054089Z               "line": 612
2026-08-28T09:54:46.2054245Z             },
2026-08-28T09:54:46.2054399Z             {
2026-08-28T09:54:46.2054600Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2054760Z               "line": 674
2026-08-28T09:54:46.2054914Z             },
2026-08-28T09:54:46.2055075Z             {
2026-08-28T09:54:46.2055270Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2055435Z               "line": 1117
2026-08-28T09:54:46.2055582Z             },
2026-08-28T09:54:46.2055740Z             {
2026-08-28T09:54:46.2055936Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2056097Z               "line": 2202
2026-08-28T09:54:46.2056246Z             },
2026-08-28T09:54:46.2056388Z             {
2026-08-28T09:54:46.2056594Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2056750Z               "line": 113
2026-08-28T09:54:46.2056904Z             },
2026-08-28T09:54:46.2057051Z             {
2026-08-28T09:54:46.2057247Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.2057404Z               "line": 219
2026-08-28T09:54:46.2057557Z             },
2026-08-28T09:54:46.2057719Z             {
2026-08-28T09:54:46.2057905Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2058189Z               "line": 10907
2026-08-28T09:54:46.2058340Z             },
2026-08-28T09:54:46.2058497Z             {
2026-08-28T09:54:46.2058678Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2058837Z               "line": 17764
2026-08-28T09:54:46.2059074Z             },
2026-08-28T09:54:46.2059247Z             {
2026-08-28T09:54:46.2059475Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.2059632Z               "line": 464
2026-08-28T09:54:46.2059786Z             }
2026-08-28T09:54:46.2059933Z           ]
2026-08-28T09:54:46.2060086Z         },
2026-08-28T09:54:46.2060232Z         "int": {
2026-08-28T09:54:46.2060410Z           "complete": false,
2026-08-28T09:54:46.2060575Z           "evidence": []
2026-08-28T09:54:46.2060723Z         },
2026-08-28T09:54:46.2060883Z         "unit": {
2026-08-28T09:54:46.2061045Z           "complete": true,
2026-08-28T09:54:46.2061216Z           "evidence": [
2026-08-28T09:54:46.2061370Z             {
2026-08-28T09:54:46.2061578Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.2061742Z               "line": 764
2026-08-28T09:54:46.2061898Z             },
2026-08-28T09:54:46.2062052Z             {
2026-08-28T09:54:46.2062256Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:46.2062418Z               "line": 346
2026-08-28T09:54:46.2062566Z             },
2026-08-28T09:54:46.2062724Z             {
2026-08-28T09:54:46.2062920Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2063085Z               "line": 3409
2026-08-28T09:54:46.2063235Z             },
2026-08-28T09:54:46.2063391Z             {
2026-08-28T09:54:46.2063595Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2063747Z               "line": 3424
2026-08-28T09:54:46.2063905Z             },
2026-08-28T09:54:46.2064053Z             {
2026-08-28T09:54:46.2064259Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2064539Z               "line": 3447
2026-08-28T09:54:46.2064706Z             },
2026-08-28T09:54:46.2064854Z             {
2026-08-28T09:54:46.2065049Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2065213Z               "line": 3486
2026-08-28T09:54:46.2065364Z             },
2026-08-28T09:54:46.2065513Z             {
2026-08-28T09:54:46.2065711Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2065869Z               "line": 3547
2026-08-28T09:54:46.2066462Z             },
2026-08-28T09:54:46.2066614Z             {
2026-08-28T09:54:46.2066821Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2067221Z               "line": 24577
2026-08-28T09:54:46.2067497Z             }
2026-08-28T09:54:46.2067664Z           ]
2026-08-28T09:54:46.2067864Z         }
2026-08-28T09:54:46.2068051Z       }
2026-08-28T09:54:46.2068236Z     },
2026-08-28T09:54:46.2068414Z     {
2026-08-28T09:54:46.2068702Z       "id": "REQ-ACL-POSITIONAL-ALLOW-HONORS-FLAGS",
2026-08-28T09:54:46.2086165Z       "title": "`access allow`'s POSITIONAL SPELLING REACHES THE SAME MUTATION SEAM ITS FLAG SPELLING DOES -- it is a shorthand for the rule, never a second, ungated way to write one. The v1 arm matched `node: Some(..)` and swallowed every other flag in a `..`, then called `AccessStore::allow` directly, and that cost three things at once, all three RUNTIME-MEASURED before the fix (releases#185; the filing was read-derived and named only the first). (1) `--surfaces MSG` WAS DROPPED, and an empty surface list means EVERY surface -- so the store took a rule strictly WIDER than the operator typed, exit 0, no diagnostic on either stream. The direction matters and was checked rather than assumed: the `is_empty => set_all(Mode::Closed)` at the tail of `allow_surfaces` reads `acl.modes`, the POSTURE table, and has nothing to do with the surfaces argument, so this falls as an over-grant and not as a silent close. (2) `--origin user` WAS DROPPED THE SAME WAY: a rule the operator restricted to one caller class matched both. (3) CALLING `allow` DIRECTLY WALKED AROUND `apply_mutation`, AND WITH IT BOTH THE `--admit-node` ACKNOWLEDGMENT AND THE GRANT-NODES POLICY -- the gravest of the three and the one no reading of the issue predicted. Measured as a three-arm differential under ONE authority (an owner agent, which requires a real perch record and not merely the env var): the flag spelling REFUSED the unacknowledged grant, the same flag spelling with `--admit-node` was accepted, and the positional spelling then wrote the WIDER rule for that same agent at exit 0. A gate a respelling steps around is not a gate, and the respelling was two words shorter than the gated one. THE FIX IS THE SEAM, NOT THE FLAGS: the arm builds its rule through the shared `build_access_rule` -- so the two spellings cannot drift into two parsers -- and applies it through `apply_mutation` with the invocation's real authority, which is what makes the acknowledgment and the policy bind here by construction rather than by a second copy of them. WHAT STAYS v1 IS THE POSTURE: this spelling RESTRICTS the endpoint (closes its blanket mode when it sets none yet), the seam is deliberately posture-blind, so the close is re-applied explicitly through one shared body (`restrict_if_unset`) that `allow_surfaces` also calls. `iff unset` is load-bearing -- an endpoint that already names a posture has been configured, and admitting one more node must never overwrite that. Whether the FLAG spelling should close a posture too is releases#196 and is deliberately NOT decided here; preserving this arm's close is a non-regression, not a new opinion. THE CONSEQUENCE IS ACCEPTED AND DECLARED (doyle, 2026-08-18): an owner agent running the bare positional spelling is now REFUSED without `--admit-node`, which is the gate working as designed and what the flag spelling already demanded; a same-node user is untouched, since the acknowledgment binds the owner-agent authority alone. Gate: impl -- the arm destructuring its flags instead of discarding them, the shared builder, the `apply_mutation` route carrying `admit_node` and the real authority, and `restrict_if_unset` as the single body of the posture-close; unit -- a decision table whose expectations are WRITTEN OUT AS LITERALS rather than derived from the code under test: the typed surface list lands on the persisted rule and an untyped one still means every surface, an origin qualifier survives, the unacknowledged owner-agent grant is REFUSED THROUGH THIS ARM while the same-node user's is not (the bypass, pinned as a refusal rather than as an audit), the refusal leaves the store BYTE-UNCHANGED, and the posture-close still happens for the positional arm while an endpoint that already names a posture keeps it; int -- THE JOIN, which is where this defect actually lived: the real binary, a real store on disk, the operator's typed list read back off the persisted RULE, with an untyped arm beside it (the empty list is a legitimate spelling and must survive the fix) and the unacknowledged owner-agent refusal paired with the same grant acknowledged, so the flag is the only difference between the two.",
2026-08-28T09:54:46.2086681Z       "requiredStages": [
2026-08-28T09:54:46.2086827Z         "impl",
2026-08-28T09:54:46.2086974Z         "unit",
2026-08-28T09:54:46.2087124Z         "int"
2026-08-28T09:54:46.2087272Z       ],
2026-08-28T09:54:46.2087425Z       "stages": {
2026-08-28T09:54:46.2087568Z         "doc": {
2026-08-28T09:54:46.2087731Z           "complete": false,
2026-08-28T09:54:46.2087946Z           "evidence": []
2026-08-28T09:54:46.2088092Z         },
2026-08-28T09:54:46.2088256Z         "impl": {
2026-08-28T09:54:46.2088416Z           "complete": true,
2026-08-28T09:54:46.2088580Z           "evidence": [
2026-08-28T09:54:46.2088731Z             {
2026-08-28T09:54:46.2088928Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2089147Z               "line": 15798
2026-08-28T09:54:46.2089308Z             },
2026-08-28T09:54:46.2089452Z             {
2026-08-28T09:54:46.2089651Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2089922Z               "line": 19805
2026-08-28T09:54:46.2095165Z             }
2026-08-28T09:54:46.2095443Z           ]
2026-08-28T09:54:46.2095691Z         },
2026-08-28T09:54:46.2095963Z         "int": {
2026-08-28T09:54:46.2096253Z           "complete": true,
2026-08-28T09:54:46.2096525Z           "evidence": [
2026-08-28T09:54:46.2096777Z             {
2026-08-28T09:54:46.2097232Z               "path": "crates/spt/tests/access_positional_allow_e2e.rs",
2026-08-28T09:54:46.2097492Z               "line": 77
2026-08-28T09:54:46.2097746Z             }
2026-08-28T09:54:46.2098004Z           ]
2026-08-28T09:54:46.2098262Z         },
2026-08-28T09:54:46.2098544Z         "unit": {
2026-08-28T09:54:46.2098840Z           "complete": true,
2026-08-28T09:54:46.2099192Z           "evidence": [
2026-08-28T09:54:46.2099502Z             {
2026-08-28T09:54:46.2099850Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2100123Z               "line": 4051
2026-08-28T09:54:46.2100387Z             },
2026-08-28T09:54:46.2100642Z             {
2026-08-28T09:54:46.2100952Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2101224Z               "line": 24933
2026-08-28T09:54:46.2101478Z             },
2026-08-28T09:54:46.2101744Z             {
2026-08-28T09:54:46.2102050Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2102312Z               "line": 25036
2026-08-28T09:54:46.2102574Z             }
2026-08-28T09:54:46.2102826Z           ]
2026-08-28T09:54:46.2103081Z         }
2026-08-28T09:54:46.2103324Z       }
2026-08-28T09:54:46.2103576Z     },
2026-08-28T09:54:46.2103824Z     {
2026-08-28T09:54:46.2104167Z       "id": "REQ-ACL-PRECISE-ALLOW-WRITE-CONTRACT",
2026-08-28T09:54:46.2125145Z       "title": "THE PRECISE `access allow` IS A RULE VERB; THE POSITIONAL ONE IS A RULE+POSTURE VERB -- and the precise arm therefore says so at write time rather than leaving the operator to discover it. releases#196 asked whether the flag spelling should also close an endpoint's posture on its first rule (the v1 semantic `restrict_if_unset` carries, which the positional arm re-applies explicitly). RULED HORN B (doyle 2026-08-21, on a census read at b88fab2a): default-open-until-explicit-close IS the shipped T6 semantic, the mutation seam stays POSTURE-BLIND, and what was missing was never the close -- it was any signal that a rule written onto an unrestricted endpoint changes no verdict. TWO STRUCTURAL FACTS DECIDE THIS RATHER THAN A PREFERENCE. (1) A CLOSE CANNOT LIVE AT THE SEAM: `tuple_mutation` is shared by the endpoint precise arms AND the engine room's node-wide seat including its per-endpoint `--for` form, and below it `apply_mutation` is also the seam for knock-answer, redeem and the knock store -- so a close in `apply_mutation` would fire on every approved knock and every redeem, and a close in `tuple_mutation` would have the engine room closing another endpoint's posture as a side effect of writing one rule for it, while being meaningless for `MutationScope::Node` (`restrict_if_unset` is per-endpoint by construction). A posture close is a CLI-ARM opinion either way; it is not, and cannot be, a property of the seam. (2) THE CODEBASE ALREADY RULES THE INERTNESS IN BINDING GATE CODE: `may_grant_node_subject` derives the unset grant-nodes policy from `effective_posture` with the premise stated in its own comment -- open implies permitted, because an allow entry on an open surface punches no hole. Closing the posture inside the very command that policy gates would falsify that premise one statement later, so horn A would have owed a re-ruling of the grant-nodes policy and was never the one-line change it reads as. WHAT THE NOTICE IS. On an operator-driven precise allow, and BEFORE the write, the chain is ASKED -- `decide()` per covered surface, per admitted origin class, at every concrete origin there is to ask about -- and if it already allowed that subject everywhere, the acceptance is followed by a sentence saying the rule stands and changes no verdict today, naming the lever that would make it bite. NEVER A REFUSAL: pre-positioning a rule before a later close is legitimate and common, and a verb that refused it would be wrong more often than the silence it replaced. ASKED, NEVER RE-DERIVED: the condition is the chain's own verdict and not a scan of rule rows, the doctrine `node_still_sees_endpoint` and `fork_without_discover` already carry -- a row scan would miss a per-surface close, count a row naming a different subject, and become a second definition of a verdict the store owns. AN ABSENCE IS NEVER A VERDICT: a subnet subject with no roster members, and a sender-endpoint subject that resolves to no machine this node knows, have NO origin to put the question to, so they get a NAMED ABSENCE saying the question was not answered -- never the word inert, which would render a missing measurement as a finding. A subnet subject with members is inert only if EVERY member reads inert. THE FIRING POPULATION IS DECLARED AND PINNED, not left to placement: operator-driven precise ALLOW upserts on an endpoint scope, and nothing else -- the engine room's `--for` seat is excluded by the seat flag the caller already passes, removals and denies are excluded by op and decision, and knock-answer and redeem never reach this body at all. NO NOTICE ON DENY THIS LANE (doyle, ruled): deny is the fail-closed direction, an inert deny pre-positions defense at zero cost, and the narrowed-deny shape is un-censused. POSTURE-NEUTRALITY IS PART OF THE CONTRACT AND IS PINNED AS SUCH: the precise arm leaves `modes` exactly as it found them, which was true at b88fab2a and untested in either direction -- a ruling no test can falsify is a ruling that survives its own reversal. Gate: impl -- the population predicate, the chain-asked probe over resolved origins and its named-absence arm, the notice line naming the lever, and the call site before the write inside the precise arm; unit -- a decision table whose expectations are WRITTEN OUT AS LITERALS rather than derived from the predicate under test: an allow onto an unrestricted endpoint reads inert, the SAME allow shadowing a node-scope deny reads NOT inert (the hole-punch negative control -- the case the notice must stay silent on), a rule whose surfaces are only partly refused reads not inert, an empty subnet reads NAMED ABSENCE and never inert, a subnet whose members split reads not inert, and the population predicate admits the operator's precise allow while refusing the daemon seat, the removal and the deny; int -- the real binary against a real store: a precise allow leaves the endpoint's posture EMPTY (the literal partition, not a value read back from the code under test) and prints the notice, the positional spelling beside it still closes the posture and prints NO notice, and the NEGATIVE POPULATION PIN -- a rule written through the knock-approval path prints no notice at all.",
2026-08-28T09:54:46.2125732Z       "requiredStages": [
2026-08-28T09:54:46.2125884Z         "impl",
2026-08-28T09:54:46.2126057Z         "unit",
2026-08-28T09:54:46.2126208Z         "int"
2026-08-28T09:54:46.2126362Z       ],
2026-08-28T09:54:46.2126523Z       "stages": {
2026-08-28T09:54:46.2126677Z         "doc": {
2026-08-28T09:54:46.2126846Z           "complete": false,
2026-08-28T09:54:46.2127004Z           "evidence": []
2026-08-28T09:54:46.2127156Z         },
2026-08-28T09:54:46.2127310Z         "impl": {
2026-08-28T09:54:46.2127480Z           "complete": true,
2026-08-28T09:54:46.2127657Z           "evidence": [
2026-08-28T09:54:46.2127809Z             {
2026-08-28T09:54:46.2128005Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2128166Z               "line": 15904
2026-08-28T09:54:46.2128324Z             },
2026-08-28T09:54:46.2128472Z             {
2026-08-28T09:54:46.2128667Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2128830Z               "line": 15948
2026-08-28T09:54:46.2129072Z             },
2026-08-28T09:54:46.2129243Z             {
2026-08-28T09:54:46.2129431Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2129713Z               "line": 16241
2026-08-28T09:54:46.2129862Z             },
2026-08-28T09:54:46.2130013Z             {
2026-08-28T09:54:46.2130195Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2130362Z               "line": 16257
2026-08-28T09:54:46.2130515Z             },
2026-08-28T09:54:46.2130671Z             {
2026-08-28T09:54:46.2130853Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2131015Z               "line": 16277
2026-08-28T09:54:46.2131168Z             },
2026-08-28T09:54:46.2131315Z             {
2026-08-28T09:54:46.2131507Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2131668Z               "line": 16292
2026-08-28T09:54:46.2131822Z             },
2026-08-28T09:54:46.2131972Z             {
2026-08-28T09:54:46.2132157Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2132322Z               "line": 16307
2026-08-28T09:54:46.2132467Z             },
2026-08-28T09:54:46.2132627Z             {
2026-08-28T09:54:46.2132814Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2132981Z               "line": 16350
2026-08-28T09:54:46.2133129Z             },
2026-08-28T09:54:46.2133286Z             {
2026-08-28T09:54:46.2133468Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2133630Z               "line": 16442
2026-08-28T09:54:46.2133777Z             },
2026-08-28T09:54:46.2133930Z             {
2026-08-28T09:54:46.2134116Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2134274Z               "line": 16458
2026-08-28T09:54:46.2134435Z             },
2026-08-28T09:54:46.2134586Z             {
2026-08-28T09:54:46.2134771Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2134933Z               "line": 16491
2026-08-28T09:54:46.2135081Z             }
2026-08-28T09:54:46.2135237Z           ]
2026-08-28T09:54:46.2135386Z         },
2026-08-28T09:54:46.2135543Z         "int": {
2026-08-28T09:54:46.2135838Z           "complete": true,
2026-08-28T09:54:46.2135997Z           "evidence": [
2026-08-28T09:54:46.2136153Z             {
2026-08-28T09:54:46.2136416Z               "path": "crates/spt/tests/access_precise_allow_e2e.rs",
2026-08-28T09:54:46.2136579Z               "line": 69
2026-08-28T09:54:46.2136731Z             }
2026-08-28T09:54:46.2136884Z           ]
2026-08-28T09:54:46.2137035Z         },
2026-08-28T09:54:46.2137189Z         "unit": {
2026-08-28T09:54:46.2137354Z           "complete": true,
2026-08-28T09:54:46.2137521Z           "evidence": [
2026-08-28T09:54:46.2137669Z             {
2026-08-28T09:54:46.2137860Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2138021Z               "line": 35598
2026-08-28T09:54:46.2138175Z             },
2026-08-28T09:54:46.2138336Z             {
2026-08-28T09:54:46.2138518Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2138688Z               "line": 35667
2026-08-28T09:54:46.2138838Z             },
2026-08-28T09:54:46.2139095Z             {
2026-08-28T09:54:46.2139290Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2139458Z               "line": 35811
2026-08-28T09:54:46.2139613Z             }
2026-08-28T09:54:46.2139766Z           ]
2026-08-28T09:54:46.2139916Z         }
2026-08-28T09:54:46.2140063Z       }
2026-08-28T09:54:46.2140221Z     },
2026-08-28T09:54:46.2140374Z     {
2026-08-28T09:54:46.2140555Z       "id": "REQ-ACL-RC-VIEW-SPLIT",
2026-08-28T09:54:46.2145345Z       "title": "Watching an endpoint's terminal and DRIVING it are separately grantable: attach gates on the request's AttachIntent — Viewer -> RC_VIEW, Control/Take -> RC_ATTACH. Before this, one access_check(endpoint, origin, Unsolicited) covered every attach intent, so admitting a node to view an endpoint necessarily admitted it to take the keyboard (and, with Take, to displace an incumbent controller). On a shared subnet that is the difference between showing a colleague's agent what happened and letting their agent drive yours. The split is keyed on the intent the REQUEST carries, evaluated at the serve side under the handshake-proven origin — never on anything the attaching side can restate after the gate. Kin: ADR-0042 (rc-attach truth) and REQ-ACL-SURFACE-VOCAB, which mints the two ids. Gate: doc — the CONTEXT.md control-surface entry naming RC_VIEW and RC_ATTACH as distinct v1 surfaces; impl — the attach_surface mapping and attach.rs gating through it; unit — the mapping over all three intents plus a decision table proving an RC_VIEW grant does not admit RC_ATTACH.",
2026-08-28T09:54:46.2145655Z       "requiredStages": [
2026-08-28T09:54:46.2145817Z         "doc",
2026-08-28T09:54:46.2145975Z         "impl",
2026-08-28T09:54:46.2146127Z         "unit"
2026-08-28T09:54:46.2146280Z       ],
2026-08-28T09:54:46.2146432Z       "stages": {
2026-08-28T09:54:46.2146585Z         "doc": {
2026-08-28T09:54:46.2146742Z           "complete": true,
2026-08-28T09:54:46.2146904Z           "evidence": [
2026-08-28T09:54:46.2147057Z             {
2026-08-28T09:54:46.2147238Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2147411Z               "line": 868
2026-08-28T09:54:46.2147562Z             }
2026-08-28T09:54:46.2147716Z           ]
2026-08-28T09:54:46.2147867Z         },
2026-08-28T09:54:46.2148023Z         "impl": {
2026-08-28T09:54:46.2148187Z           "complete": true,
2026-08-28T09:54:46.2148352Z           "evidence": [
2026-08-28T09:54:46.2148496Z             {
2026-08-28T09:54:46.2148711Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.2148878Z               "line": 56
2026-08-28T09:54:46.2149121Z             }
2026-08-28T09:54:46.2149273Z           ]
2026-08-28T09:54:46.2149431Z         },
2026-08-28T09:54:46.2149587Z         "int": {
2026-08-28T09:54:46.2149751Z           "complete": false,
2026-08-28T09:54:46.2149917Z           "evidence": []
2026-08-28T09:54:46.2150065Z         },
2026-08-28T09:54:46.2150225Z         "unit": {
2026-08-28T09:54:46.2150392Z           "complete": true,
2026-08-28T09:54:46.2150657Z           "evidence": [
2026-08-28T09:54:46.2150819Z             {
2026-08-28T09:54:46.2151030Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.2151196Z               "line": 1009
2026-08-28T09:54:46.2151344Z             }
2026-08-28T09:54:46.2151515Z           ]
2026-08-28T09:54:46.2151687Z         }
2026-08-28T09:54:46.2151854Z       }
2026-08-28T09:54:46.2152002Z     },
2026-08-28T09:54:46.2152154Z     {
2026-08-28T09:54:46.2152335Z       "id": "REQ-ACL-RULE-MUTATION",
2026-08-28T09:54:46.2162595Z       "title": "Access rule mutation and revocation are TUPLE-SHAPED, never id-shaped: a removal restates the subject, surfaces and origin qualifier rather than naming a generated rule id, which makes it idempotent and script-safe and removes rule-id bookkeeping from the model entirely (tuples ARE the identity). Every entry records its PROVENANCE — knock-approve, code-redeem, or manual — and the access drill-down view prints the exact removal command beside each rule together with that provenance, so revocation is copy-paste from the view that showed it. Entries born of knocks or codes have no special lifecycle after birth. Authority is threefold: the owner endpoint's agent (narrowing mutations always free, widening node-subject mutations in either polarity gated by the grant-nodes policy); same-node users always (node-sovereign, the emergency lever against a bad agent grant — there is no remote rule mutation of any kind, the remote-human path is to rc into the node); and the engine-room, which may edit node-tier entries, modes AND endpoint-scope entries across the node as the node's admin command center for access. That engine-room rule-EDITING authority supersedes the earlier 'engine-room owns modes only' clause; knock-ANSWER routing is unchanged — endpoint-target knocks still land with, and are answered by, the target endpoint. Every mutation path loads the store through the FAIL-CLOSED reader: a degraded store refuses the mutation loudly, leaves the store bytes byte-identical, and — where the mutation was a knock answer — leaves the knock PENDING rather than consuming it, because a refused write must never burn a single-use answer. Gate: doc — the CONTEXT.md rule-mutation entry and the CLI reference; impl — the tuple-matching removal primitive, the provenance field, the view's per-rule removal command, and the fail-closed load on every mutation path; unit — a tuple removal is idempotent and removes only the matching tuple, provenance survives a round-trip and renders in the view, the printed removal command actually removes the rule it was printed beside, a narrowing mutation needs no acknowledgment while a widening one does, and a mutation against a degraded store refuses loudly with the file bytes unchanged and any answering knock still pending.",
2026-08-28T09:54:46.2162928Z       "requiredStages": [],
2026-08-28T09:54:46.2163083Z       "stages": {
2026-08-28T09:54:46.2163253Z         "doc": {
2026-08-28T09:54:46.2163426Z           "complete": false,
2026-08-28T09:54:46.2163596Z           "evidence": []
2026-08-28T09:54:46.2163758Z         },
2026-08-28T09:54:46.2163908Z         "impl": {
2026-08-28T09:54:46.2164075Z           "complete": true,
2026-08-28T09:54:46.2164232Z           "evidence": [
2026-08-28T09:54:46.2164385Z             {
2026-08-28T09:54:46.2164589Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2164753Z               "line": 632
2026-08-28T09:54:46.2164928Z             },
2026-08-28T09:54:46.2165091Z             {
2026-08-28T09:54:46.2165300Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2165462Z               "line": 682
2026-08-28T09:54:46.2165620Z             },
2026-08-28T09:54:46.2165772Z             {
2026-08-28T09:54:46.2165978Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2166134Z               "line": 720
2026-08-28T09:54:46.2166295Z             },
2026-08-28T09:54:46.2166446Z             {
2026-08-28T09:54:46.2166647Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2166918Z               "line": 1201
2026-08-28T09:54:46.2167081Z             },
2026-08-28T09:54:46.2167228Z             {
2026-08-28T09:54:46.2167419Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2167587Z               "line": 1227
2026-08-28T09:54:46.2167738Z             },
2026-08-28T09:54:46.2167891Z             {
2026-08-28T09:54:46.2168115Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2168311Z               "line": 1255
2026-08-28T09:54:46.2168463Z             },
2026-08-28T09:54:46.2168612Z             {
2026-08-28T09:54:46.2168812Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2169077Z               "line": 1323
2026-08-28T09:54:46.2169550Z             },
2026-08-28T09:54:46.2169812Z             {
2026-08-28T09:54:46.2170098Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2170298Z               "line": 1890
2026-08-28T09:54:46.2170490Z             },
2026-08-28T09:54:46.2170679Z             {
2026-08-28T09:54:46.2171075Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2171403Z               "line": 1943
2026-08-28T09:54:46.2171701Z             },
2026-08-28T09:54:46.2171982Z             {
2026-08-28T09:54:46.2172282Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2172545Z               "line": 117
2026-08-28T09:54:46.2172746Z             },
2026-08-28T09:54:46.2172926Z             {
2026-08-28T09:54:46.2173189Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2173385Z               "line": 122
2026-08-28T09:54:46.2173575Z             },
2026-08-28T09:54:46.2173757Z             {
2026-08-28T09:54:46.2174015Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2174246Z               "line": 458
2026-08-28T09:54:46.2174525Z             },
2026-08-28T09:54:46.2174741Z             {
2026-08-28T09:54:46.2174979Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2175202Z               "line": 15559
2026-08-28T09:54:46.2175599Z             },
2026-08-28T09:54:46.2175784Z             {
2026-08-28T09:54:46.2176018Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2176219Z               "line": 15688
2026-08-28T09:54:46.2176409Z             },
2026-08-28T09:54:46.2176587Z             {
2026-08-28T09:54:46.2176817Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2177011Z               "line": 15826
2026-08-28T09:54:46.2177202Z             },
2026-08-28T09:54:46.2177383Z             {
2026-08-28T09:54:46.2177607Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2177803Z               "line": 16516
2026-08-28T09:54:46.2177984Z             },
2026-08-28T09:54:46.2178171Z             {
2026-08-28T09:54:46.2178398Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2178594Z               "line": 17936
2026-08-28T09:54:46.2178776Z             },
2026-08-28T09:54:46.2179086Z             {
2026-08-28T09:54:46.2179324Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2179533Z               "line": 19457
2026-08-28T09:54:46.2179728Z             }
2026-08-28T09:54:46.2179904Z           ]
2026-08-28T09:54:46.2180096Z         },
2026-08-28T09:54:46.2180281Z         "int": {
2026-08-28T09:54:46.2180487Z           "complete": false,
2026-08-28T09:54:46.2180682Z           "evidence": []
2026-08-28T09:54:46.2180868Z         },
2026-08-28T09:54:46.2181050Z         "unit": {
2026-08-28T09:54:46.2181263Z           "complete": true,
2026-08-28T09:54:46.2181450Z           "evidence": [
2026-08-28T09:54:46.2181621Z             {
2026-08-28T09:54:46.2181882Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2182072Z               "line": 2659
2026-08-28T09:54:46.2182266Z             },
2026-08-28T09:54:46.2182452Z             {
2026-08-28T09:54:46.2182706Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2183034Z               "line": 2715
2026-08-28T09:54:46.2183225Z             },
2026-08-28T09:54:46.2183420Z             {
2026-08-28T09:54:46.2183668Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2183868Z               "line": 2840
2026-08-28T09:54:46.2184049Z             },
2026-08-28T09:54:46.2184203Z             {
2026-08-28T09:54:46.2184397Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2184561Z               "line": 2860
2026-08-28T09:54:46.2184721Z             },
2026-08-28T09:54:46.2184874Z             {
2026-08-28T09:54:46.2185071Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2185320Z               "line": 2909
2026-08-28T09:54:46.2185496Z             },
2026-08-28T09:54:46.2185635Z             {
2026-08-28T09:54:46.2185849Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2186015Z               "line": 832
2026-08-28T09:54:46.2186164Z             },
2026-08-28T09:54:46.2186312Z             {
2026-08-28T09:54:46.2186512Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2186682Z               "line": 24627
2026-08-28T09:54:46.2186827Z             },
2026-08-28T09:54:46.2186983Z             {
2026-08-28T09:54:46.2187161Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2187321Z               "line": 24764
2026-08-28T09:54:46.2187469Z             },
2026-08-28T09:54:46.2187628Z             {
2026-08-28T09:54:46.2187810Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2187967Z               "line": 25089
2026-08-28T09:54:46.2188116Z             },
2026-08-28T09:54:46.2188267Z             {
2026-08-28T09:54:46.2188449Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2188601Z               "line": 31103
2026-08-28T09:54:46.2188755Z             }
2026-08-28T09:54:46.2188901Z           ]
2026-08-28T09:54:46.2189154Z         }
2026-08-28T09:54:46.2189332Z       }
2026-08-28T09:54:46.2189478Z     },
2026-08-28T09:54:46.2189637Z     {
2026-08-28T09:54:46.2189807Z       "id": "REQ-ACL-SUBJECT-CHAIN",
2026-08-28T09:54:46.2205827Z       "title": "One FIRST-MATCH-WINS subject chain decides every access question, with an implicit-open bottom that preserves current fleet behavior. Order: per-endpoint sender-endpoint rule -> per-endpoint node rule -> per-endpoint subnet-wildcard rule -> node-scope node rule -> node-scope subnet-wildcard rule -> endpoint mode for the surface -> node mode for the surface -> join-time-captured subnet mode for the surface -> (nothing matched) OPEN. The stateful-firewall reply exemption and the same-node loopback Allow PRECEDE the chain and are not tiers — a degraded or locked-down node keeps its own conversations alive. Modes are the per-surface default posture for unlisted subjects (open/closed), settable at endpoint and node scope; the captured-subnet-mode table ships as a SCHEMA STUB in W1 (W2's join capture populates it — absent means the chain bottoms out open). Store schema v2 carries subject-kind entries at both scopes, migrates every v1 AccessEntry.nodes row into an equivalent (endpoint mode closed + one all-surface node Allow per listed node, so a listed node keeps access and an unlisted one loses it exactly as before), and DROPS the inert users field with the no-user-identity ruling (a shared subnet's trust unit is the node as human-proxy; 'user' is deliberately not a security identity). TIER 1 IS SCHEMA-REAL BUT INERT IN W1 (doyle ruling 2026-07-29, on todlando's pre-build finding): the design-of-record premise 'sender identity is daemon-stamped and nodes are trusted' is FALSE of its first clause today. The only wire record carrying a sender endpoint is WanMessage.from, which KNOWN-HAZARDS 7.5 (REQ-HAZARD-WAN-ORIGIN-AUTH) binds verbatim as reply-routing metadata 'never an authorization subject' — and it is caller-supplied (spt send --from; cli.rs resolve_from lets the explicit arg win over session detection), so keying a rule on it would admit a FORGED subject, the exact failure 7.5 exists to prevent. Precedent already ruled in-tree: REQ-MSG-5's classify_local_origin faces the same question and answers it with the session-proven perch id, noting '--from alone never confers an agent identity'. Independently, five of the six gate families (attach, xfer, rest, shell-link, digest) carry no sender endpoint on the wire in any form. So the kind persists, matches, and round-trips, but every W1 call site supplies None. Lighting it up needs an authenticated daemon-stamped sender field — a NEW additive field, never a repurposing of from — which is its own wave and its own REQ. Gate: doc — the CONTEXT.md endpoint-access-whitelist entry, whose false daemon-stamped premise this change corrects in the same diff, plus the control-surface-modes entry carrying the chain; impl — spt_store::access schema v2 (Subject/AccessRule/Modes/EndpointAcl/NodeAcl/CapturedSubnetModes), AccessStore::decide, the v1 migration, and the daemon gate threading origin subnet membership in; unit — the chain proven tier by tier (each tier decides only when every tier above abstains, bottom is open), the v1 verbs' polarity (allow restricts, revoke narrows without widening, open is the only widening), v1->v2 migration semantics, v2 round-trip of every construct, and TWO inertness guards — a store-level one proving the kind matches when fed and abstains when not, and a gate-level one proving no call site feeds it (that guard goes red on purpose if a later change threads a sender identity into the gate).",
2026-08-28T09:54:46.2206487Z       "requiredStages": [
2026-08-28T09:54:46.2206688Z         "doc",
2026-08-28T09:54:46.2206877Z         "impl",
2026-08-28T09:54:46.2207031Z         "unit"
2026-08-28T09:54:46.2207178Z       ],
2026-08-28T09:54:46.2207332Z       "stages": {
2026-08-28T09:54:46.2207479Z         "doc": {
2026-08-28T09:54:46.2207646Z           "complete": true,
2026-08-28T09:54:46.2207813Z           "evidence": [
2026-08-28T09:54:46.2207966Z             {
2026-08-28T09:54:46.2208137Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2208305Z               "line": 879
2026-08-28T09:54:46.2208451Z             }
2026-08-28T09:54:46.2208734Z           ]
2026-08-28T09:54:46.2208892Z         },
2026-08-28T09:54:46.2209154Z         "impl": {
2026-08-28T09:54:46.2209322Z           "complete": true,
2026-08-28T09:54:46.2209478Z           "evidence": [
2026-08-28T09:54:46.2209636Z             {
2026-08-28T09:54:46.2209846Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2210013Z               "line": 486
2026-08-28T09:54:46.2210156Z             },
2026-08-28T09:54:46.2210308Z             {
2026-08-28T09:54:46.2210519Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2210684Z               "line": 505
2026-08-28T09:54:46.2210843Z             },
2026-08-28T09:54:46.2210999Z             {
2026-08-28T09:54:46.2211205Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2211365Z               "line": 872
2026-08-28T09:54:46.2211529Z             },
2026-08-28T09:54:46.2211680Z             {
2026-08-28T09:54:46.2211886Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2212058Z               "line": 1564
2026-08-28T09:54:46.2212215Z             },
2026-08-28T09:54:46.2212372Z             {
2026-08-28T09:54:46.2212562Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2212730Z               "line": 1640
2026-08-28T09:54:46.2212887Z             },
2026-08-28T09:54:46.2213040Z             {
2026-08-28T09:54:46.2213234Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2213394Z               "line": 1993
2026-08-28T09:54:46.2213544Z             },
2026-08-28T09:54:46.2213696Z             {
2026-08-28T09:54:46.2213899Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2214057Z               "line": 2039
2026-08-28T09:54:46.2214209Z             },
2026-08-28T09:54:46.2214357Z             {
2026-08-28T09:54:46.2214556Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2214823Z               "line": 2061
2026-08-28T09:54:46.2214978Z             },
2026-08-28T09:54:46.2215129Z             {
2026-08-28T09:54:46.2215330Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2215491Z               "line": 2080
2026-08-28T09:54:46.2215636Z             },
2026-08-28T09:54:46.2215787Z             {
2026-08-28T09:54:46.2215978Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.2216140Z               "line": 166
2026-08-28T09:54:46.2216284Z             },
2026-08-28T09:54:46.2216439Z             {
2026-08-28T09:54:46.2216634Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.2216794Z               "line": 177
2026-08-28T09:54:46.2216943Z             },
2026-08-28T09:54:46.2217090Z             {
2026-08-28T09:54:46.2217286Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.2217442Z               "line": 192
2026-08-28T09:54:46.2217591Z             },
2026-08-28T09:54:46.2217734Z             {
2026-08-28T09:54:46.2217944Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.2218111Z               "line": 218
2026-08-28T09:54:46.2218258Z             }
2026-08-28T09:54:46.2218411Z           ]
2026-08-28T09:54:46.2218587Z         },
2026-08-28T09:54:46.2218741Z         "int": {
2026-08-28T09:54:46.2218907Z           "complete": false,
2026-08-28T09:54:46.2219154Z           "evidence": []
2026-08-28T09:54:46.2219295Z         },
2026-08-28T09:54:46.2219448Z         "unit": {
2026-08-28T09:54:46.2219647Z           "complete": true,
2026-08-28T09:54:46.2219872Z           "evidence": [
2026-08-28T09:54:46.2220096Z             {
2026-08-28T09:54:46.2220411Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.2220634Z               "line": 689
2026-08-28T09:54:46.2220892Z             },
2026-08-28T09:54:46.2221116Z             {
2026-08-28T09:54:46.2221422Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.2221671Z               "line": 1384
2026-08-28T09:54:46.2221921Z             },
2026-08-28T09:54:46.2222375Z             {
2026-08-28T09:54:46.2222699Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2222937Z               "line": 3640
2026-08-28T09:54:46.2223194Z             },
2026-08-28T09:54:46.2223399Z             {
2026-08-28T09:54:46.2223639Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2223881Z               "line": 3797
2026-08-28T09:54:46.2224113Z             },
2026-08-28T09:54:46.2224378Z             {
2026-08-28T09:54:46.2224679Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2224951Z               "line": 3889
2026-08-28T09:54:46.2225194Z             },
2026-08-28T09:54:46.2225417Z             {
2026-08-28T09:54:46.2225727Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2225976Z               "line": 4013
2026-08-28T09:54:46.2226124Z             },
2026-08-28T09:54:46.2226285Z             {
2026-08-28T09:54:46.2226511Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2226676Z               "line": 4303
2026-08-28T09:54:46.2226914Z             },
2026-08-28T09:54:46.2227162Z             {
2026-08-28T09:54:46.2227489Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2227746Z               "line": 4357
2026-08-28T09:54:46.2227974Z             }
2026-08-28T09:54:46.2228213Z           ]
2026-08-28T09:54:46.2228424Z         }
2026-08-28T09:54:46.2228580Z       }
2026-08-28T09:54:46.2228725Z     },
2026-08-28T09:54:46.2228885Z     {
2026-08-28T09:54:46.2229200Z       "id": "REQ-ACL-SUBNET-MODE-CAPTURE",
2026-08-28T09:54:46.2259890Z       "title": "A subnet's control-surface mode is recorded on the subnet and CAPTURED AT JOIN TIME into the joining node's own store — the W1 captured-subnet-mode table stops being a stub and lights up tier 8, the chain's bottom fallback (CONTEXT.md 'control-surface modes' resolution order). Capture, not lookup, is the point: a node's effective posture must be a local, immutable fact it consented to when it joined, so a subnet owner cannot retroactively tighten or loosen what an already-joined member enforces (that is what makes the advisory-gossip posture in REQ-ACL-MODE-ADVISORY-GOSSIP coherent rather than a race). Migration posture is explicit and must be tested: an EXISTING subnet has no captured mode, so tier 8 stays absent, the chain bottoms out open, and fleet behavior is preserved exactly — an upgrade must not silently close a running mesh. Gate: doc — the CONTEXT.md control-surface-modes entry (three levels and the resolution chain); impl — the subnet-mode record, the join-time capture into the endpoint access store, and tier 8 reading it; unit — a joined-with-closed node refuses where an unlisted subject falls through to tier 8, a joined-with-open node admits, and a pre-existing subnet with no capture bottoms open.",
2026-08-28T09:54:46.2260308Z       "requiredStages": [
2026-08-28T09:54:46.2260471Z         "doc",
2026-08-28T09:54:46.2260633Z         "impl",
2026-08-28T09:54:46.2260786Z         "unit"
2026-08-28T09:54:46.2260947Z       ],
2026-08-28T09:54:46.2261101Z       "stages": {
2026-08-28T09:54:46.2261247Z         "doc": {
2026-08-28T09:54:46.2261418Z           "complete": true,
2026-08-28T09:54:46.2261578Z           "evidence": [
2026-08-28T09:54:46.2261727Z             {
2026-08-28T09:54:46.2261902Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2262060Z               "line": 879
2026-08-28T09:54:46.2262212Z             }
2026-08-28T09:54:46.2262361Z           ]
2026-08-28T09:54:46.2262512Z         },
2026-08-28T09:54:46.2262661Z         "impl": {
2026-08-28T09:54:46.2262827Z           "complete": true,
2026-08-28T09:54:46.2262981Z           "evidence": [
2026-08-28T09:54:46.2263132Z             {
2026-08-28T09:54:46.2263357Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.2263514Z               "line": 410
2026-08-28T09:54:46.2263672Z             },
2026-08-28T09:54:46.2263819Z             {
2026-08-28T09:54:46.2264043Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.2264320Z               "line": 700
2026-08-28T09:54:46.2264476Z             },
2026-08-28T09:54:46.2264620Z             {
2026-08-28T09:54:46.2264844Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:46.2265006Z               "line": 287
2026-08-28T09:54:46.2265154Z             },
2026-08-28T09:54:46.2265301Z             {
2026-08-28T09:54:46.2265512Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:46.2265673Z               "line": 572
2026-08-28T09:54:46.2265822Z             },
2026-08-28T09:54:46.2265973Z             {
2026-08-28T09:54:46.2266264Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:46.2266502Z               "line": 691
2026-08-28T09:54:46.2266737Z             },
2026-08-28T09:54:46.2266952Z             {
2026-08-28T09:54:46.2267196Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:46.2267362Z               "line": 834
2026-08-28T09:54:46.2267525Z             },
2026-08-28T09:54:46.2267676Z             {
2026-08-28T09:54:46.2267882Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2268049Z               "line": 2156
2026-08-28T09:54:46.2268197Z             },
2026-08-28T09:54:46.2268350Z             {
2026-08-28T09:54:46.2268545Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2268704Z               "line": 2176
2026-08-28T09:54:46.2268850Z             },
2026-08-28T09:54:46.2269146Z             {
2026-08-28T09:54:46.2269340Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.2269500Z               "line": 338
2026-08-28T09:54:46.2269662Z             }
2026-08-28T09:54:46.2269810Z           ]
2026-08-28T09:54:46.2269962Z         },
2026-08-28T09:54:46.2270116Z         "int": {
2026-08-28T09:54:46.2270282Z           "complete": false,
2026-08-28T09:54:46.2270445Z           "evidence": []
2026-08-28T09:54:46.2270730Z         },
2026-08-28T09:54:46.2270892Z         "unit": {
2026-08-28T09:54:46.2271055Z           "complete": true,
2026-08-28T09:54:46.2271222Z           "evidence": [
2026-08-28T09:54:46.2271370Z             {
2026-08-28T09:54:46.2271585Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.2271741Z               "line": 929
2026-08-28T09:54:46.2271893Z             },
2026-08-28T09:54:46.2272039Z             {
2026-08-28T09:54:46.2272262Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:46.2272419Z               "line": 1816
2026-08-28T09:54:46.2272583Z             },
2026-08-28T09:54:46.2272734Z             {
2026-08-28T09:54:46.2272930Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2273096Z               "line": 3757
2026-08-28T09:54:46.2273245Z             },
2026-08-28T09:54:46.2273397Z             {
2026-08-28T09:54:46.2273593Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.2273760Z               "line": 930
2026-08-28T09:54:46.2273908Z             }
2026-08-28T09:54:46.2274065Z           ]
2026-08-28T09:54:46.2274218Z         }
2026-08-28T09:54:46.2274365Z       }
2026-08-28T09:54:46.2274524Z     },
2026-08-28T09:54:46.2274669Z     {
2026-08-28T09:54:46.2274865Z       "id": "REQ-ACL-SURFACE-ATTRIBUTABILITY",
2026-08-28T09:54:46.2281691Z       "title": "Whether a control surface's inbound carries a PROVEN sender endpoint is single-sourced per-surface metadata, never a hardcoded MSG-vs-rest split. Attributability decides which SUBJECT TIER a grant for that surface can actually bind: attributable => a sender-endpoint subject can match (today MSG, via the W2b daemon stamp); non-attributable => only node-tier subjects are real, and a sender-endpoint entry on such a surface is dead on arrival — it can never match, so writing one is a silent no-op the CLI must refuse rather than persist. The single-source form is a per-surface table carrying the flag beside the id, with the v1 id list DERIVED from that table and exactly one reader answering the question; a second site that re-derives 'MSG or not' is the drift class this requirement exists to prevent (a property matched at one site and built at another). The payoff is automatic: when a surface's records grow their own sender stamp (XFER is the expected next), flipping one row makes it attributable and it exits every restriction keyed on this property with no re-ruling and no second edit. Gate: doc — the CONTEXT.md sender-attributability entry; impl — the per-surface table with the derived id list and the single is_attributable reader; unit — the derived list matches the table exactly, MSG reads attributable and a non-stamped surface does not, and flipping one row's flag moves that surface across every attributability-keyed decision without touching another site.",
2026-08-28T09:54:46.2282035Z       "requiredStages": [
2026-08-28T09:54:46.2282188Z         "doc",
2026-08-28T09:54:46.2282343Z         "impl",
2026-08-28T09:54:46.2282496Z         "unit"
2026-08-28T09:54:46.2282651Z       ],
2026-08-28T09:54:46.2282808Z       "stages": {
2026-08-28T09:54:46.2282966Z         "doc": {
2026-08-28T09:54:46.2283128Z           "complete": true,
2026-08-28T09:54:46.2283290Z           "evidence": [
2026-08-28T09:54:46.2283434Z             {
2026-08-28T09:54:46.2283600Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2283762Z               "line": 941
2026-08-28T09:54:46.2283910Z             }
2026-08-28T09:54:46.2284058Z           ]
2026-08-28T09:54:46.2284205Z         },
2026-08-28T09:54:46.2284358Z         "impl": {
2026-08-28T09:54:46.2284524Z           "complete": true,
2026-08-28T09:54:46.2284678Z           "evidence": [
2026-08-28T09:54:46.2284834Z             {
2026-08-28T09:54:46.2285036Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2285196Z               "line": 158
2026-08-28T09:54:46.2285339Z             },
2026-08-28T09:54:46.2285497Z             {
2026-08-28T09:54:46.2285692Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2285969Z               "line": 205
2026-08-28T09:54:46.2286127Z             },
2026-08-28T09:54:46.2286269Z             {
2026-08-28T09:54:46.2286470Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2286627Z               "line": 231
2026-08-28T09:54:46.2286784Z             },
2026-08-28T09:54:46.2286928Z             {
2026-08-28T09:54:46.2287132Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2287286Z               "line": 267
2026-08-28T09:54:46.2287441Z             },
2026-08-28T09:54:46.2287598Z             {
2026-08-28T09:54:46.2287787Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2287949Z               "line": 284
2026-08-28T09:54:46.2288096Z             },
2026-08-28T09:54:46.2288254Z             {
2026-08-28T09:54:46.2288435Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2288603Z               "line": 15738
2026-08-28T09:54:46.2288744Z             }
2026-08-28T09:54:46.2288894Z           ]
2026-08-28T09:54:46.2289165Z         },
2026-08-28T09:54:46.2289322Z         "int": {
2026-08-28T09:54:46.2289490Z           "complete": false,
2026-08-28T09:54:46.2289646Z           "evidence": []
2026-08-28T09:54:46.2289795Z         },
2026-08-28T09:54:46.2289946Z         "unit": {
2026-08-28T09:54:46.2290120Z           "complete": true,
2026-08-28T09:54:46.2290280Z           "evidence": [
2026-08-28T09:54:46.2290432Z             {
2026-08-28T09:54:46.2290630Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2290787Z               "line": 2943
2026-08-28T09:54:46.2290940Z             },
2026-08-28T09:54:46.2291088Z             {
2026-08-28T09:54:46.2291287Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2291446Z               "line": 2956
2026-08-28T09:54:46.2291602Z             },
2026-08-28T09:54:46.2291756Z             {
2026-08-28T09:54:46.2291955Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2292123Z               "line": 2981
2026-08-28T09:54:46.2292391Z             },
2026-08-28T09:54:46.2292546Z             {
2026-08-28T09:54:46.2292739Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2292903Z               "line": 3383
2026-08-28T09:54:46.2293051Z             },
2026-08-28T09:54:46.2293206Z             {
2026-08-28T09:54:46.2293392Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2293554Z               "line": 24672
2026-08-28T09:54:46.2293707Z             }
2026-08-28T09:54:46.2293854Z           ]
2026-08-28T09:54:46.2294008Z         }
2026-08-28T09:54:46.2294155Z       }
2026-08-28T09:54:46.2294309Z     },
2026-08-28T09:54:46.2294455Z     {
2026-08-28T09:54:46.2294647Z       "id": "REQ-ACL-SURFACE-DESCRIPTION",
2026-08-28T09:54:46.2303383Z       "title": "Every control surface carries its operator-language DESCRIPTION as a third column of the same single-source surface table that already carries its id and its attributability, and each description states that surface's SUBJECT CONSEQUENCE rather than merely naming the traffic: an attributable surface says a grant binds the single proven sender ('MSG — direct messages (a grant binds the single sender)'), a non-attributable one says a grant admits the whole machine, and STOPS THERE: the remedy stays sited with the flag that owns it (the --admit-node help on knock approve and on endpoint access allow|deny|remove, plus the store's write-time refusal), because a second remedy spelling in a section that renders at a dozen sites is a drift pair — and would be outright FALSE at daemon access, a seat that acknowledgment does not bind ('XFER — file transfer (a grant admits the whole machine)'). Consequence, not category, is the load-bearing half: an operator choosing surfaces is choosing WHO gets admitted, and a description that omits that is decoration. The text is composed into every rendering AT RENDER TIME from the table, never restated at a display site, so the vocabulary a human reads and the vocabulary the gate enforces cannot drift apart and A NEW SURFACE APPEARS IN THE RENDERED HELP BY THE SOLE ACT OF EXISTING IN THE TABLE — that property is the point of the requirement and is proven directly rather than inferred from the shipped rows, which are uniform in it. Gate: doc — the CONTEXT.md surface-vocabulary entry carrying the consequence rule; impl — the description column beside the id and attributability flag, plus the one composer every renderer calls; unit — a fixture table carrying an INVENTED row renders that row with no edit to any display site, an attributable and a non-attributable row render their differing subject consequences, and the composed text is byte-derived from the table rather than matched against a second literal.",
2026-08-28T09:54:46.2303724Z       "requiredStages": [
2026-08-28T09:54:46.2303890Z         "doc",
2026-08-28T09:54:46.2304043Z         "impl",
2026-08-28T09:54:46.2304191Z         "unit"
2026-08-28T09:54:46.2304339Z       ],
2026-08-28T09:54:46.2304505Z       "stages": {
2026-08-28T09:54:46.2304654Z         "doc": {
2026-08-28T09:54:46.2304825Z           "complete": true,
2026-08-28T09:54:46.2304982Z           "evidence": [
2026-08-28T09:54:46.2305135Z             {
2026-08-28T09:54:46.2305306Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2305464Z               "line": 868
2026-08-28T09:54:46.2305616Z             }
2026-08-28T09:54:46.2305764Z           ]
2026-08-28T09:54:46.2305926Z         },
2026-08-28T09:54:46.2306074Z         "impl": {
2026-08-28T09:54:46.2306241Z           "complete": true,
2026-08-28T09:54:46.2306402Z           "evidence": [
2026-08-28T09:54:46.2306551Z             {
2026-08-28T09:54:46.2306759Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2306913Z               "line": 168
2026-08-28T09:54:46.2307065Z             },
2026-08-28T09:54:46.2307213Z             {
2026-08-28T09:54:46.2307423Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2307590Z               "line": 402
2026-08-28T09:54:46.2307738Z             },
2026-08-28T09:54:46.2308004Z             {
2026-08-28T09:54:46.2308209Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2308367Z               "line": 417
2026-08-28T09:54:46.2308514Z             },
2026-08-28T09:54:46.2308665Z             {
2026-08-28T09:54:46.2308860Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2309142Z               "line": 444
2026-08-28T09:54:46.2309293Z             },
2026-08-28T09:54:46.2309446Z             {
2026-08-28T09:54:46.2309641Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2309799Z               "line": 475
2026-08-28T09:54:46.2309951Z             }
2026-08-28T09:54:46.2310099Z           ]
2026-08-28T09:54:46.2310252Z         },
2026-08-28T09:54:46.2310400Z         "int": {
2026-08-28T09:54:46.2310566Z           "complete": false,
2026-08-28T09:54:46.2310729Z           "evidence": []
2026-08-28T09:54:46.2310876Z         },
2026-08-28T09:54:46.2311034Z         "unit": {
2026-08-28T09:54:46.2311206Z           "complete": true,
2026-08-28T09:54:46.2311368Z           "evidence": [
2026-08-28T09:54:46.2311519Z             {
2026-08-28T09:54:46.2311727Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2311879Z               "line": 3285
2026-08-28T09:54:46.2312037Z             },
2026-08-28T09:54:46.2312183Z             {
2026-08-28T09:54:46.2316674Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2316877Z               "line": 3318
2026-08-28T09:54:46.2317039Z             },
2026-08-28T09:54:46.2317196Z             {
2026-08-28T09:54:46.2317406Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2317577Z               "line": 3356
2026-08-28T09:54:46.2317721Z             }
2026-08-28T09:54:46.2317873Z           ]
2026-08-28T09:54:46.2318022Z         }
2026-08-28T09:54:46.2318173Z       }
2026-08-28T09:54:46.2318322Z     },
2026-08-28T09:54:46.2318618Z     {
2026-08-28T09:54:46.2318817Z       "id": "REQ-ACL-SURFACE-MODE-VERB",
2026-08-28T09:54:46.2332663Z       "title": "A NODE CAN CLOSE ONE SURFACE FROM ITS OWN ENGINE ROOM: `spt api access-node-surface-mode <SURFACE> <open|closed|unset> <id>` writes the NODE TIER's `per_surface` entry for exactly one control surface, and it is the ONLY off-switch a node owner has for a default-on surface. It exists because REQ-ACL-DISCOVER-DEFAULT-ON took the blanket posture out of a default-on surface's reach: after that change `access-node-mode closed` no longer closes DISCOVER, so the milestone's own promise -- a node owner who wants DISCOVER disabled can do so from their node's engine room -- is satisfied by this verb or by nothing (doyle 2026-08-17: shipping the carve-out without the off-switch is a greenlit-form deviation, and building it is the smaller act). THE NARROW TWIN, NOT A NEW AUTHORITY: it passes the SAME shared engine-room gate as `access-node-mode` (`api::engineroom::gate`, ADR-0052 decisions 5 and 6 -- one function, every engine-room verb through it, deliberately stated without a count) and needs NO empowerment, for the identical reason the blanket verb needs none: a node's own posture is its own business and the bring-up gate already proved membership. It lives in the `spt api` family rather than the rule-mutation family because that is where the gate, the auth proof and the ER capability vocabulary already are. NODE TIER ONLY: the endpoint tier's lever remains a deny row that names the surface, per-subject, until the concierge modernization mints its own form. THREE STATES, NOT TWO: `unset` REMOVES the entry, which is not a spelling of `open` -- an explicit open PINS the surface open against any later change of the vocabulary's default, so a two-state verb would make closing a default-on surface a one-way door whose only exit is a pin the writer never meant to author; the removal folds case for the reason every releases#66 reader does, since an entry stored as `discover` is the one that GOVERNS and a clear that missed it would report 'nothing was set'. THE PIN MUST BE VISIBLE (doyle's rider, 2026-08-17): an access view renders a pinned open distinguishably from a default open -- `DISCOVER open (pinned)` against `DISCOVER open (default)` -- because the same two words otherwise describe two different facts, and a blanket-closed summary that said only `closed` would read as closing DISCOVER too, which is exactly the reading the carve-out removed. The surface token is validated against `surface::TABLE` and canonicalized at the boundary: an unminted id stays legal in a RULE, where it governs only itself, and is REFUSED here, because this verb writes the key the chain READS and a typo would otherwise sit in the view as a posture that governs nothing. Gate: doc -- the CONTEXT.md mode-tier entry naming the verb as the node-tier off-switch and stating the three states; impl -- the store's node-tier per-surface setter, its case-folding clear and its read half, the api verb and its dispatch arm, the shared-gate call, the vocabulary refusal, and the pinned/default render in the access view; unit -- the verb writes only the named surface and leaves the blanket alone, `unset` restores the default rather than pinning open (with the default-on and ordinary cases asserted apart), a case-differing stored key is the one cleared, an unknown surface is refused with nothing written, a non-engine-room caller is refused by the shared gate, and the view renders pinned-open, default-open and closed as three distinguishable readings.",
2026-08-28T09:54:46.2333009Z       "requiredStages": [
2026-08-28T09:54:46.2333167Z         "doc",
2026-08-28T09:54:46.2333323Z         "impl",
2026-08-28T09:54:46.2333477Z         "unit"
2026-08-28T09:54:46.2333624Z       ],
2026-08-28T09:54:46.2333777Z       "stages": {
2026-08-28T09:54:46.2333929Z         "doc": {
2026-08-28T09:54:46.2334096Z           "complete": true,
2026-08-28T09:54:46.2334258Z           "evidence": [
2026-08-28T09:54:46.2334411Z             {
2026-08-28T09:54:46.2334587Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2334849Z               "line": 879
2026-08-28T09:54:46.2335008Z             }
2026-08-28T09:54:46.2335153Z           ]
2026-08-28T09:54:46.2335306Z         },
2026-08-28T09:54:46.2335461Z         "impl": {
2026-08-28T09:54:46.2335633Z           "complete": true,
2026-08-28T09:54:46.2335799Z           "evidence": [
2026-08-28T09:54:46.2335948Z             {
2026-08-28T09:54:46.2336200Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2336368Z               "line": 829
2026-08-28T09:54:46.2336525Z             },
2026-08-28T09:54:46.2336672Z             {
2026-08-28T09:54:46.2336878Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2337035Z               "line": 840
2026-08-28T09:54:46.2337188Z             },
2026-08-28T09:54:46.2337339Z             {
2026-08-28T09:54:46.2337541Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2337707Z               "line": 2098
2026-08-28T09:54:46.2337870Z             },
2026-08-28T09:54:46.2338021Z             {
2026-08-28T09:54:46.2338226Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2338388Z               "line": 2116
2026-08-28T09:54:46.2338541Z             },
2026-08-28T09:54:46.2338693Z             {
2026-08-28T09:54:46.2338889Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2339189Z               "line": 2136
2026-08-28T09:54:46.2339346Z             },
2026-08-28T09:54:46.2339495Z             {
2026-08-28T09:54:46.2339699Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2339856Z               "line": 2144
2026-08-28T09:54:46.2340009Z             },
2026-08-28T09:54:46.2340167Z             {
2026-08-28T09:54:46.2340370Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.2340530Z               "line": 153
2026-08-28T09:54:46.2340678Z             },
2026-08-28T09:54:46.2340831Z             {
2026-08-28T09:54:46.2341026Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2341198Z               "line": 76
2026-08-28T09:54:46.2341475Z             },
2026-08-28T09:54:46.2341632Z             {
2026-08-28T09:54:46.2341836Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2342019Z               "line": 89
2026-08-28T09:54:46.2342194Z             },
2026-08-28T09:54:46.2342371Z             {
2026-08-28T09:54:46.2342605Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2342790Z               "line": 595
2026-08-28T09:54:46.2342968Z             },
2026-08-28T09:54:46.2343119Z             {
2026-08-28T09:54:46.2343332Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2343501Z               "line": 617
2026-08-28T09:54:46.2343651Z             },
2026-08-28T09:54:46.2343807Z             {
2026-08-28T09:54:46.2344008Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2344251Z               "line": 687
2026-08-28T09:54:46.2344403Z             },
2026-08-28T09:54:46.2344571Z             {
2026-08-28T09:54:46.2344770Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2344924Z               "line": 399
2026-08-28T09:54:46.2345081Z             },
2026-08-28T09:54:46.2345229Z             {
2026-08-28T09:54:46.2345414Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2345572Z               "line": 19574
2026-08-28T09:54:46.2345728Z             }
2026-08-28T09:54:46.2345880Z           ]
2026-08-28T09:54:46.2346030Z         },
2026-08-28T09:54:46.2346183Z         "int": {
2026-08-28T09:54:46.2346350Z           "complete": false,
2026-08-28T09:54:46.2346513Z           "evidence": []
2026-08-28T09:54:46.2346660Z         },
2026-08-28T09:54:46.2346823Z         "unit": {
2026-08-28T09:54:46.2346984Z           "complete": true,
2026-08-28T09:54:46.2347142Z           "evidence": [
2026-08-28T09:54:46.2347290Z             {
2026-08-28T09:54:46.2347491Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2347762Z               "line": 4478
2026-08-28T09:54:46.2347914Z             },
2026-08-28T09:54:46.2348063Z             {
2026-08-28T09:54:46.2348263Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2348416Z               "line": 4504
2026-08-28T09:54:46.2348571Z             },
2026-08-28T09:54:46.2348719Z             {
2026-08-28T09:54:46.2348909Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2349187Z               "line": 4542
2026-08-28T09:54:46.2349349Z             },
2026-08-28T09:54:46.2349497Z             {
2026-08-28T09:54:46.2349702Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2349854Z               "line": 4572
2026-08-28T09:54:46.2350003Z             },
2026-08-28T09:54:46.2350150Z             {
2026-08-28T09:54:46.2350356Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2350507Z               "line": 4630
2026-08-28T09:54:46.2350671Z             },
2026-08-28T09:54:46.2350835Z             {
2026-08-28T09:54:46.2351025Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.2351190Z               "line": 221
2026-08-28T09:54:46.2351339Z             },
2026-08-28T09:54:46.2351491Z             {
2026-08-28T09:54:46.2351677Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2351838Z               "line": 519
2026-08-28T09:54:46.2351987Z             },
2026-08-28T09:54:46.2352144Z             {
2026-08-28T09:54:46.2352354Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2352511Z               "line": 1137
2026-08-28T09:54:46.2352664Z             },
2026-08-28T09:54:46.2352811Z             {
2026-08-28T09:54:46.2353016Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2353170Z               "line": 1182
2026-08-28T09:54:46.2353326Z             },
2026-08-28T09:54:46.2353480Z             {
2026-08-28T09:54:46.2353679Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2353845Z               "line": 1238
2026-08-28T09:54:46.2354134Z             },
2026-08-28T09:54:46.2354287Z             {
2026-08-28T09:54:46.2354478Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.2354639Z               "line": 1280
2026-08-28T09:54:46.2354788Z             },
2026-08-28T09:54:46.2354940Z             {
2026-08-28T09:54:46.2355127Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2355283Z               "line": 1222
2026-08-28T09:54:46.2355432Z             },
2026-08-28T09:54:46.2355583Z             {
2026-08-28T09:54:46.2355766Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2355917Z               "line": 36257
2026-08-28T09:54:46.2356066Z             }
2026-08-28T09:54:46.2356217Z           ]
2026-08-28T09:54:46.2356364Z         }
2026-08-28T09:54:46.2356511Z       }
2026-08-28T09:54:46.2356657Z     },
2026-08-28T09:54:46.2356806Z     {
2026-08-28T09:54:46.2356972Z       "id": "REQ-ACL-SURFACE-VOCAB",
2026-08-28T09:54:46.2364723Z       "title": "Access control is granular at the CONTROL SURFACE, not at the endpoint. A rule is (target endpoint x surface x subject) -> allow/deny, where a surface is a named remote-reachable operation class with an OPEN CONSTANT_CASE string vocabulary — new surfaces mint ids without a schema change, and an unrecognized surface string in a rule is legal (it governs nothing until that surface is built). The v1 set is the nine ratified ids: MSG, RC_VIEW, RC_ATTACH, DIGEST, WAKE, SUSPEND, XFER, SHELL_LINK, DISCOVER. WHAT THIS ENDS: the ADR-0009 whitelist was all-or-nothing per endpoint — admitting a node for messages also admitted it to drive the terminal, pull digests, and transfer files, because one access_check covered every wire-inbound family at once. On a SHARED SUBNET (member nodes belonging to different human operators, the gated adversary being agents) that coupling is the whole problem: there is no way to publish a view without handing over the keyboard. Each of the daemon's gate call-site families now tags itself with its surface, and the two families carrying a request-shaped distinction split: attach on AttachIntent (Viewer -> RC_VIEW vs Control/Take -> RC_ATTACH, see REQ-ACL-RC-VIEW-SPLIT), rest on the rest event (Wake -> WAKE vs Suspend -> SUSPEND). Gate: doc — the CONTEXT.md control-surface glossary entry; impl — the spt_store::access::surface vocabulary module, access_check's surface parameter, and the six call-site families tagging themselves; unit — the vocabulary shape (nine ids, CONSTANT_CASE, open to unminted strings) plus a per-surface decision table proving a grant on one surface does not admit the same node on another.",
2026-08-28T09:54:46.2365033Z       "requiredStages": [
2026-08-28T09:54:46.2365185Z         "doc",
2026-08-28T09:54:46.2365338Z         "impl",
2026-08-28T09:54:46.2365491Z         "unit"
2026-08-28T09:54:46.2365648Z       ],
2026-08-28T09:54:46.2365795Z       "stages": {
2026-08-28T09:54:46.2365943Z         "doc": {
2026-08-28T09:54:46.2366120Z           "complete": true,
2026-08-28T09:54:46.2366273Z           "evidence": [
2026-08-28T09:54:46.2366429Z             {
2026-08-28T09:54:46.2366602Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2367005Z               "line": 868
2026-08-28T09:54:46.2367146Z             }
2026-08-28T09:54:46.2367290Z           ]
2026-08-28T09:54:46.2367432Z         },
2026-08-28T09:54:46.2367585Z         "impl": {
2026-08-28T09:54:46.2367738Z           "complete": true,
2026-08-28T09:54:46.2367905Z           "evidence": [
2026-08-28T09:54:46.2368052Z             {
2026-08-28T09:54:46.2368258Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.2368424Z               "line": 234
2026-08-28T09:54:46.2368573Z             },
2026-08-28T09:54:46.2368720Z             {
2026-08-28T09:54:46.2368930Z               "path": "crates/spt-daemon/src/resthost.rs",
2026-08-28T09:54:46.2369226Z               "line": 40
2026-08-28T09:54:46.2369373Z             },
2026-08-28T09:54:46.2369523Z             {
2026-08-28T09:54:46.2369729Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2370016Z               "line": 125
2026-08-28T09:54:46.2370169Z             },
2026-08-28T09:54:46.2370316Z             {
2026-08-28T09:54:46.2370517Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2370674Z               "line": 1999
2026-08-28T09:54:46.2370827Z             },
2026-08-28T09:54:46.2370970Z             {
2026-08-28T09:54:46.2371175Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.2371336Z               "line": 191
2026-08-28T09:54:46.2371481Z             }
2026-08-28T09:54:46.2371628Z           ]
2026-08-28T09:54:46.2371772Z         },
2026-08-28T09:54:46.2371922Z         "int": {
2026-08-28T09:54:46.2372089Z           "complete": false,
2026-08-28T09:54:46.2372253Z           "evidence": []
2026-08-28T09:54:46.2372406Z         },
2026-08-28T09:54:46.2372559Z         "unit": {
2026-08-28T09:54:46.2372725Z           "complete": true,
2026-08-28T09:54:46.2372883Z           "evidence": [
2026-08-28T09:54:46.2373036Z             {
2026-08-28T09:54:46.2373240Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.2373399Z               "line": 383
2026-08-28T09:54:46.2373545Z             },
2026-08-28T09:54:46.2373709Z             {
2026-08-28T09:54:46.2373908Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.2374066Z               "line": 3597
2026-08-28T09:54:46.2374218Z             }
2026-08-28T09:54:46.2374372Z           ]
2026-08-28T09:54:46.2374523Z         }
2026-08-28T09:54:46.2374668Z       }
2026-08-28T09:54:46.2374823Z     },
2026-08-28T09:54:46.2374970Z     {
2026-08-28T09:54:46.2375154Z       "id": "REQ-ACL-VIEW-DRILLDOWN",
2026-08-28T09:54:46.2379995Z       "title": "The granular rule list is viewable only per named ruled entity (CONTEXT.md 'access entity'): `spt endpoint access [--endpoint-rules <id> | --node-rules <node> | --subnet-rules <subnet>]` — mutually exclusive flags — renders exactly the rules whose subject names that entity, through the SAME ruleset-table renderer the engine-room briefing carries (REQ-ER-RULESET-TABLE), filtered on the TYPED rule subject rather than by re-parsing the rendered subject word (a rendered-string match is a second literal waiting to drift). A target positional scopes the slice to that endpoint's rules plus the node-scope rows that also decide for it; the drill's `--json` emits the rows verbatim. The one-flat-dump-of-everything view is deliberately gone — reading a posture is a comparison per entity, not a scroll. Gate: doc — the CONTEXT.md access-entity entry; impl — the typed filter seam and the flag surface; unit — the filter matches only its own entity kind (a subnet name equal to an endpoint id must not cross-match) and the flags parse mutually exclusive.",
2026-08-28T09:54:46.2380303Z       "requiredStages": [
2026-08-28T09:54:46.2380458Z         "doc",
2026-08-28T09:54:46.2380613Z         "impl",
2026-08-28T09:54:46.2380758Z         "unit"
2026-08-28T09:54:46.2380924Z       ],
2026-08-28T09:54:46.2381087Z       "stages": {
2026-08-28T09:54:46.2381239Z         "doc": {
2026-08-28T09:54:46.2381397Z           "complete": true,
2026-08-28T09:54:46.2381553Z           "evidence": [
2026-08-28T09:54:46.2381702Z             {
2026-08-28T09:54:46.2381883Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2382036Z               "line": 874
2026-08-28T09:54:46.2382192Z             },
2026-08-28T09:54:46.2382346Z             {
2026-08-28T09:54:46.2382577Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:46.2382734Z               "line": 3
2026-08-28T09:54:46.2382875Z             }
2026-08-28T09:54:46.2383024Z           ]
2026-08-28T09:54:46.2383180Z         },
2026-08-28T09:54:46.2383339Z         "impl": {
2026-08-28T09:54:46.2383509Z           "complete": true,
2026-08-28T09:54:46.2383668Z           "evidence": [
2026-08-28T09:54:46.2383824Z             {
2026-08-28T09:54:46.2384029Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2384196Z               "line": 250
2026-08-28T09:54:46.2384453Z             },
2026-08-28T09:54:46.2384608Z             {
2026-08-28T09:54:46.2384817Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2384974Z               "line": 261
2026-08-28T09:54:46.2385127Z             },
2026-08-28T09:54:46.2385275Z             {
2026-08-28T09:54:46.2385478Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.2385634Z               "line": 459
2026-08-28T09:54:46.2385785Z             },
2026-08-28T09:54:46.2385939Z             {
2026-08-28T09:54:46.2386139Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2386301Z               "line": 346
2026-08-28T09:54:46.2386444Z             },
2026-08-28T09:54:46.2386592Z             {
2026-08-28T09:54:46.2386773Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2386930Z               "line": 20054
2026-08-28T09:54:46.2387078Z             }
2026-08-28T09:54:46.2387244Z           ]
2026-08-28T09:54:46.2387398Z         },
2026-08-28T09:54:46.2387550Z         "int": {
2026-08-28T09:54:46.2387718Z           "complete": false,
2026-08-28T09:54:46.2387869Z           "evidence": []
2026-08-28T09:54:46.2388020Z         },
2026-08-28T09:54:46.2388168Z         "unit": {
2026-08-28T09:54:46.2388328Z           "complete": true,
2026-08-28T09:54:46.2388482Z           "evidence": [
2026-08-28T09:54:46.2388633Z             {
2026-08-28T09:54:46.2388830Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2389097Z               "line": 559
2026-08-28T09:54:46.2389258Z             },
2026-08-28T09:54:46.2389402Z             {
2026-08-28T09:54:46.2389587Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2389745Z               "line": 31058
2026-08-28T09:54:46.2389892Z             }
2026-08-28T09:54:46.2390037Z           ]
2026-08-28T09:54:46.2390188Z         }
2026-08-28T09:54:46.2390338Z       }
2026-08-28T09:54:46.2390595Z     },
2026-08-28T09:54:46.2390746Z     {
2026-08-28T09:54:46.2390921Z       "id": "REQ-ACL-VIEW-ROSTER",
2026-08-28T09:54:46.2396941Z       "title": "Access views are roster-first (CONTEXT.md 'access entity', FF grill 2026-07-30): `spt endpoint access [<endpoint>]` lists each ruled target's access entities — the subnets, nodes, and endpoints its own rules name — grouped by type in that order, each with its rule count; a subnet or the home node also carries its mode summary; a captured-mode subnet is listed even with zero explicit rules (a mode source is part of the posture picture); external entities with no rules for the target are omitted entirely; a ruled endpoint resolves to `<id>@<node> (<shared subnets>)` where this node's registry can see it and renders bare where it cannot (ruled-but-unresolvable must not hide the rule count). The view is node-sovereign — no remote rule-read exists; viewing another node's rules means running the CLI there. Supersedes the `access list` prose view; the `--json` surface re-homes the old shape's explicit `locked` flag onto the roster envelope. Known limit, documented: an endpoint literally named after a write verb (allow/revoke/open) parses as the subcommand and loses the positional path. Gate: doc — the CONTEXT.md access-entity entry; impl — the roster builder, renderer, endpoint directory, and the superseding CLI surface; unit — the roster grammar (grouping order, counts, mode annotations, bare-vs-resolved endpoints, explicit empty line) and the parse surface.",
2026-08-28T09:54:46.2397133Z       "requiredStages": [
2026-08-28T09:54:46.2397285Z         "doc",
2026-08-28T09:54:46.2397438Z         "impl",
2026-08-28T09:54:46.2397595Z         "unit"
2026-08-28T09:54:46.2397739Z       ],
2026-08-28T09:54:46.2397895Z       "stages": {
2026-08-28T09:54:46.2398044Z         "doc": {
2026-08-28T09:54:46.2398205Z           "complete": true,
2026-08-28T09:54:46.2398364Z           "evidence": [
2026-08-28T09:54:46.2398514Z             {
2026-08-28T09:54:46.2398686Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2398850Z               "line": 874
2026-08-28T09:54:46.2399256Z             },
2026-08-28T09:54:46.2399405Z             {
2026-08-28T09:54:46.2399652Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:46.2399808Z               "line": 3
2026-08-28T09:54:46.2399958Z             }
2026-08-28T09:54:46.2400104Z           ]
2026-08-28T09:54:46.2400254Z         },
2026-08-28T09:54:46.2400405Z         "impl": {
2026-08-28T09:54:46.2400573Z           "complete": true,
2026-08-28T09:54:46.2400729Z           "evidence": [
2026-08-28T09:54:46.2400883Z             {
2026-08-28T09:54:46.2401082Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2401246Z               "line": 26
2026-08-28T09:54:46.2401396Z             },
2026-08-28T09:54:46.2401539Z             {
2026-08-28T09:54:46.2401734Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2401892Z               "line": 117
2026-08-28T09:54:46.2402049Z             },
2026-08-28T09:54:46.2402198Z             {
2026-08-28T09:54:46.2402397Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2402555Z               "line": 330
2026-08-28T09:54:46.2402702Z             },
2026-08-28T09:54:46.2402851Z             {
2026-08-28T09:54:46.2403031Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2403189Z               "line": 15525
2026-08-28T09:54:46.2403336Z             },
2026-08-28T09:54:46.2403499Z             {
2026-08-28T09:54:46.2403683Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2403840Z               "line": 19939
2026-08-28T09:54:46.2403995Z             },
2026-08-28T09:54:46.2404145Z             {
2026-08-28T09:54:46.2404334Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2404497Z               "line": 19974
2026-08-28T09:54:46.2404653Z             }
2026-08-28T09:54:46.2404802Z           ]
2026-08-28T09:54:46.2404954Z         },
2026-08-28T09:54:46.2405112Z         "int": {
2026-08-28T09:54:46.2405384Z           "complete": false,
2026-08-28T09:54:46.2405555Z           "evidence": []
2026-08-28T09:54:46.2405704Z         },
2026-08-28T09:54:46.2405856Z         "unit": {
2026-08-28T09:54:46.2406014Z           "complete": true,
2026-08-28T09:54:46.2406180Z           "evidence": [
2026-08-28T09:54:46.2406329Z             {
2026-08-28T09:54:46.2406531Z               "path": "crates/spt/src/accessview.rs",
2026-08-28T09:54:46.2406693Z               "line": 392
2026-08-28T09:54:46.2406843Z             },
2026-08-28T09:54:46.2406997Z             {
2026-08-28T09:54:46.2407172Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2407341Z               "line": 31040
2026-08-28T09:54:46.2407487Z             }
2026-08-28T09:54:46.2407641Z           ]
2026-08-28T09:54:46.2407788Z         }
2026-08-28T09:54:46.2407936Z       }
2026-08-28T09:54:46.2408093Z     },
2026-08-28T09:54:46.2408237Z     {
2026-08-28T09:54:46.2408460Z       "id": "REQ-ACTIVITY-INFO-PULL",
2026-08-28T09:54:46.2410116Z       "title": "The endpoint's current activity state (busy|idle) is readable via `spt api endpoint-info` — a point-in-time read of the perch idle sentinel, for consumers that need a check rather than a stream (ADR-0048 decision 1, pull avenue; operator-ruled 2026-07-24). Additive key, N-1-safe per the additive-evolution posture.",
2026-08-28T09:54:46.2410293Z       "requiredStages": [
2026-08-28T09:54:46.2410451Z         "doc",
2026-08-28T09:54:46.2410598Z         "impl",
2026-08-28T09:54:46.2410755Z         "unit"
2026-08-28T09:54:46.2410903Z       ],
2026-08-28T09:54:46.2411061Z       "stages": {
2026-08-28T09:54:46.2411209Z         "doc": {
2026-08-28T09:54:46.2411376Z           "complete": true,
2026-08-28T09:54:46.2411528Z           "evidence": [
2026-08-28T09:54:46.2411686Z             {
2026-08-28T09:54:46.2411899Z               "path": "docs/adr/0048-idle-edge-contract.md",
2026-08-28T09:54:46.2412061Z               "line": 43
2026-08-28T09:54:46.2412209Z             }
2026-08-28T09:54:46.2412371Z           ]
2026-08-28T09:54:46.2412520Z         },
2026-08-28T09:54:46.2412810Z         "impl": {
2026-08-28T09:54:46.2412981Z           "complete": true,
2026-08-28T09:54:46.2413148Z           "evidence": [
2026-08-28T09:54:46.2413300Z             {
2026-08-28T09:54:46.2413496Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2413659Z               "line": 729
2026-08-28T09:54:46.2413810Z             },
2026-08-28T09:54:46.2413959Z             {
2026-08-28T09:54:46.2414163Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2414320Z               "line": 1086
2026-08-28T09:54:46.2414475Z             },
2026-08-28T09:54:46.2414623Z             {
2026-08-28T09:54:46.2414828Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2414986Z               "line": 1218
2026-08-28T09:54:46.2415128Z             }
2026-08-28T09:54:46.2415277Z           ]
2026-08-28T09:54:46.2415414Z         },
2026-08-28T09:54:46.2415563Z         "int": {
2026-08-28T09:54:46.2415725Z           "complete": false,
2026-08-28T09:54:46.2415887Z           "evidence": []
2026-08-28T09:54:46.2416025Z         },
2026-08-28T09:54:46.2416177Z         "unit": {
2026-08-28T09:54:46.2416344Z           "complete": true,
2026-08-28T09:54:46.2416487Z           "evidence": [
2026-08-28T09:54:46.2416635Z             {
2026-08-28T09:54:46.2416836Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2417002Z               "line": 1346
2026-08-28T09:54:46.2417149Z             },
2026-08-28T09:54:46.2417305Z             {
2026-08-28T09:54:46.2417514Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2417681Z               "line": 1377
2026-08-28T09:54:46.2417834Z             }
2026-08-28T09:54:46.2417981Z           ]
2026-08-28T09:54:46.2418129Z         }
2026-08-28T09:54:46.2418277Z       }
2026-08-28T09:54:46.2418425Z     },
2026-08-28T09:54:46.2418572Z     {
2026-08-28T09:54:46.2418759Z       "id": "REQ-ACTIVITY-LINK-PUSH",
2026-08-28T09:54:46.2424500Z       "title": "An owned Shell observes its owner's busy/idle transitions as an activity frame on the EXISTING shell-link event stream (ADR-0048 decisions 1-3; perri contract-lock 2026-07-24). Link-scoped (owner implied by the link token — no new verb, no addressing surface). Drive-class semantics: ephemeral, latest-wins, current-state-carrying; redundant same-state resend is a harmless no-op (consumer derives edges); NEVER spooled or replayed (stale transitions are actively wrong). Both directions (busy->idle, idle->busy). Current state emitted on EVERY link establishment and re-link — restart resync is free. Latency promise = BOUNDED OBSERVATION: a frame per transition, sub-second class, never hard-real-time; each frame carries the TRANSITION TIMESTAMP (when the sentinel flipped, not when the frame was emitted) so edge-anchored consumers self-correct emission latency. Frame name/attrs publish in the shell frame vocabulary doc (REQ-SHELL-FRAME-VOCAB lineage) — doc stage rides there. Gate: int — a live shell link sees busy->idle and idle->busy frames with truthful transition timestamps, a re-link re-emits current state, and a transition during link-down is represented by the re-link emit (current state), never a replayed backlog.",
2026-08-28T09:54:46.2424718Z       "requiredStages": [
2026-08-28T09:54:46.2424866Z         "doc",
2026-08-28T09:54:46.2425025Z         "impl",
2026-08-28T09:54:46.2425169Z         "unit",
2026-08-28T09:54:46.2425322Z         "int"
2026-08-28T09:54:46.2425474Z       ],
2026-08-28T09:54:46.2425655Z       "stages": {
2026-08-28T09:54:46.2425822Z         "doc": {
2026-08-28T09:54:46.2425989Z           "complete": true,
2026-08-28T09:54:46.2426152Z           "evidence": [
2026-08-28T09:54:46.2426299Z             {
2026-08-28T09:54:46.2426505Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:46.2426666Z               "line": 220
2026-08-28T09:54:46.2426825Z             }
2026-08-28T09:54:46.2426971Z           ]
2026-08-28T09:54:46.2427135Z         },
2026-08-28T09:54:46.2427286Z         "impl": {
2026-08-28T09:54:46.2427571Z           "complete": true,
2026-08-28T09:54:46.2427733Z           "evidence": [
2026-08-28T09:54:46.2427879Z             {
2026-08-28T09:54:46.2428089Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2428246Z               "line": 26
2026-08-28T09:54:46.2428404Z             },
2026-08-28T09:54:46.2428551Z             {
2026-08-28T09:54:46.2428761Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2428913Z               "line": 59
2026-08-28T09:54:46.2429156Z             },
2026-08-28T09:54:46.2429314Z             {
2026-08-28T09:54:46.2429509Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2429673Z               "line": 69
2026-08-28T09:54:46.2429819Z             },
2026-08-28T09:54:46.2429978Z             {
2026-08-28T09:54:46.2430176Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2430347Z               "line": 104
2026-08-28T09:54:46.2430498Z             },
2026-08-28T09:54:46.2430660Z             {
2026-08-28T09:54:46.2430864Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2431023Z               "line": 119
2026-08-28T09:54:46.2431174Z             },
2026-08-28T09:54:46.2431328Z             {
2026-08-28T09:54:46.2431527Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2431681Z               "line": 137
2026-08-28T09:54:46.2431837Z             },
2026-08-28T09:54:46.2432010Z             {
2026-08-28T09:54:46.2432215Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2432376Z               "line": 179
2026-08-28T09:54:46.2432525Z             },
2026-08-28T09:54:46.2432676Z             {
2026-08-28T09:54:46.2432874Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2433038Z               "line": 189
2026-08-28T09:54:46.2433186Z             },
2026-08-28T09:54:46.2433448Z             {
2026-08-28T09:54:46.2433663Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2433826Z               "line": 211
2026-08-28T09:54:46.2433978Z             },
2026-08-28T09:54:46.2434125Z             {
2026-08-28T09:54:46.2434331Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2434484Z               "line": 233
2026-08-28T09:54:46.2434636Z             },
2026-08-28T09:54:46.2434785Z             {
2026-08-28T09:54:46.2435002Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.2435166Z               "line": 299
2026-08-28T09:54:46.2435312Z             },
2026-08-28T09:54:46.2435464Z             {
2026-08-28T09:54:46.2435662Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2435820Z               "line": 146
2026-08-28T09:54:46.2435972Z             },
2026-08-28T09:54:46.2436121Z             {
2026-08-28T09:54:46.2436383Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2436549Z               "line": 330
2026-08-28T09:54:46.2436707Z             },
2026-08-28T09:54:46.2436860Z             {
2026-08-28T09:54:46.2437065Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2437221Z               "line": 370
2026-08-28T09:54:46.2437375Z             },
2026-08-28T09:54:46.2437522Z             {
2026-08-28T09:54:46.2437728Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2437894Z               "line": 380
2026-08-28T09:54:46.2438043Z             },
2026-08-28T09:54:46.2438198Z             {
2026-08-28T09:54:46.2438397Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2438566Z               "line": 388
2026-08-28T09:54:46.2438716Z             },
2026-08-28T09:54:46.2438877Z             {
2026-08-28T09:54:46.2439173Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2439340Z               "line": 478
2026-08-28T09:54:46.2439497Z             },
2026-08-28T09:54:46.2439650Z             {
2026-08-28T09:54:46.2440026Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2440228Z               "line": 817
2026-08-28T09:54:46.2440384Z             },
2026-08-28T09:54:46.2440533Z             {
2026-08-28T09:54:46.2440736Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2440893Z               "line": 844
2026-08-28T09:54:46.2441048Z             },
2026-08-28T09:54:46.2441211Z             {
2026-08-28T09:54:46.2441415Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.2441573Z               "line": 151
2026-08-28T09:54:46.2441720Z             },
2026-08-28T09:54:46.2441874Z             {
2026-08-28T09:54:46.2442077Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2442236Z               "line": 83
2026-08-28T09:54:46.2442388Z             },
2026-08-28T09:54:46.2442541Z             {
2026-08-28T09:54:46.2442741Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2442898Z               "line": 693
2026-08-28T09:54:46.2443061Z             },
2026-08-28T09:54:46.2443208Z             {
2026-08-28T09:54:46.2443405Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2443561Z               "line": 715
2026-08-28T09:54:46.2443712Z             },
2026-08-28T09:54:46.2443871Z             {
2026-08-28T09:54:46.2444066Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.2444233Z               "line": 412
2026-08-28T09:54:46.2444376Z             },
2026-08-28T09:54:46.2444534Z             {
2026-08-28T09:54:46.2444720Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2444881Z               "line": 520
2026-08-28T09:54:46.2445035Z             },
2026-08-28T09:54:46.2445186Z             {
2026-08-28T09:54:46.2445378Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2445611Z               "line": 654
2026-08-28T09:54:46.2445857Z             },
2026-08-28T09:54:46.2446279Z             {
2026-08-28T09:54:46.2446489Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2446647Z               "line": 605
2026-08-28T09:54:46.2446804Z             }
2026-08-28T09:54:46.2446952Z           ]
2026-08-28T09:54:46.2447105Z         },
2026-08-28T09:54:46.2447258Z         "int": {
2026-08-28T09:54:46.2447415Z           "complete": true,
2026-08-28T09:54:46.2447577Z           "evidence": [
2026-08-28T09:54:46.2447719Z             {
2026-08-28T09:54:46.2447954Z               "path": "crates/spt/tests/activity_link_push_e2e.rs",
2026-08-28T09:54:46.2448096Z               "line": 35
2026-08-28T09:54:46.2448245Z             }
2026-08-28T09:54:46.2448391Z           ]
2026-08-28T09:54:46.2448536Z         },
2026-08-28T09:54:46.2448682Z         "unit": {
2026-08-28T09:54:46.2448844Z           "complete": true,
2026-08-28T09:54:46.2449122Z           "evidence": [
2026-08-28T09:54:46.2449276Z             {
2026-08-28T09:54:46.2449509Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2449685Z               "line": 255
2026-08-28T09:54:46.2449844Z             },
2026-08-28T09:54:46.2450000Z             {
2026-08-28T09:54:46.2450215Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2450377Z               "line": 266
2026-08-28T09:54:46.2450540Z             },
2026-08-28T09:54:46.2450691Z             {
2026-08-28T09:54:46.2450901Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2451059Z               "line": 282
2026-08-28T09:54:46.2451211Z             },
2026-08-28T09:54:46.2451367Z             {
2026-08-28T09:54:46.2451566Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2451718Z               "line": 297
2026-08-28T09:54:46.2451867Z             },
2026-08-28T09:54:46.2452018Z             {
2026-08-28T09:54:46.2452214Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2452376Z               "line": 316
2026-08-28T09:54:46.2452538Z             },
2026-08-28T09:54:46.2452687Z             {
2026-08-28T09:54:46.2452996Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2453158Z               "line": 336
2026-08-28T09:54:46.2453321Z             },
2026-08-28T09:54:46.2453468Z             {
2026-08-28T09:54:46.2453674Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2453835Z               "line": 375
2026-08-28T09:54:46.2453984Z             },
2026-08-28T09:54:46.2454144Z             {
2026-08-28T09:54:46.2454340Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2454506Z               "line": 400
2026-08-28T09:54:46.2454660Z             },
2026-08-28T09:54:46.2454816Z             {
2026-08-28T09:54:46.2455013Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2455169Z               "line": 431
2026-08-28T09:54:46.2455318Z             },
2026-08-28T09:54:46.2455465Z             {
2026-08-28T09:54:46.2455675Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2455832Z               "line": 448
2026-08-28T09:54:46.2455985Z             },
2026-08-28T09:54:46.2456128Z             {
2026-08-28T09:54:46.2456337Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.2456494Z               "line": 459
2026-08-28T09:54:46.2456650Z             },
2026-08-28T09:54:46.2456801Z             {
2026-08-28T09:54:46.2456998Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2457163Z               "line": 955
2026-08-28T09:54:46.2457307Z             },
2026-08-28T09:54:46.2457459Z             {
2026-08-28T09:54:46.2457660Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2457808Z               "line": 994
2026-08-28T09:54:46.2457951Z             },
2026-08-28T09:54:46.2458113Z             {
2026-08-28T09:54:46.2458313Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2458467Z               "line": 1015
2026-08-28T09:54:46.2458762Z             },
2026-08-28T09:54:46.2458918Z             {
2026-08-28T09:54:46.2459252Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2459413Z               "line": 1040
2026-08-28T09:54:46.2459564Z             },
2026-08-28T09:54:46.2459721Z             {
2026-08-28T09:54:46.2459921Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.2460079Z               "line": 1054
2026-08-28T09:54:46.2460227Z             },
2026-08-28T09:54:46.2460380Z             {
2026-08-28T09:54:46.2460588Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.2460747Z               "line": 557
2026-08-28T09:54:46.2460899Z             },
2026-08-28T09:54:46.2461048Z             {
2026-08-28T09:54:46.2461261Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.2461420Z               "line": 574
2026-08-28T09:54:46.2461571Z             },
2026-08-28T09:54:46.2461720Z             {
2026-08-28T09:54:46.2461932Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2462094Z               "line": 1243
2026-08-28T09:54:46.2462249Z             },
2026-08-28T09:54:46.2462398Z             {
2026-08-28T09:54:46.2462602Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2462765Z               "line": 1278
2026-08-28T09:54:46.2462907Z             },
2026-08-28T09:54:46.2463056Z             {
2026-08-28T09:54:46.2463252Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2463413Z               "line": 1311
2026-08-28T09:54:46.2463556Z             },
2026-08-28T09:54:46.2463718Z             {
2026-08-28T09:54:46.2463905Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2464066Z               "line": 1343
2026-08-28T09:54:46.2464225Z             },
2026-08-28T09:54:46.2464376Z             {
2026-08-28T09:54:46.2464573Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.2464733Z               "line": 1370
2026-08-28T09:54:46.2464895Z             },
2026-08-28T09:54:46.2465268Z             {
2026-08-28T09:54:46.2465482Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.2465644Z               "line": 1453
2026-08-28T09:54:46.2465801Z             }
2026-08-28T09:54:46.2465954Z           ]
2026-08-28T09:54:46.2466106Z         }
2026-08-28T09:54:46.2469436Z       }
2026-08-28T09:54:46.2469632Z     },
2026-08-28T09:54:46.2469784Z     {
2026-08-28T09:54:46.2469978Z       "id": "REQ-ACTIVITY-LIST-JSON",
2026-08-28T09:54:46.2471511Z       "title": "`spt endpoint list --json` carries a per-endpoint `activity` (busy|idle) key, for consumers surveying the idle/busy state of many endpoints at once (ADR-0048 decision 1, roster pull avenue; operator addition 2026-07-24). Additive key, N-1-safe; kin the flynn 2026-07-06 last-active/description/adapter list-enrichment seed (same additive posture, may ride together).",
2026-08-28T09:54:46.2471684Z       "requiredStages": [
2026-08-28T09:54:46.2471855Z         "doc",
2026-08-28T09:54:46.2471999Z         "impl",
2026-08-28T09:54:46.2472150Z         "unit"
2026-08-28T09:54:46.2472294Z       ],
2026-08-28T09:54:46.2472459Z       "stages": {
2026-08-28T09:54:46.2472607Z         "doc": {
2026-08-28T09:54:46.2472771Z           "complete": true,
2026-08-28T09:54:46.2472944Z           "evidence": [
2026-08-28T09:54:46.2473091Z             {
2026-08-28T09:54:46.2473326Z               "path": "docs-site/src/reference/json-shapes.md",
2026-08-28T09:54:46.2473482Z               "line": 411
2026-08-28T09:54:46.2473635Z             },
2026-08-28T09:54:46.2473782Z             {
2026-08-28T09:54:46.2474007Z               "path": "docs/adr/0048-idle-edge-contract.md",
2026-08-28T09:54:46.2474160Z               "line": 43
2026-08-28T09:54:46.2474312Z             }
2026-08-28T09:54:46.2474461Z           ]
2026-08-28T09:54:46.2474602Z         },
2026-08-28T09:54:46.2474756Z         "impl": {
2026-08-28T09:54:46.2474921Z           "complete": true,
2026-08-28T09:54:46.2475227Z           "evidence": [
2026-08-28T09:54:46.2475378Z             {
2026-08-28T09:54:46.2475575Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2475727Z               "line": 730
2026-08-28T09:54:46.2475866Z             },
2026-08-28T09:54:46.2476017Z             {
2026-08-28T09:54:46.2476190Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2476347Z               "line": 6302
2026-08-28T09:54:46.2476500Z             },
2026-08-28T09:54:46.2476651Z             {
2026-08-28T09:54:46.2476828Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2476991Z               "line": 6502
2026-08-28T09:54:46.2477143Z             }
2026-08-28T09:54:46.2477286Z           ]
2026-08-28T09:54:46.2477439Z         },
2026-08-28T09:54:46.2477576Z         "int": {
2026-08-28T09:54:46.2477747Z           "complete": false,
2026-08-28T09:54:46.2477911Z           "evidence": []
2026-08-28T09:54:46.2478061Z         },
2026-08-28T09:54:46.2478212Z         "unit": {
2026-08-28T09:54:46.2478390Z           "complete": true,
2026-08-28T09:54:46.2478555Z           "evidence": [
2026-08-28T09:54:46.2478709Z             {
2026-08-28T09:54:46.2478894Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2479152Z               "line": 26760
2026-08-28T09:54:46.2479305Z             },
2026-08-28T09:54:46.2479452Z             {
2026-08-28T09:54:46.2479639Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2479791Z               "line": 26896
2026-08-28T09:54:46.2479940Z             }
2026-08-28T09:54:46.2480091Z           ]
2026-08-28T09:54:46.2480241Z         }
2026-08-28T09:54:46.2480401Z       }
2026-08-28T09:54:46.2480543Z     },
2026-08-28T09:54:46.2480694Z     {
2026-08-28T09:54:46.2480880Z       "id": "REQ-ADAPTER-ADD-SURFACE-ERRORS",
2026-08-28T09:54:46.2483275Z       "title": "Bug #1: adapter add runs the install-as-first-update via conduct (cli.rs:6963) which on a non-zero exit prints only the exit code and DISCARDS the subprocess stdout/stderr, so the real error is invisible (the failure itself does propagate). Fix: include out.stderr/stdout in the ADAPTER_INSTALL_FAIL message (mirror run_update_post_step). Operator ruling: ALSO run the [update.post] composite step at install-time (today it runs only on explicit adapter update), so an install both surfaces detail and completes the delegated post-step. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #1.",
2026-08-28T09:54:46.2483571Z       "requiredStages": [
2026-08-28T09:54:46.2483727Z         "impl",
2026-08-28T09:54:46.2483876Z         "unit"
2026-08-28T09:54:46.2484023Z       ],
2026-08-28T09:54:46.2484176Z       "stages": {
2026-08-28T09:54:46.2484323Z         "doc": {
2026-08-28T09:54:46.2484495Z           "complete": false,
2026-08-28T09:54:46.2484658Z           "evidence": []
2026-08-28T09:54:46.2484806Z         },
2026-08-28T09:54:46.2484958Z         "impl": {
2026-08-28T09:54:46.2485201Z           "complete": true,
2026-08-28T09:54:46.2485350Z           "evidence": [
2026-08-28T09:54:46.2485500Z             {
2026-08-28T09:54:46.2485684Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2485839Z               "line": 20246
2026-08-28T09:54:46.2485991Z             },
2026-08-28T09:54:46.2486135Z             {
2026-08-28T09:54:46.2486306Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2486464Z               "line": 20275
2026-08-28T09:54:46.2486612Z             },
2026-08-28T09:54:46.2486765Z             {
2026-08-28T09:54:46.2486941Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2487108Z               "line": 20436
2026-08-28T09:54:46.2487256Z             }
2026-08-28T09:54:46.2487407Z           ]
2026-08-28T09:54:46.2487561Z         },
2026-08-28T09:54:46.2487708Z         "int": {
2026-08-28T09:54:46.2487875Z           "complete": false,
2026-08-28T09:54:46.2488036Z           "evidence": []
2026-08-28T09:54:46.2488193Z         },
2026-08-28T09:54:46.2488340Z         "unit": {
2026-08-28T09:54:46.2488505Z           "complete": true,
2026-08-28T09:54:46.2488773Z           "evidence": [
2026-08-28T09:54:46.2488926Z             {
2026-08-28T09:54:46.2489203Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2489359Z               "line": 39075
2026-08-28T09:54:46.2489513Z             }
2026-08-28T09:54:46.2489660Z           ]
2026-08-28T09:54:46.2489808Z         }
2026-08-28T09:54:46.2489950Z       }
2026-08-28T09:54:46.2490103Z     },
2026-08-28T09:54:46.2490241Z     {
2026-08-28T09:54:46.2490428Z       "id": "REQ-ADAPTER-FLOOR-ENFORCE",
2026-08-28T09:54:46.2504092Z       "title": "F-5 (REMOTE-TRUTH triage §F-5 + doyle rulings 2026-07-05): BOTH adapter acquisition verbs (spt adapter add + spt adapter update) REFUSE when the installed spt-core is BELOW the adapter's declared [adapter].min_spt_core_version floor — with an F-1 operator refusal naming the installed core, the floor, and the next action (update spt-core first). ROOT: the floor was PARSED + required (manifest.rs) but never compared to the running core — dead enforcement; and the [update].version_check knob that gated it was DOC'D-BUT-DEAD (never read by any production path — a contract lie). RULINGS: RETIRE version_check (drop the manifest field + schema + docs + the cfg(test) literals; a pre-existing manifest still setting it deserializes fine — serde ignores the unknown key, no deny_unknown_fields, so retiring is back-compatible); SEMVER-compare NOT string-compare (the 0.9.0 < 0.25.0 lexical trap); enforce on BOTH verbs; nothing installs / registry untouched on refuse (binds both verbs, no residuals). FIX: (1) a pure spt-runtime version_meets_floor(core, floor) -> bool (numeric per-component: split '.', u64, missing→0, non-numeric→0, first-diff decides, equal-when-zero-padded ⇒ satisfied) — mirrors the CLI version_is_newer parse (same numeric model, different question: freshness=strictly-newer vs floor=at-least). (2) ADD: the gate lives INSIDE registry::register (the choke point) via a register_with_core(core_version) seam register() delegates to with env!(CARGO_PKG_VERSION) — the floor check runs right after the manifest parse, BEFORE any registry write, returning the typed RegistryError::CoreFloor{adapter,core,floor} (Display = the ONE F-1 refusal both verbs surface); nothing recorded on refuse. (3) UPDATE: a PRE-SWAP peek (staged_floor_ok) extracts the staged .spt to a THROWAWAY temp, parses its manifest floor, and refuses BEFORE apply_release_crc_swap mutates the live pointer-mode home — so a refusal (or an unverifiable floor: FAIL-CLOSED) leaves the live install BYTE-UNTOUCHED; register@8932 stays as the defense-in-depth backstop for every other entry path. THE COMPARISON BASIS IS THE CALLER'S, NOT THIS FUNCTION'S (releases#159): the bare verb judges against the running CLI, and a COMPOSITE update judges against the core that run will activate — see REQ-ADAPTER-FLOOR-VS-STAGED-CORE. The FAIL-CLOSED discipline in this clause is about an unverifiable STAGED MANIFEST and is unrelated to that input. doyle bind: the register-only gate would let the crc-swap replace the live files with a floor-violating version while the record refuses (record and reality disagree — the exact contract-lie shape this milestone kills), so the pre-swap peek is the only correct answer. Red-first: perri negative repro on ADD (fresh home + synthetic low core + high-floor manifest → CoreFloor refuse, registry untouched) + the UPDATE pre-swap refuse (live home byte-untouched) + a floor-met positive control (0.25.0-on-0.25.0 installs); + version_meets_floor table incl. the 0.9<0.25 trap.",
2026-08-28T09:54:46.2504456Z       "requiredStages": [
2026-08-28T09:54:46.2504615Z         "doc",
2026-08-28T09:54:46.2504766Z         "impl",
2026-08-28T09:54:46.2504920Z         "unit"
2026-08-28T09:54:46.2505067Z       ],
2026-08-28T09:54:46.2505220Z       "stages": {
2026-08-28T09:54:46.2505372Z         "doc": {
2026-08-28T09:54:46.2505535Z           "complete": true,
2026-08-28T09:54:46.2505701Z           "evidence": [
2026-08-28T09:54:46.2505846Z             {
2026-08-28T09:54:46.2506026Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2506292Z               "line": 43
2026-08-28T09:54:46.2506456Z             }
2026-08-28T09:54:46.2506607Z           ]
2026-08-28T09:54:46.2506756Z         },
2026-08-28T09:54:46.2506912Z         "impl": {
2026-08-28T09:54:46.2507073Z           "complete": true,
2026-08-28T09:54:46.2507237Z           "evidence": [
2026-08-28T09:54:46.2507383Z             {
2026-08-28T09:54:46.2507627Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2507851Z               "line": 126
2026-08-28T09:54:46.2508061Z             },
2026-08-28T09:54:46.2508284Z             {
2026-08-28T09:54:46.2508504Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.2508662Z               "line": 312
2026-08-28T09:54:46.2508810Z             },
2026-08-28T09:54:46.2509049Z             {
2026-08-28T09:54:46.2509242Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2509409Z               "line": 20891
2026-08-28T09:54:46.2509569Z             }
2026-08-28T09:54:46.2509736Z           ]
2026-08-28T09:54:46.2509955Z         },
2026-08-28T09:54:46.2510113Z         "int": {
2026-08-28T09:54:46.2510284Z           "complete": false,
2026-08-28T09:54:46.2510442Z           "evidence": []
2026-08-28T09:54:46.2510594Z         },
2026-08-28T09:54:46.2510742Z         "unit": {
2026-08-28T09:54:46.2510904Z           "complete": true,
2026-08-28T09:54:46.2511056Z           "evidence": [
2026-08-28T09:54:46.2511223Z             {
2026-08-28T09:54:46.2511433Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2511587Z               "line": 2464
2026-08-28T09:54:46.2511742Z             },
2026-08-28T09:54:46.2511887Z             {
2026-08-28T09:54:46.2512100Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.2512257Z               "line": 998
2026-08-28T09:54:46.2512407Z             },
2026-08-28T09:54:46.2512555Z             {
2026-08-28T09:54:46.2512760Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.2512923Z               "line": 1034
2026-08-28T09:54:46.2513205Z             },
2026-08-28T09:54:46.2513356Z             {
2026-08-28T09:54:46.2513534Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2513699Z               "line": 27878
2026-08-28T09:54:46.2513844Z             },
2026-08-28T09:54:46.2514000Z             {
2026-08-28T09:54:46.2514192Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2514348Z               "line": 27908
2026-08-28T09:54:46.2514497Z             }
2026-08-28T09:54:46.2514643Z           ]
2026-08-28T09:54:46.2514800Z         }
2026-08-28T09:54:46.2514950Z       }
2026-08-28T09:54:46.2515107Z     },
2026-08-28T09:54:46.2515256Z     {
2026-08-28T09:54:46.2515461Z       "id": "REQ-ADAPTER-FLOOR-VS-STAGED-CORE",
2026-08-28T09:54:46.2547509Z       "title": "IN A COMPOSITE UPDATE, AN ADAPTER'S CORE-VERSION FLOOR IS JUDGED AGAINST THE CORE THAT RUN WILL ACTIVATE, NOT THE ONE CURRENTLY RUNNING (releases#159, doyle ruling 2026-08-21). THIS DELIVERS A CONTRACT ALREADY RULED AND NEVER SATISFIED, which is what the lane is FOR: CONTEXT.md's adapter-manifest-header entry has said since the glossary was written that `when spt-core self-updates, re-verify adapters still satisfy (coordinate core + adapter updates when needed)` — the code never did. Same shape as F-5 itself (REQ-ADAPTER-FLOOR-ENFORCE), where the floor was PARSED and REQUIRED and never compared: a dead rule, not a missing one. THE DEFECT: `spt update` plans FetchApply -> Adapters, and `spt update --restart` plans Fetch -> Adapters -> Finish; in BOTH the adapters leg runs while the NEW core is staged and the invoking CLI is still the OLD image, so a floor comparison against `env!(CARGO_PKG_VERSION)` asks a question about a core that is on its way out. An adapter whose floor the INCOMING core satisfies is therefore refused in-cycle, and the run then activates that very core and leaves the OLD adapter sitting on it — the refusal protected nothing, it deferred the pairing it was meant to enforce, ungated, into a state nobody checks again. FIX: `cmd_adapter_update` takes the comparison version as a PARAMETER instead of baking `env!`; the composite leg passes the STAGED release's `product_version`, read from the VERIFIED signed metadata via `ReleaseCache::staged_update` (`UpdateSetMetadata` / `ReleaseMetadata`). SINGLE-PASS, NOT A RE-SWEEP (doyle): a post-finish second sweep can itself fail half-rolled, so the one pass judges against the truth it already holds — and the CONTEXT.md clause above is amended to state that cadence, because a glossary sentence whose cadence a future implementer could build against would authorize the refused re-sweep with the glossary's own authority behind it. BOTH COMPARISON SITES INSIDE THAT FUNCTION TAKE THE PARAMETER (doyle confirmation 2026-08-22, dated to the confirmation and not to the lane: the correction postdates the ruled shape it corrects) — (a) the pre-swap peek `staged_floor_ok`, and (b) the post-swap re-register, which moves from `registry::register` (the `env!`-baking wrapper) to the already-public `registry::register_with_core` seam beneath it. (b) IS LOAD-BEARING, NOT TIDINESS: fixing only (a) admits the adapter at the peek, crc-swaps the new bits into the live pointer-mode home, and THEN refuses at the record against the old running core — live files new, registry record old, reported as FAILED. That is the record-and-reality disagreement REQ-ADAPTER-FLOOR-ENFORCE's own pre-swap-peek bind exists to prevent, reached from the other side, and it is strictly worse than the bug this requirement fixes (today's refusal is clean and byte-untouched). One value, two consumers, SO THE PEEK AND THE RECORD CANNOT DISAGREE ABOUT WHICH CORE THEY JUDGED AGAINST — that property is what makes this a fix rather than a second gate to keep in sync, and it is why the parameter is THREADED rather than each site reading the staged metadata for itself. THE BARE VERB IS UNCHANGED: `spt adapter update` (cli.rs AdapterCmd::Update) and its `spt update adapters` alias keep passing the running CLI's version — with no update in flight the installed core IS the right question — and both call sites are pinned as unchanged. `spt adapter add` is untouched: no staged core exists on that path. FAIL OPEN, ON THE NEW INPUT ONLY (doyle): an unreadable staged version degrades LOUDLY to the running-CLI comparison — an absent answer is not a zero, and an empty string is never compared against a floor — while `staged_floor_ok`'s deliberate FAIL-CLOSED arm for an unverifiable STAGED MANIFEST floor (REQ-ADAPTER-FLOOR-ENFORCE) is NOT touched. ONE ARM, THREE DIAGNOSTICS (doyle Q1 ruling, extended 2026-08-22 by measurement): an absent stage, an empty `product_version` (`#[serde(default)]` on both metadata types — pre-v0.3.2 releases really do parse to an empty string), and metadata that parses as NEITHER type all take the SAME degrade to the running core but must NOT share a message, because the operator's next step differs: nothing to do, an old release, and inspect your stage. The third states the FACT and points AT the stage without diagnosing it, borrowing 'malformed' from the apply leg's own vocabulary so two arms of one run never name the same corrupt artifact differently; the second offers predating-the-field as the LIKELY cause rather than the certain one, since any producer omitting the key yields the identical empty string. MERGING THE THIRD INTO THE SECOND IS SPECIFICALLY FORBIDDEN: telling an operator their release predates a field when the artifact is DAMAGED is a benign explanation offered for a corruption condition. THE THIRD ARM IS DEFENCE IN DEPTH AGAINST A STATE THE RUN SHOULD ALREADY HAVE REFUSED, and this is recorded here because the arm will otherwise look like dead code to the next reader and be deleted: in a COMPOSITE it is almost unreachable BY CONSTRUCTION — the core legs reject a malformed stage as a FAULT (RejectReason::Malformed, UPDATE_APPLY_REJECTED, exit 1 and not 3, since an integrity failure is not a policy decline) and composite_abort_on_failure is true for BOTH FetchApply and Fetch, so the run aborts before an adapters leg exists. It is reached only when a core leg exited 0 over an already-corrupt stage (a fetch with nothing new to pull) or when the stage changed after that leg ran, which is why its sentence names both possibilities and asserts neither. MEASURED REACHABILITY, one door only (relcache.rs:330-351): corruption at the SignedRelease envelope dies at `.ok()?` and yields None, indistinguishable from no stage and correctly reported as such — only inner metadata that parses as neither type, WITH an artifact on disk, falls to the `else if` and reaches the seam as Some. READING `product_version` HERE DOES NOT VIOLATE ITS OWN WARNING, stated in this title so the next reader meets the warning before they meet the use: that field's doc forbids using it to decide WHICH RELEASE IS NEWER — the monotonic `version` counter is the ordering authority and this requirement does not touch ordering — it does not forbid reading it as the semver a declared floor is compared against, provided it comes from the verified signed metadata, which is the only place this reads it from. Gate: doc — the CONTEXT.md adapter-manifest-header clause restated as the ruled cadence (the sentence this requirement delivers), the CONTEXT.md update-composite entry's floor-gate phrase, and MANIFEST.md's enforcement note, each naming WHICH core the floor is judged against; impl — the comparison-version parameter on `cmd_adapter_update` threaded to both the peek and `register_with_core`, the composite leg's staged-version read off the verified metadata, and the two-diagnostic loud degrade; unit — an adapter flooring on the FETCHED core is ADMITTED by the composite AND its record registers at the new version, the bare verb and its alias still compare against the running CLI, and the empty-`product_version` and absent-stage degrades each render their own diagnostic and fall back rather than refusing.",
2026-08-28T09:54:46.2548129Z       "requiredStages": [
2026-08-28T09:54:46.2548285Z         "doc",
2026-08-28T09:54:46.2548444Z         "impl",
2026-08-28T09:54:46.2548682Z         "unit"
2026-08-28T09:54:46.2548829Z       ],
2026-08-28T09:54:46.2549069Z       "stages": {
2026-08-28T09:54:46.2549219Z         "doc": {
2026-08-28T09:54:46.2549386Z           "complete": true,
2026-08-28T09:54:46.2549538Z           "evidence": [
2026-08-28T09:54:46.2549691Z             {
2026-08-28T09:54:46.2549867Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2550011Z               "line": 76
2026-08-28T09:54:46.2550163Z             },
2026-08-28T09:54:46.2550306Z             {
2026-08-28T09:54:46.2550482Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2550646Z               "line": 682
2026-08-28T09:54:46.2550793Z             },
2026-08-28T09:54:46.2550946Z             {
2026-08-28T09:54:46.2551116Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2551280Z               "line": 52
2026-08-28T09:54:46.2551426Z             }
2026-08-28T09:54:46.2551582Z           ]
2026-08-28T09:54:46.2551733Z         },
2026-08-28T09:54:46.2551895Z         "impl": {
2026-08-28T09:54:46.2552062Z           "complete": true,
2026-08-28T09:54:46.2552224Z           "evidence": [
2026-08-28T09:54:46.2552372Z             {
2026-08-28T09:54:46.2552564Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2552724Z               "line": 2433
2026-08-28T09:54:46.2552874Z             },
2026-08-28T09:54:46.2553021Z             {
2026-08-28T09:54:46.2553203Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2553359Z               "line": 9389
2026-08-28T09:54:46.2553508Z             },
2026-08-28T09:54:46.2553659Z             {
2026-08-28T09:54:46.2553837Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2554002Z               "line": 20682
2026-08-28T09:54:46.2554137Z             },
2026-08-28T09:54:46.2554288Z             {
2026-08-28T09:54:46.2554469Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2554624Z               "line": 20789
2026-08-28T09:54:46.2554896Z             },
2026-08-28T09:54:46.2555053Z             {
2026-08-28T09:54:46.2555240Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2555397Z               "line": 20808
2026-08-28T09:54:46.2555550Z             },
2026-08-28T09:54:46.2555707Z             {
2026-08-28T09:54:46.2555883Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2556045Z               "line": 20832
2026-08-28T09:54:46.2556193Z             },
2026-08-28T09:54:46.2556346Z             {
2026-08-28T09:54:46.2556522Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2556680Z               "line": 20892
2026-08-28T09:54:46.2556837Z             },
2026-08-28T09:54:46.2556978Z             {
2026-08-28T09:54:46.2557163Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2557314Z               "line": 21484
2026-08-28T09:54:46.2557469Z             },
2026-08-28T09:54:46.2557605Z             {
2026-08-28T09:54:46.2557773Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2557925Z               "line": 21568
2026-08-28T09:54:46.2558083Z             },
2026-08-28T09:54:46.2558230Z             {
2026-08-28T09:54:46.2558407Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2558569Z               "line": 21730
2026-08-28T09:54:46.2558712Z             }
2026-08-28T09:54:46.2558864Z           ]
2026-08-28T09:54:46.2559093Z         },
2026-08-28T09:54:46.2559252Z         "int": {
2026-08-28T09:54:46.2559417Z           "complete": false,
2026-08-28T09:54:46.2559581Z           "evidence": []
2026-08-28T09:54:46.2559727Z         },
2026-08-28T09:54:46.2559879Z         "unit": {
2026-08-28T09:54:46.2560047Z           "complete": true,
2026-08-28T09:54:46.2560203Z           "evidence": [
2026-08-28T09:54:46.2560357Z             {
2026-08-28T09:54:46.2560538Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2560691Z               "line": 27926
2026-08-28T09:54:46.2560838Z             },
2026-08-28T09:54:46.2560990Z             {
2026-08-28T09:54:46.2561177Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2561487Z               "line": 27970
2026-08-28T09:54:46.2561643Z             },
2026-08-28T09:54:46.2561786Z             {
2026-08-28T09:54:46.2561967Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2562124Z               "line": 27993
2026-08-28T09:54:46.2562275Z             },
2026-08-28T09:54:46.2562426Z             {
2026-08-28T09:54:46.2562608Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2562765Z               "line": 28017
2026-08-28T09:54:46.2562919Z             },
2026-08-28T09:54:46.2563075Z             {
2026-08-28T09:54:46.2563257Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2563414Z               "line": 28058
2026-08-28T09:54:46.2563562Z             }
2026-08-28T09:54:46.2563714Z           ]
2026-08-28T09:54:46.2563857Z         }
2026-08-28T09:54:46.2564014Z       }
2026-08-28T09:54:46.2564158Z     },
2026-08-28T09:54:46.2564310Z     {
2026-08-28T09:54:46.2564501Z       "id": "REQ-ADAPTER-GH-TRANSPORT",
2026-08-28T09:54:46.2566548Z       "title": "The `gh_release` avenue (and `spt adapter add --release`) gain a fetch `transport`: `https` (current reqwest direct, public), `gh` (shell the pre-authorized `gh` CLI — the private-repo path; `gh` honors OAuth and `GH_TOKEN`, so spt custodies no token), or `auto` (default: prefer `gh` when installed+authed, else HTTPS). `--gh`/`--https` force it on `add`. Additive over the existing fetch path; verify->extract->register downstream is unchanged. (v0.13.2)",
2026-08-28T09:54:46.2566720Z       "requiredStages": [
2026-08-28T09:54:46.2566872Z         "doc",
2026-08-28T09:54:46.2567026Z         "impl",
2026-08-28T09:54:46.2567178Z         "unit"
2026-08-28T09:54:46.2567321Z       ],
2026-08-28T09:54:46.2567481Z       "stages": {
2026-08-28T09:54:46.2567629Z         "doc": {
2026-08-28T09:54:46.2567794Z           "complete": true,
2026-08-28T09:54:46.2567951Z           "evidence": [
2026-08-28T09:54:46.2568218Z             {
2026-08-28T09:54:46.2568390Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2568563Z               "line": 104
2026-08-28T09:54:46.2568715Z             },
2026-08-28T09:54:46.2568863Z             {
2026-08-28T09:54:46.2569134Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2569296Z               "line": 658
2026-08-28T09:54:46.2569448Z             }
2026-08-28T09:54:46.2569592Z           ]
2026-08-28T09:54:46.2569744Z         },
2026-08-28T09:54:46.2569893Z         "impl": {
2026-08-28T09:54:46.2570059Z           "complete": true,
2026-08-28T09:54:46.2570217Z           "evidence": [
2026-08-28T09:54:46.2570368Z             {
2026-08-28T09:54:46.2570584Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2570739Z               "line": 755
2026-08-28T09:54:46.2570897Z             },
2026-08-28T09:54:46.2571044Z             {
2026-08-28T09:54:46.2571256Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2571422Z               "line": 811
2026-08-28T09:54:46.2571574Z             },
2026-08-28T09:54:46.2571732Z             {
2026-08-28T09:54:46.2571913Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2572071Z               "line": 9706
2026-08-28T09:54:46.2572217Z             },
2026-08-28T09:54:46.2572376Z             {
2026-08-28T09:54:46.2572556Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2572713Z               "line": 9728
2026-08-28T09:54:46.2572868Z             },
2026-08-28T09:54:46.2573021Z             {
2026-08-28T09:54:46.2573206Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2573359Z               "line": 10183
2026-08-28T09:54:46.2573512Z             },
2026-08-28T09:54:46.2573660Z             {
2026-08-28T09:54:46.2573840Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2573999Z               "line": 10195
2026-08-28T09:54:46.2574151Z             },
2026-08-28T09:54:46.2574304Z             {
2026-08-28T09:54:46.2574484Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2574779Z               "line": 10224
2026-08-28T09:54:46.2574938Z             },
2026-08-28T09:54:46.2575075Z             {
2026-08-28T09:54:46.2575258Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2575408Z               "line": 10458
2026-08-28T09:54:46.2575556Z             },
2026-08-28T09:54:46.2575698Z             {
2026-08-28T09:54:46.2575883Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2576036Z               "line": 20310
2026-08-28T09:54:46.2576187Z             },
2026-08-28T09:54:46.2576336Z             {
2026-08-28T09:54:46.2576517Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2576680Z               "line": 21590
2026-08-28T09:54:46.2576822Z             },
2026-08-28T09:54:46.2576974Z             {
2026-08-28T09:54:46.2577151Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2577313Z               "line": 21798
2026-08-28T09:54:46.2577461Z             },
2026-08-28T09:54:46.2577604Z             {
2026-08-28T09:54:46.2577796Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2577957Z               "line": 21868
2026-08-28T09:54:46.2578108Z             },
2026-08-28T09:54:46.2578255Z             {
2026-08-28T09:54:46.2578435Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2578589Z               "line": 21894
2026-08-28T09:54:46.2578740Z             }
2026-08-28T09:54:46.2578884Z           ]
2026-08-28T09:54:46.2579123Z         },
2026-08-28T09:54:46.2579275Z         "int": {
2026-08-28T09:54:46.2579442Z           "complete": false,
2026-08-28T09:54:46.2579604Z           "evidence": []
2026-08-28T09:54:46.2579752Z         },
2026-08-28T09:54:46.2579909Z         "unit": {
2026-08-28T09:54:46.2580067Z           "complete": true,
2026-08-28T09:54:46.2580232Z           "evidence": [
2026-08-28T09:54:46.2580382Z             {
2026-08-28T09:54:46.2580566Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2580899Z               "line": 25779
2026-08-28T09:54:46.2581052Z             },
2026-08-28T09:54:46.2581214Z             {
2026-08-28T09:54:46.2581391Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2581552Z               "line": 25797
2026-08-28T09:54:46.2581696Z             },
2026-08-28T09:54:46.2581848Z             {
2026-08-28T09:54:46.2582030Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2582191Z               "line": 25993
2026-08-28T09:54:46.2582345Z             },
2026-08-28T09:54:46.2582492Z             {
2026-08-28T09:54:46.2582674Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2582835Z               "line": 26009
2026-08-28T09:54:46.2582984Z             },
2026-08-28T09:54:46.2583130Z             {
2026-08-28T09:54:46.2583316Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2583471Z               "line": 26036
2026-08-28T09:54:46.2583623Z             },
2026-08-28T09:54:46.2583776Z             {
2026-08-28T09:54:46.2583958Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2584128Z               "line": 26063
2026-08-28T09:54:46.2584278Z             }
2026-08-28T09:54:46.2584433Z           ]
2026-08-28T09:54:46.2584578Z         }
2026-08-28T09:54:46.2584730Z       }
2026-08-28T09:54:46.2584878Z     },
2026-08-28T09:54:46.2585031Z     {
2026-08-28T09:54:46.2585212Z       "id": "REQ-ADAPTER-LIVE-UPDATE",
2026-08-28T09:54:46.2589778Z       "title": "An adapter update is live and daemon-coordinated (the adapter analog of brain self-update, ADR-0004): for an endpoint with a running RESIDENT adapter binary (today the `[message-idle-translation-binary]`), the CLI keeps fetch+verify and hands the APPLY to the daemon over IPC, which per affected endpoint (1) STOPS the resident binary -> releases the OS file lock (fixes the Windows 'Access denied (os error 5)' overwrite failure), (2) swaps on disk ONLY files whose CRC differs from the staged archive (unchanged files + their still-running binaries untouched), (3) RE-CLONES the new on-disk manifest into the running `BrainLifecycle` (the in-memory manifest is cached at bringup and otherwise goes stale -> binaries+manifest back on the same page), (4) RESTARTS the resident binary from the new files. An endpoint NOT running -> CLI swaps directly (no lock, no cache). Only the resident class is cycled; ephemeral adapter binaries (Psyche loop, `[digest]` extractor, `[session.*]` runners, hooks) self-heal on next spawn and are excluded. The daemon keeps a per-endpoint registry of resident adapter children. (ADR-0025, v0.13.2)",
2026-08-28T09:54:46.2590078Z       "requiredStages": [
2026-08-28T09:54:46.2590235Z         "doc",
2026-08-28T09:54:46.2590383Z         "impl",
2026-08-28T09:54:46.2590545Z         "unit",
2026-08-28T09:54:46.2590698Z         "int"
2026-08-28T09:54:46.2590850Z       ],
2026-08-28T09:54:46.2591004Z       "stages": {
2026-08-28T09:54:46.2591155Z         "doc": {
2026-08-28T09:54:46.2591323Z           "complete": true,
2026-08-28T09:54:46.2591478Z           "evidence": [
2026-08-28T09:54:46.2591636Z             {
2026-08-28T09:54:46.2591927Z               "path": "docs/adr/0025-live-daemon-coordinated-adapter-update.md",
2026-08-28T09:54:46.2592093Z               "line": 3
2026-08-28T09:54:46.2592243Z             },
2026-08-28T09:54:46.2592404Z             {
2026-08-28T09:54:46.2592690Z               "path": "docs/adr/0025-live-daemon-coordinated-adapter-update.md",
2026-08-28T09:54:46.2592847Z               "line": 44
2026-08-28T09:54:46.2593005Z             }
2026-08-28T09:54:46.2593153Z           ]
2026-08-28T09:54:46.2593300Z         },
2026-08-28T09:54:46.2593453Z         "impl": {
2026-08-28T09:54:46.2593619Z           "complete": true,
2026-08-28T09:54:46.2593776Z           "evidence": [
2026-08-28T09:54:46.2593932Z             {
2026-08-28T09:54:46.2594136Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.2594293Z               "line": 1785
2026-08-28T09:54:46.2594445Z             },
2026-08-28T09:54:46.2594594Z             {
2026-08-28T09:54:46.2594933Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2595100Z               "line": 4417
2026-08-28T09:54:46.2595257Z             },
2026-08-28T09:54:46.2595404Z             {
2026-08-28T09:54:46.2595614Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2595777Z               "line": 4488
2026-08-28T09:54:46.2595929Z             },
2026-08-28T09:54:46.2596078Z             {
2026-08-28T09:54:46.2596272Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2596440Z               "line": 5308
2026-08-28T09:54:46.2596586Z             },
2026-08-28T09:54:46.2596743Z             {
2026-08-28T09:54:46.2596945Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2597104Z               "line": 5590
2026-08-28T09:54:46.2597255Z             },
2026-08-28T09:54:46.2597409Z             {
2026-08-28T09:54:46.2597613Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2597775Z               "line": 5603
2026-08-28T09:54:46.2597928Z             },
2026-08-28T09:54:46.2598076Z             {
2026-08-28T09:54:46.2598276Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2598433Z               "line": 5812
2026-08-28T09:54:46.2598581Z             },
2026-08-28T09:54:46.2598734Z             {
2026-08-28T09:54:46.2598931Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2599167Z               "line": 9452
2026-08-28T09:54:46.2599319Z             },
2026-08-28T09:54:46.2599470Z             {
2026-08-28T09:54:46.2599670Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.2599832Z               "line": 37
2026-08-28T09:54:46.2599985Z             },
2026-08-28T09:54:46.2600132Z             {
2026-08-28T09:54:46.2600362Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.2600524Z               "line": 106
2026-08-28T09:54:46.2600666Z             },
2026-08-28T09:54:46.2600805Z             {
2026-08-28T09:54:46.2601015Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2601300Z               "line": 587
2026-08-28T09:54:46.2601453Z             },
2026-08-28T09:54:46.2601606Z             {
2026-08-28T09:54:46.2601812Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2601981Z               "line": 613
2026-08-28T09:54:46.2602129Z             },
2026-08-28T09:54:46.2602273Z             {
2026-08-28T09:54:46.2602478Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2602639Z               "line": 730
2026-08-28T09:54:46.2602793Z             },
2026-08-28T09:54:46.2602940Z             {
2026-08-28T09:54:46.2603146Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2603302Z               "line": 738
2026-08-28T09:54:46.2603456Z             },
2026-08-28T09:54:46.2603598Z             {
2026-08-28T09:54:46.2603808Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2603965Z               "line": 757
2026-08-28T09:54:46.2604123Z             },
2026-08-28T09:54:46.2604274Z             {
2026-08-28T09:54:46.2604460Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.2604619Z               "line": 520
2026-08-28T09:54:46.2604768Z             },
2026-08-28T09:54:46.2604924Z             {
2026-08-28T09:54:46.2605117Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.2605277Z               "line": 526
2026-08-28T09:54:46.2605422Z             },
2026-08-28T09:54:46.2605573Z             {
2026-08-28T09:54:46.2605774Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.2605931Z               "line": 561
2026-08-28T09:54:46.2606079Z             },
2026-08-28T09:54:46.2606226Z             {
2026-08-28T09:54:46.2606403Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2606555Z               "line": 20726
2026-08-28T09:54:46.2606700Z             },
2026-08-28T09:54:46.2606958Z             {
2026-08-28T09:54:46.2607141Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2607308Z               "line": 20939
2026-08-28T09:54:46.2607449Z             },
2026-08-28T09:54:46.2607597Z             {
2026-08-28T09:54:46.2607778Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2607941Z               "line": 21166
2026-08-28T09:54:46.2608083Z             }
2026-08-28T09:54:46.2608246Z           ]
2026-08-28T09:54:46.2608398Z         },
2026-08-28T09:54:46.2608551Z         "int": {
2026-08-28T09:54:46.2608713Z           "complete": true,
2026-08-28T09:54:46.2608871Z           "evidence": [
2026-08-28T09:54:46.2609098Z             {
2026-08-28T09:54:46.2609375Z               "path": "crates/spt/tests/live_adapt_translation_swap_e2e.rs",
2026-08-28T09:54:46.2609538Z               "line": 93
2026-08-28T09:54:46.2609684Z             }
2026-08-28T09:54:46.2609837Z           ]
2026-08-28T09:54:46.2609987Z         },
2026-08-28T09:54:46.2610140Z         "unit": {
2026-08-28T09:54:46.2610311Z           "complete": true,
2026-08-28T09:54:46.2610469Z           "evidence": [
2026-08-28T09:54:46.2610617Z             {
2026-08-28T09:54:46.2610817Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2610978Z               "line": 12484
2026-08-28T09:54:46.2611132Z             },
2026-08-28T09:54:46.2611284Z             {
2026-08-28T09:54:46.2611476Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2611641Z               "line": 12527
2026-08-28T09:54:46.2611805Z             },
2026-08-28T09:54:46.2611965Z             {
2026-08-28T09:54:46.2612171Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2612333Z               "line": 12568
2026-08-28T09:54:46.2612491Z             },
2026-08-28T09:54:46.2612641Z             {
2026-08-28T09:54:46.2612852Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.2613014Z               "line": 325
2026-08-28T09:54:46.2613162Z             },
2026-08-28T09:54:46.2613319Z             {
2026-08-28T09:54:46.2613643Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.2613805Z               "line": 356
2026-08-28T09:54:46.2613953Z             },
2026-08-28T09:54:46.2614110Z             {
2026-08-28T09:54:46.2614307Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.2614468Z               "line": 379
2026-08-28T09:54:46.2614621Z             },
2026-08-28T09:54:46.2614768Z             {
2026-08-28T09:54:46.2614977Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.2615132Z               "line": 431
2026-08-28T09:54:46.2615285Z             },
2026-08-28T09:54:46.2615433Z             {
2026-08-28T09:54:46.2615648Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2615809Z               "line": 3971
2026-08-28T09:54:46.2615967Z             },
2026-08-28T09:54:46.2616119Z             {
2026-08-28T09:54:46.2616325Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2616496Z               "line": 4010
2026-08-28T09:54:46.2616648Z             },
2026-08-28T09:54:46.2616800Z             {
2026-08-28T09:54:46.2617006Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2617169Z               "line": 4056
2026-08-28T09:54:46.2617316Z             },
2026-08-28T09:54:46.2617465Z             {
2026-08-28T09:54:46.2617673Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2617830Z               "line": 4090
2026-08-28T09:54:46.2617980Z             },
2026-08-28T09:54:46.2618128Z             {
2026-08-28T09:54:46.2618333Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.2618486Z               "line": 4142
2026-08-28T09:54:46.2618643Z             },
2026-08-28T09:54:46.2618797Z             {
2026-08-28T09:54:46.2619063Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2619225Z               "line": 38791
2026-08-28T09:54:46.2619483Z             },
2026-08-28T09:54:46.2619640Z             {
2026-08-28T09:54:46.2619827Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2619987Z               "line": 38960
2026-08-28T09:54:46.2620136Z             },
2026-08-28T09:54:46.2620292Z             {
2026-08-28T09:54:46.2620473Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2620632Z               "line": 38992
2026-08-28T09:54:46.2620781Z             }
2026-08-28T09:54:46.2620933Z           ]
2026-08-28T09:54:46.2621087Z         }
2026-08-28T09:54:46.2621233Z       }
2026-08-28T09:54:46.2621377Z     },
2026-08-28T09:54:46.2621520Z     {
2026-08-28T09:54:46.2621730Z       "id": "REQ-ADAPTER-MULTIPLATFORM-SPT",
2026-08-28T09:54:46.2625988Z       "title": "A `.spt` adapter archive may pack multiple platforms in one signed asset: shared `manifest.toml` + `strings/` at the root, role binaries under per-Rust-target-triple subdirectories (ADR-0016 triple vocabulary, e.g. `x86_64-pc-windows-msvc/`); install/update extracts the shared root plus ONLY `current_platform()`'s triple subdir, flattened into `install_dir` so flat `<install_dir>/<program>` resolution (REQ-INSTALL-11) is unchanged. Name stays `adapter.spt` (plain-tar or gzip, `--asset` optional default); one whole-archive Ed25519 signature over the fat archive (REQ-UPD-9 single-artifact verify). A legacy flat archive (no triple subdirs) extracts as today (free back-compat); a multi-platform archive sets `min_spt_core_version >= 0.13.2` (forward-compat gate, readable before extract); a multi-platform archive missing the recipient's triple -> typed `NoArtifactForPlatform`, never a silent no-op. Large adapters may still split per-platform (single-triple archives via `--asset`, or ADR-0016 update-set machinery). (ADR-0024, v0.13.2)",
2026-08-28T09:54:46.2626174Z       "requiredStages": [
2026-08-28T09:54:46.2626322Z         "doc",
2026-08-28T09:54:46.2626480Z         "impl",
2026-08-28T09:54:46.2626631Z         "unit",
2026-08-28T09:54:46.2626785Z         "int"
2026-08-28T09:54:46.2626937Z       ],
2026-08-28T09:54:46.2627099Z       "stages": {
2026-08-28T09:54:46.2627370Z         "doc": {
2026-08-28T09:54:46.2627533Z           "complete": true,
2026-08-28T09:54:46.2627695Z           "evidence": [
2026-08-28T09:54:46.2627843Z             {
2026-08-28T09:54:46.2628125Z               "path": "docs/adr/0024-multi-platform-adapter-spt-packaging.md",
2026-08-28T09:54:46.2628280Z               "line": 3
2026-08-28T09:54:46.2628433Z             }
2026-08-28T09:54:46.2628579Z           ]
2026-08-28T09:54:46.2628732Z         },
2026-08-28T09:54:46.2628884Z         "impl": {
2026-08-28T09:54:46.2629137Z           "complete": true,
2026-08-28T09:54:46.2629298Z           "evidence": [
2026-08-28T09:54:46.2629447Z             {
2026-08-28T09:54:46.2629656Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.2629813Z               "line": 259
2026-08-28T09:54:46.2629966Z             },
2026-08-28T09:54:46.2630109Z             {
2026-08-28T09:54:46.2630316Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2630485Z               "line": 10301
2026-08-28T09:54:46.2630630Z             },
2026-08-28T09:54:46.2630781Z             {
2026-08-28T09:54:46.2630957Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2631117Z               "line": 10391
2026-08-28T09:54:46.2631265Z             }
2026-08-28T09:54:46.2631413Z           ]
2026-08-28T09:54:46.2631564Z         },
2026-08-28T09:54:46.2631718Z         "int": {
2026-08-28T09:54:46.2631879Z           "complete": true,
2026-08-28T09:54:46.2632037Z           "evidence": [
2026-08-28T09:54:46.2632185Z             {
2026-08-28T09:54:46.2632361Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2632518Z               "line": 38626
2026-08-28T09:54:46.2632667Z             },
2026-08-28T09:54:46.2632819Z             {
2026-08-28T09:54:46.2632996Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2633158Z               "line": 38690
2026-08-28T09:54:46.2633419Z             },
2026-08-28T09:54:46.2633569Z             {
2026-08-28T09:54:46.2633752Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2633910Z               "line": 38733
2026-08-28T09:54:46.2634057Z             }
2026-08-28T09:54:46.2634207Z           ]
2026-08-28T09:54:46.2634357Z         },
2026-08-28T09:54:46.2634502Z         "unit": {
2026-08-28T09:54:46.2634672Z           "complete": true,
2026-08-28T09:54:46.2634836Z           "evidence": [
2026-08-28T09:54:46.2634987Z             {
2026-08-28T09:54:46.2635165Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2635321Z               "line": 38561
2026-08-28T09:54:46.2635475Z             },
2026-08-28T09:54:46.2635622Z             {
2026-08-28T09:54:46.2635809Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2635964Z               "line": 38578
2026-08-28T09:54:46.2636117Z             }
2026-08-28T09:54:46.2636276Z           ]
2026-08-28T09:54:46.2636463Z         }
2026-08-28T09:54:46.2636629Z       }
2026-08-28T09:54:46.2636777Z     },
2026-08-28T09:54:46.2636934Z     {
2026-08-28T09:54:46.2637125Z       "id": "REQ-ADAPTER-PROOF-DIR-OVERRIDE",
2026-08-28T09:54:46.2639505Z       "title": "The author-time proof commands (`spt adapter digest-proof`, `spt adapter translate-proof`) gain a `--dir <path>` / `--manifest <file>` override so an author proofs a DEV binary against an on-disk manifest+install dir WITHOUT staging a full extracted GhReleaseManaged install (mirrors digest-proof's `--sample` pointing straight at a file). Fixes perri F-011: a bare-file-added gh_release adapter currently can't be resolved by the *-proof commands ('manifest is not present yet at <dir>'); un-stales the bare-file digest-proof int. (perri F-011, v0.13.x DX)",
2026-08-28T09:54:46.2639692Z       "requiredStages": [
2026-08-28T09:54:46.2639844Z         "doc",
2026-08-28T09:54:46.2639997Z         "impl",
2026-08-28T09:54:46.2640140Z         "unit",
2026-08-28T09:54:46.2643433Z         "int"
2026-08-28T09:54:46.2643641Z       ],
2026-08-28T09:54:46.2643809Z       "stages": {
2026-08-28T09:54:46.2644119Z         "doc": {
2026-08-28T09:54:46.2644284Z           "complete": true,
2026-08-28T09:54:46.2644447Z           "evidence": [
2026-08-28T09:54:46.2644594Z             {
2026-08-28T09:54:46.2644848Z               "path": "docs-site/src/harness-contract/patterns.md",
2026-08-28T09:54:46.2645004Z               "line": 369
2026-08-28T09:54:46.2645157Z             },
2026-08-28T09:54:46.2645305Z             {
2026-08-28T09:54:46.2645485Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2645648Z               "line": 310
2026-08-28T09:54:46.2645791Z             }
2026-08-28T09:54:46.2645944Z           ]
2026-08-28T09:54:46.2646087Z         },
2026-08-28T09:54:46.2646249Z         "impl": {
2026-08-28T09:54:46.2646407Z           "complete": true,
2026-08-28T09:54:46.2646571Z           "evidence": [
2026-08-28T09:54:46.2646719Z             {
2026-08-28T09:54:46.2646902Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2647067Z               "line": 20636
2026-08-28T09:54:46.2647217Z             },
2026-08-28T09:54:46.2647366Z             {
2026-08-28T09:54:46.2647542Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2647700Z               "line": 20648
2026-08-28T09:54:46.2647842Z             },
2026-08-28T09:54:46.2647991Z             {
2026-08-28T09:54:46.2648167Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2648324Z               "line": 21948
2026-08-28T09:54:46.2648472Z             }
2026-08-28T09:54:46.2648621Z           ]
2026-08-28T09:54:46.2648767Z         },
2026-08-28T09:54:46.2648912Z         "int": {
2026-08-28T09:54:46.2649179Z           "complete": true,
2026-08-28T09:54:46.2649334Z           "evidence": [
2026-08-28T09:54:46.2649482Z             {
2026-08-28T09:54:46.2649699Z               "path": "crates/spt/tests/translate_proof.rs",
2026-08-28T09:54:46.2649861Z               "line": 161
2026-08-28T09:54:46.2650009Z             }
2026-08-28T09:54:46.2650267Z           ]
2026-08-28T09:54:46.2650423Z         },
2026-08-28T09:54:46.2650576Z         "unit": {
2026-08-28T09:54:46.2650738Z           "complete": true,
2026-08-28T09:54:46.2650895Z           "evidence": [
2026-08-28T09:54:46.2651043Z             {
2026-08-28T09:54:46.2651224Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2651387Z               "line": 25898
2026-08-28T09:54:46.2651535Z             }
2026-08-28T09:54:46.2651678Z           ]
2026-08-28T09:54:46.2651826Z         }
2026-08-28T09:54:46.2651972Z       }
2026-08-28T09:54:46.2652120Z     },
2026-08-28T09:54:46.2652266Z     {
2026-08-28T09:54:46.2652476Z       "id": "REQ-ADAPTER-TEMPLATE-KEY-VALIDATION",
2026-08-28T09:54:46.2655840Z       "title": "P-1 core half (WORKER-TRUTH triage): `adapter add`/`adapter update` validate every declared role template — command, cwd, and [env] inject values — against the substitution-key catalog (spt-runtime BASE_KEYS + role-specific overrides) and REFUSE registration naming the offending key + role (fail-fast family of the [strings] pointer validation). Field driver: flynn's psyche died on the RETIRED {psyche_dir} key (adapter psyche_resume carried the old psyche_init cwd shape) — a permanent template config fault must die loudly at registration, not at the Nth per-event psyche turn via the 3-strike budget. The catalog stays the single source (runtime.rs FILL_KEYS — 'a catalog key must have a real fill'); validation reads it, never a second list.",
2026-08-28T09:54:46.2656036Z       "requiredStages": [
2026-08-28T09:54:46.2656189Z         "impl",
2026-08-28T09:54:46.2656342Z         "unit",
2026-08-28T09:54:46.2656489Z         "int"
2026-08-28T09:54:46.2656638Z       ],
2026-08-28T09:54:46.2656789Z       "stages": {
2026-08-28T09:54:46.2656943Z         "doc": {
2026-08-28T09:54:46.2657103Z           "complete": false,
2026-08-28T09:54:46.2657265Z           "evidence": []
2026-08-28T09:54:46.2657411Z         },
2026-08-28T09:54:46.2657569Z         "impl": {
2026-08-28T09:54:46.2657735Z           "complete": true,
2026-08-28T09:54:46.2657889Z           "evidence": [
2026-08-28T09:54:46.2658151Z             {
2026-08-28T09:54:46.2658364Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2658528Z               "line": 1353
2026-08-28T09:54:46.2658679Z             },
2026-08-28T09:54:46.2658842Z             {
2026-08-28T09:54:46.2659228Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.2659458Z               "line": 381
2026-08-28T09:54:46.2659681Z             },
2026-08-28T09:54:46.2659904Z             {
2026-08-28T09:54:46.2660118Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.2660287Z               "line": 143
2026-08-28T09:54:46.2660431Z             },
2026-08-28T09:54:46.2660616Z             {
2026-08-28T09:54:46.2660926Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.2661166Z               "line": 154
2026-08-28T09:54:46.2661385Z             },
2026-08-28T09:54:46.2661627Z             {
2026-08-28T09:54:46.2661923Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.2662109Z               "line": 164
2026-08-28T09:54:46.2662262Z             },
2026-08-28T09:54:46.2662410Z             {
2026-08-28T09:54:46.2662627Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.2662783Z               "line": 174
2026-08-28T09:54:46.2662931Z             },
2026-08-28T09:54:46.2663084Z             {
2026-08-28T09:54:46.2663289Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.2663450Z               "line": 192
2026-08-28T09:54:46.2663599Z             },
2026-08-28T09:54:46.2663756Z             {
2026-08-28T09:54:46.2663947Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2664103Z               "line": 20926
2026-08-28T09:54:46.2664258Z             }
2026-08-28T09:54:46.2664404Z           ]
2026-08-28T09:54:46.2664563Z         },
2026-08-28T09:54:46.2664719Z         "int": {
2026-08-28T09:54:46.2665028Z           "complete": true,
2026-08-28T09:54:46.2665202Z           "evidence": [
2026-08-28T09:54:46.2665357Z             {
2026-08-28T09:54:46.2665577Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.2665733Z               "line": 905
2026-08-28T09:54:46.2665891Z             }
2026-08-28T09:54:46.2666043Z           ]
2026-08-28T09:54:46.2666206Z         },
2026-08-28T09:54:46.2666372Z         "unit": {
2026-08-28T09:54:46.2666530Z           "complete": true,
2026-08-28T09:54:46.2666692Z           "evidence": [
2026-08-28T09:54:46.2666836Z             {
2026-08-28T09:54:46.2667044Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2667203Z               "line": 2514
2026-08-28T09:54:46.2667354Z             },
2026-08-28T09:54:46.2667503Z             {
2026-08-28T09:54:46.2667711Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2667877Z               "line": 2529
2026-08-28T09:54:46.2668018Z             },
2026-08-28T09:54:46.2668172Z             {
2026-08-28T09:54:46.2668376Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2668539Z               "line": 2541
2026-08-28T09:54:46.2668686Z             },
2026-08-28T09:54:46.2668834Z             {
2026-08-28T09:54:46.2669230Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2669464Z               "line": 2554
2026-08-28T09:54:46.2669616Z             },
2026-08-28T09:54:46.2669769Z             {
2026-08-28T09:54:46.2669980Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2670136Z               "line": 2570
2026-08-28T09:54:46.2670285Z             },
2026-08-28T09:54:46.2670427Z             {
2026-08-28T09:54:46.2670636Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2670796Z               "line": 2589
2026-08-28T09:54:46.2670939Z             }
2026-08-28T09:54:46.2671087Z           ]
2026-08-28T09:54:46.2671229Z         }
2026-08-28T09:54:46.2671387Z       }
2026-08-28T09:54:46.2671529Z     },
2026-08-28T09:54:46.2671815Z     {
2026-08-28T09:54:46.2672007Z       "id": "REQ-ADAPTER-TRANSLATE-PROOF",
2026-08-28T09:54:46.2678559Z       "title": "`spt adapter translate-proof <adapter> --event <envelope> [--session <id>]` — the author-time EMIT-half proof tool for `[message-idle-translation-binary]` (ADR-0022), symmetric to `spt adapter digest-proof` (REQ-TERM-5). It spawns and feeds the adapter's declared translation binary EXACTLY as the daemon does at idle-delivery — running the REAL `spt_daemon::translation` driver VERBATIM (no protocol reimplementation): `TranslationChild::spawn` the binary, send the `{type:\"init\",endpoint_id,node}` line then the `{type:\"event\",envelope}` line, and read back the emitted `{key}`/`{text}`/`{delay_ms}`/`{commit}` keystroke-command stream — then prints it author-readable (each Key with its `key_to_bytes` rendering, Text quoted, Delay in ms, Commit marker) with counts. It fills the SAME `{id}`→option and `{session_id}`→(--session, else a placeholder) keys into the `--event` envelope the daemon fills at runtime, so an envelope that proofs here feeds faithfully live. EMIT-half ONLY: it proves the binary's spawn+feed+emit contract; it does NOT exercise the daemon's atomic PTY apply / controller-buffering (that stays covered by the W2 inject_control_wedge int gate) — `--help` says so. Exit codes mirror digest-proof: 0 ok, 1 on spawn-fail / zero commands / no-commit-or-output / unparseable, 2 when the adapter declares no `[message-idle-translation-binary]` section. The `TranslationChild` Drop does the bounded no-zombie reap. (v0.13.x)",
2026-08-28T09:54:46.2678761Z       "requiredStages": [
2026-08-28T09:54:46.2678913Z         "doc",
2026-08-28T09:54:46.2679165Z         "impl",
2026-08-28T09:54:46.2679319Z         "unit",
2026-08-28T09:54:46.2679470Z         "int"
2026-08-28T09:54:46.2679619Z       ],
2026-08-28T09:54:46.2679781Z       "stages": {
2026-08-28T09:54:46.2679930Z         "doc": {
2026-08-28T09:54:46.2680230Z           "complete": true,
2026-08-28T09:54:46.2680395Z           "evidence": [
2026-08-28T09:54:46.2680550Z             {
2026-08-28T09:54:46.2680864Z               "path": "docs/adr/0022-spt-hosted-idle-delivery-translation-binary.md",
2026-08-28T09:54:46.2681015Z               "line": 73
2026-08-28T09:54:46.2681167Z             }
2026-08-28T09:54:46.2681318Z           ]
2026-08-28T09:54:46.2681474Z         },
2026-08-28T09:54:46.2681628Z         "impl": {
2026-08-28T09:54:46.2681789Z           "complete": true,
2026-08-28T09:54:46.2681947Z           "evidence": [
2026-08-28T09:54:46.2682195Z             {
2026-08-28T09:54:46.2682375Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2682529Z               "line": 20647
2026-08-28T09:54:46.2682676Z             },
2026-08-28T09:54:46.2682820Z             {
2026-08-28T09:54:46.2682996Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2683154Z               "line": 22134
2026-08-28T09:54:46.2683296Z             }
2026-08-28T09:54:46.2683450Z           ]
2026-08-28T09:54:46.2683596Z         },
2026-08-28T09:54:46.2683748Z         "int": {
2026-08-28T09:54:46.2683908Z           "complete": true,
2026-08-28T09:54:46.2684075Z           "evidence": [
2026-08-28T09:54:46.2684228Z             {
2026-08-28T09:54:46.2684443Z               "path": "crates/spt/tests/translate_proof.rs",
2026-08-28T09:54:46.2684594Z               "line": 48
2026-08-28T09:54:46.2684753Z             }
2026-08-28T09:54:46.2684904Z           ]
2026-08-28T09:54:46.2685048Z         },
2026-08-28T09:54:46.2685210Z         "unit": {
2026-08-28T09:54:46.2685368Z           "complete": true,
2026-08-28T09:54:46.2685534Z           "evidence": [
2026-08-28T09:54:46.2685678Z             {
2026-08-28T09:54:46.2685863Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2686017Z               "line": 31532
2026-08-28T09:54:46.2686163Z             },
2026-08-28T09:54:46.2686317Z             {
2026-08-28T09:54:46.2686491Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2686663Z               "line": 31604
2026-08-28T09:54:46.2686920Z             }
2026-08-28T09:54:46.2687074Z           ]
2026-08-28T09:54:46.2687215Z         }
2026-08-28T09:54:46.2687369Z       }
2026-08-28T09:54:46.2687511Z     },
2026-08-28T09:54:46.2687660Z     {
2026-08-28T09:54:46.2687864Z       "id": "REQ-ADAPTER-UNRESOLVED-HINT-FORM",
2026-08-28T09:54:46.2691491Z       "title": "F-034 leg a (perri/hertz field finding 2026-07-09): the ADAPTER_UNRESOLVED refusal hint must print a WORKING command form. It currently says 'pass --adapter <name[:profile]>', but --adapter is a `spt api` GROUP flag, NOT a `listen` flag — following the hint literally (`spt api listen <id> --adapter <name>`) produces clap `error: unexpected argument '--adapter'` (exit 2). Fix: the hint prints the group-level form, e.g. `spt api --adapter <name> <cmd> …` (a hint the operator can copy-paste and have work). Gate: the ADAPTER_UNRESOLVED message text carries a clap-VALID invocation (group-level --adapter placement) — a unit asserting the hint string parses under the api clap grammar, or at minimum places --adapter before the subcommand. Pure UX/hint-correctness fix, no behavior change.",
2026-08-28T09:54:46.2691679Z       "requiredStages": [
2026-08-28T09:54:46.2691836Z         "impl",
2026-08-28T09:54:46.2691986Z         "unit"
2026-08-28T09:54:46.2692136Z       ],
2026-08-28T09:54:46.2692287Z       "stages": {
2026-08-28T09:54:46.2692436Z         "doc": {
2026-08-28T09:54:46.2692602Z           "complete": false,
2026-08-28T09:54:46.2692765Z           "evidence": []
2026-08-28T09:54:46.2692907Z         },
2026-08-28T09:54:46.2693075Z         "impl": {
2026-08-28T09:54:46.2693237Z           "complete": true,
2026-08-28T09:54:46.2693390Z           "evidence": [
2026-08-28T09:54:46.2693546Z             {
2026-08-28T09:54:46.2693752Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:46.2693908Z               "line": 79
2026-08-28T09:54:46.2694057Z             }
2026-08-28T09:54:46.2694323Z           ]
2026-08-28T09:54:46.2694468Z         },
2026-08-28T09:54:46.2694635Z         "int": {
2026-08-28T09:54:46.2694797Z           "complete": false,
2026-08-28T09:54:46.2694955Z           "evidence": []
2026-08-28T09:54:46.2695103Z         },
2026-08-28T09:54:46.2695255Z         "unit": {
2026-08-28T09:54:46.2695422Z           "complete": true,
2026-08-28T09:54:46.2695570Z           "evidence": [
2026-08-28T09:54:46.2695722Z             {
2026-08-28T09:54:46.2695923Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:46.2696085Z               "line": 484
2026-08-28T09:54:46.2696238Z             },
2026-08-28T09:54:46.2696384Z             {
2026-08-28T09:54:46.2696567Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2696723Z               "line": 25234
2026-08-28T09:54:46.2696882Z             }
2026-08-28T09:54:46.2697028Z           ]
2026-08-28T09:54:46.2697175Z         }
2026-08-28T09:54:46.2697320Z       }
2026-08-28T09:54:46.2697470Z     },
2026-08-28T09:54:46.2697629Z     {
2026-08-28T09:54:46.2697810Z       "id": "REQ-ADAPTER-UPDATE-INPLACE",
2026-08-28T09:54:46.2700257Z       "title": "Bug #18: spt adapter update fails at re-register with os error 2 because it derives the install dir from the update repo NAME (_github/<safe>) instead of updating in place at the adapter record source_dir; when the adapter repo is intentionally renamed across releases (spt-claude-code to claude-spt, supported), the derived dir is fresh/empty and re-register reads a missing manifest. Fix: adapter update installs and re-registers in place at the registered source_dir and tolerates a changed update repo/URL across a rename. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #18.",
2026-08-28T09:54:46.2700430Z       "requiredStages": [
2026-08-28T09:54:46.2700581Z         "impl",
2026-08-28T09:54:46.2700735Z         "unit"
2026-08-28T09:54:46.2700881Z       ],
2026-08-28T09:54:46.2701040Z       "stages": {
2026-08-28T09:54:46.2701183Z         "doc": {
2026-08-28T09:54:46.2701355Z           "complete": false,
2026-08-28T09:54:46.2701521Z           "evidence": []
2026-08-28T09:54:46.2701783Z         },
2026-08-28T09:54:46.2701946Z         "impl": {
2026-08-28T09:54:46.2702102Z           "complete": true,
2026-08-28T09:54:46.2702263Z           "evidence": [
2026-08-28T09:54:46.2702415Z             {
2026-08-28T09:54:46.2702595Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2702748Z               "line": 20237
2026-08-28T09:54:46.2702900Z             },
2026-08-28T09:54:46.2703044Z             {
2026-08-28T09:54:46.2703229Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2703387Z               "line": 21612
2026-08-28T09:54:46.2703534Z             }
2026-08-28T09:54:46.2703682Z           ]
2026-08-28T09:54:46.2703830Z         },
2026-08-28T09:54:46.2703983Z         "int": {
2026-08-28T09:54:46.2704145Z           "complete": false,
2026-08-28T09:54:46.2704308Z           "evidence": []
2026-08-28T09:54:46.2704455Z         },
2026-08-28T09:54:46.2704613Z         "unit": {
2026-08-28T09:54:46.2704778Z           "complete": true,
2026-08-28T09:54:46.2704940Z           "evidence": [
2026-08-28T09:54:46.2705094Z             {
2026-08-28T09:54:46.2705272Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2705433Z               "line": 39036
2026-08-28T09:54:46.2705577Z             }
2026-08-28T09:54:46.2705729Z           ]
2026-08-28T09:54:46.2705873Z         }
2026-08-28T09:54:46.2706025Z       }
2026-08-28T09:54:46.2706173Z     },
2026-08-28T09:54:46.2706316Z     {
2026-08-28T09:54:46.2706502Z       "id": "REQ-ADAPTER-UPDATE-MESSAGE",
2026-08-28T09:54:46.2708827Z       "title": "An adapter manifest may declare `[update].message` — a plain (multi-line) human notice surfaced to stdout, markdown-rendered (the v0.13.0 helpfmt prose path), ONLY when `spt adapter update` actually APPLIES an update (version changed), not on a no-op. Read from the newly-installed manifest; avenue-agnostic (gh_release/delegated/file_pull). No `{key}` substitution. Use: an adapter telling the operator a post-update action, e.g. spt-claude-code's \"run `/reload-plugins` in any ongoing sessions\". (v0.13.2)",
2026-08-28T09:54:46.2709200Z       "requiredStages": [
2026-08-28T09:54:46.2709344Z         "doc",
2026-08-28T09:54:46.2709480Z         "impl",
2026-08-28T09:54:46.2709629Z         "unit"
2026-08-28T09:54:46.2709781Z       ],
2026-08-28T09:54:46.2709937Z       "stages": {
2026-08-28T09:54:46.2710089Z         "doc": {
2026-08-28T09:54:46.2710249Z           "complete": true,
2026-08-28T09:54:46.2710403Z           "evidence": [
2026-08-28T09:54:46.2710555Z             {
2026-08-28T09:54:46.2710722Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2710879Z               "line": 106
2026-08-28T09:54:46.2711027Z             },
2026-08-28T09:54:46.2711170Z             {
2026-08-28T09:54:46.2711338Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2711489Z               "line": 672
2026-08-28T09:54:46.2711643Z             },
2026-08-28T09:54:46.2711794Z             {
2026-08-28T09:54:46.2712033Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:46.2712196Z               "line": 548
2026-08-28T09:54:46.2712338Z             },
2026-08-28T09:54:46.2712496Z             {
2026-08-28T09:54:46.2712672Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2712833Z               "line": 661
2026-08-28T09:54:46.2712980Z             }
2026-08-28T09:54:46.2713130Z           ]
2026-08-28T09:54:46.2713275Z         },
2026-08-28T09:54:46.2713422Z         "impl": {
2026-08-28T09:54:46.2713590Z           "complete": true,
2026-08-28T09:54:46.2713741Z           "evidence": [
2026-08-28T09:54:46.2713895Z             {
2026-08-28T09:54:46.2714104Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2714256Z               "line": 740
2026-08-28T09:54:46.2714409Z             },
2026-08-28T09:54:46.2714557Z             {
2026-08-28T09:54:46.2714733Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2714900Z               "line": 21210
2026-08-28T09:54:46.2715053Z             }
2026-08-28T09:54:46.2715319Z           ]
2026-08-28T09:54:46.2715472Z         },
2026-08-28T09:54:46.2715617Z         "int": {
2026-08-28T09:54:46.2715775Z           "complete": false,
2026-08-28T09:54:46.2715932Z           "evidence": []
2026-08-28T09:54:46.2716085Z         },
2026-08-28T09:54:46.2716237Z         "unit": {
2026-08-28T09:54:46.2716405Z           "complete": true,
2026-08-28T09:54:46.2716575Z           "evidence": [
2026-08-28T09:54:46.2716720Z             {
2026-08-28T09:54:46.2716904Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2717063Z               "line": 25840
2026-08-28T09:54:46.2717210Z             },
2026-08-28T09:54:46.2717364Z             {
2026-08-28T09:54:46.2717548Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2717706Z               "line": 25855
2026-08-28T09:54:46.2717858Z             }
2026-08-28T09:54:46.2718008Z           ]
2026-08-28T09:54:46.2718163Z         }
2026-08-28T09:54:46.2718320Z       }
2026-08-28T09:54:46.2718472Z     },
2026-08-28T09:54:46.2718620Z     {
2026-08-28T09:54:46.2718806Z       "id": "REQ-ADAPTER-UPDATE-POST",
2026-08-28T09:54:46.2723498Z       "title": "Composite adapter update — an avenue-agnostic `[update.post]` sub-table `{ command, self_verifies }` run AFTER the primary avenue (gh_release/file_pull/delegated) resolves, in the same `spt adapter update` (ADR-0029). Runs UNCONDITIONALLY (even on an adapter version no-op — the post-step's own idempotent check decides). PUBLISHED stdin JSON seam: one line `{adapter_applied, adapter_name, profile_name, version, previous_version, adapter_dir}` (additive keys; post-step ignores unknown). stdout decides the notice: custom text SUPERSEDES [update].message; a reserved sentinel fires the static [update].message; empty = no notice. exit code orthogonal (0 ok / nonzero failed). Precedence: dynamic-stdout > sentinel/manifest-message > nothing. NO [update.post] declared ⇒ today's adapter_applied→[update].message unchanged; post-step FAILS ⇒ loud warning + fall back to adapter_applied→message. FAILURE-ISOLATED: a committed gh_release pull is never rolled back if the post-step fails (independent channels). (v0.16.0)",
2026-08-28T09:54:46.2723792Z       "requiredStages": [
2026-08-28T09:54:46.2723944Z         "doc",
2026-08-28T09:54:46.2724098Z         "impl",
2026-08-28T09:54:46.2724249Z         "unit",
2026-08-28T09:54:46.2724393Z         "int"
2026-08-28T09:54:46.2724550Z       ],
2026-08-28T09:54:46.2724703Z       "stages": {
2026-08-28T09:54:46.2724860Z         "doc": {
2026-08-28T09:54:46.2725018Z           "complete": true,
2026-08-28T09:54:46.2725179Z           "evidence": [
2026-08-28T09:54:46.2725323Z             {
2026-08-28T09:54:46.2725556Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:46.2725719Z               "line": 609
2026-08-28T09:54:46.2726172Z             },
2026-08-28T09:54:46.2726325Z             {
2026-08-28T09:54:46.2726492Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2726660Z               "line": 664
2026-08-28T09:54:46.2726811Z             },
2026-08-28T09:54:46.2726955Z             {
2026-08-28T09:54:46.2727246Z               "path": "docs/adr/0029-adapter-update-arc-resolve-not-execute.md",
2026-08-28T09:54:46.2727403Z               "line": 3
2026-08-28T09:54:46.2727550Z             }
2026-08-28T09:54:46.2727703Z           ]
2026-08-28T09:54:46.2727850Z         },
2026-08-28T09:54:46.2728003Z         "impl": {
2026-08-28T09:54:46.2728170Z           "complete": true,
2026-08-28T09:54:46.2728323Z           "evidence": [
2026-08-28T09:54:46.2728471Z             {
2026-08-28T09:54:46.2728680Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2728837Z               "line": 746
2026-08-28T09:54:46.2729075Z             },
2026-08-28T09:54:46.2729223Z             {
2026-08-28T09:54:46.2729432Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2729586Z               "line": 773
2026-08-28T09:54:46.2729747Z             },
2026-08-28T09:54:46.2730019Z             {
2026-08-28T09:54:46.2730235Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2730400Z               "line": 1323
2026-08-28T09:54:46.2730544Z             },
2026-08-28T09:54:46.2730696Z             {
2026-08-28T09:54:46.2730873Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2731039Z               "line": 21225
2026-08-28T09:54:46.2731186Z             },
2026-08-28T09:54:46.2731337Z             {
2026-08-28T09:54:46.2731514Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2731670Z               "line": 21233
2026-08-28T09:54:46.2731824Z             },
2026-08-28T09:54:46.2731970Z             {
2026-08-28T09:54:46.2732153Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2732304Z               "line": 21244
2026-08-28T09:54:46.2732463Z             },
2026-08-28T09:54:46.2732605Z             {
2026-08-28T09:54:46.2732787Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2732948Z               "line": 21267
2026-08-28T09:54:46.2733102Z             },
2026-08-28T09:54:46.2733248Z             {
2026-08-28T09:54:46.2733422Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2733587Z               "line": 21761
2026-08-28T09:54:46.2733732Z             }
2026-08-28T09:54:46.2733887Z           ]
2026-08-28T09:54:46.2734034Z         },
2026-08-28T09:54:46.2734185Z         "int": {
2026-08-28T09:54:46.2734352Z           "complete": true,
2026-08-28T09:54:46.2734508Z           "evidence": [
2026-08-28T09:54:46.2734663Z             {
2026-08-28T09:54:46.2734881Z               "path": "crates/spt/tests/adapter_post_step.rs",
2026-08-28T09:54:46.2735039Z               "line": 38
2026-08-28T09:54:46.2735186Z             }
2026-08-28T09:54:46.2735340Z           ]
2026-08-28T09:54:46.2735491Z         },
2026-08-28T09:54:46.2735640Z         "unit": {
2026-08-28T09:54:46.2735801Z           "complete": true,
2026-08-28T09:54:46.2736092Z           "evidence": [
2026-08-28T09:54:46.2736251Z             {
2026-08-28T09:54:46.2736582Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.2736742Z               "line": 1653
2026-08-28T09:54:46.2736890Z             },
2026-08-28T09:54:46.2737042Z             {
2026-08-28T09:54:46.2737225Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2737385Z               "line": 25867
2026-08-28T09:54:46.2737530Z             }
2026-08-28T09:54:46.2737681Z           ]
2026-08-28T09:54:46.2737835Z         }
2026-08-28T09:54:46.2737982Z       }
2026-08-28T09:54:46.2738125Z     },
2026-08-28T09:54:46.2738268Z     {
2026-08-28T09:54:46.2738450Z       "id": "REQ-ADAPTER-VERSION-CMD",
2026-08-28T09:54:46.2740865Z       "title": "`spt adapter version <name>` prints a registered adapter's declared version — the EXISTING mandatory `[adapter].version` manifest field (manifest.rs already requires it; NOT a `[strings].version`, NOT `get-string`, no second version source). A new `AdapterCmd::Version{option}` resolves the option's merged view via `registry::resolve_option` like the sibling adapter subcommands and prints `manifest.adapter.version`; an unresolvable option errors (exit 1) the same way. (v0.13.2 W6)",
2026-08-28T09:54:46.2741058Z       "requiredStages": [
2026-08-28T09:54:46.2741213Z         "doc",
2026-08-28T09:54:46.2741368Z         "impl",
2026-08-28T09:54:46.2741519Z         "unit"
2026-08-28T09:54:46.2741661Z       ],
2026-08-28T09:54:46.2741816Z       "stages": {
2026-08-28T09:54:46.2741968Z         "doc": {
2026-08-28T09:54:46.2742131Z           "complete": true,
2026-08-28T09:54:46.2742292Z           "evidence": [
2026-08-28T09:54:46.2742436Z             {
2026-08-28T09:54:46.2742622Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.2742775Z               "line": 35
2026-08-28T09:54:46.2742927Z             }
2026-08-28T09:54:46.2743075Z           ]
2026-08-28T09:54:46.2743227Z         },
2026-08-28T09:54:46.2743385Z         "impl": {
2026-08-28T09:54:46.2743552Z           "complete": true,
2026-08-28T09:54:46.2743837Z           "evidence": [
2026-08-28T09:54:46.2743986Z             {
2026-08-28T09:54:46.2744172Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2744325Z               "line": 20612
2026-08-28T09:54:46.2744480Z             },
2026-08-28T09:54:46.2744628Z             {
2026-08-28T09:54:46.2744811Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2744969Z               "line": 21918
2026-08-28T09:54:46.2745121Z             }
2026-08-28T09:54:46.2745270Z           ]
2026-08-28T09:54:46.2745417Z         },
2026-08-28T09:54:46.2745571Z         "int": {
2026-08-28T09:54:46.2745731Z           "complete": false,
2026-08-28T09:54:46.2745900Z           "evidence": []
2026-08-28T09:54:46.2746046Z         },
2026-08-28T09:54:46.2746200Z         "unit": {
2026-08-28T09:54:46.2746366Z           "complete": true,
2026-08-28T09:54:46.2746529Z           "evidence": [
2026-08-28T09:54:46.2746685Z             {
2026-08-28T09:54:46.2746868Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2747028Z               "line": 25958
2026-08-28T09:54:46.2747181Z             },
2026-08-28T09:54:46.2747330Z             {
2026-08-28T09:54:46.2747508Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.2747669Z               "line": 25969
2026-08-28T09:54:46.2747822Z             }
2026-08-28T09:54:46.2747969Z           ]
2026-08-28T09:54:46.2748119Z         }
2026-08-28T09:54:46.2748260Z       }
2026-08-28T09:54:46.2748409Z     },
2026-08-28T09:54:46.2748557Z     {
2026-08-28T09:54:46.2748729Z       "id": "REQ-API-1",
2026-08-28T09:54:46.2749105Z       "title": "api prefix and adapter_name on every machinery invocation",
2026-08-28T09:54:46.2749276Z       "requiredStages": [
2026-08-28T09:54:46.2749425Z         "impl",
2026-08-28T09:54:46.2749577Z         "unit",
2026-08-28T09:54:46.2749735Z         "int"
2026-08-28T09:54:46.2749881Z       ],
2026-08-28T09:54:46.2750034Z       "stages": {
2026-08-28T09:54:46.2750296Z         "doc": {
2026-08-28T09:54:46.2750467Z           "complete": false,
2026-08-28T09:54:46.2750630Z           "evidence": []
2026-08-28T09:54:46.2750782Z         },
2026-08-28T09:54:46.2750940Z         "impl": {
2026-08-28T09:54:46.2751097Z           "complete": true,
2026-08-28T09:54:46.2751259Z           "evidence": [
2026-08-28T09:54:46.2751411Z             {
2026-08-28T09:54:46.2751599Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2751750Z               "line": 15
2026-08-28T09:54:46.2751908Z             }
2026-08-28T09:54:46.2752083Z           ]
2026-08-28T09:54:46.2752240Z         },
2026-08-28T09:54:46.2752395Z         "int": {
2026-08-28T09:54:46.2752557Z           "complete": true,
2026-08-28T09:54:46.2752724Z           "evidence": [
2026-08-28T09:54:46.2752867Z             {
2026-08-28T09:54:46.2753077Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:46.2753235Z               "line": 13
2026-08-28T09:54:46.2753391Z             }
2026-08-28T09:54:46.2753536Z           ]
2026-08-28T09:54:46.2753692Z         },
2026-08-28T09:54:46.2753851Z         "unit": {
2026-08-28T09:54:46.2754007Z           "complete": true,
2026-08-28T09:54:46.2754170Z           "evidence": [
2026-08-28T09:54:46.2754316Z             {
2026-08-28T09:54:46.2754504Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2754665Z               "line": 1129
2026-08-28T09:54:46.2754819Z             },
2026-08-28T09:54:46.2754965Z             {
2026-08-28T09:54:46.2755155Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2755314Z               "line": 1339
2026-08-28T09:54:46.2755458Z             }
2026-08-28T09:54:46.2755601Z           ]
2026-08-28T09:54:46.2755749Z         }
2026-08-28T09:54:46.2755897Z       }
2026-08-28T09:54:46.2756044Z     },
2026-08-28T09:54:46.2756192Z     {
2026-08-28T09:54:46.2756345Z       "id": "REQ-API-2",
2026-08-28T09:54:46.2756693Z       "title": "The api subcommand surface (bind/listen/poll/state/worker/boundary/...)",
2026-08-28T09:54:46.2756864Z       "requiredStages": [
2026-08-28T09:54:46.2757127Z         "impl",
2026-08-28T09:54:46.2757284Z         "unit",
2026-08-28T09:54:46.2757428Z         "int"
2026-08-28T09:54:46.2757579Z       ],
2026-08-28T09:54:46.2757731Z       "stages": {
2026-08-28T09:54:46.2757886Z         "doc": {
2026-08-28T09:54:46.2758044Z           "complete": false,
2026-08-28T09:54:46.2758205Z           "evidence": []
2026-08-28T09:54:46.2758364Z         },
2026-08-28T09:54:46.2758520Z         "impl": {
2026-08-28T09:54:46.2758683Z           "complete": true,
2026-08-28T09:54:46.2758839Z           "evidence": [
2026-08-28T09:54:46.2759073Z             {
2026-08-28T09:54:46.2759279Z               "path": "crates/spt-store/src/history.rs",
2026-08-28T09:54:46.2759441Z               "line": 17
2026-08-28T09:54:46.2759585Z             },
2026-08-28T09:54:46.2759740Z             {
2026-08-28T09:54:46.2760013Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.2760252Z               "line": 20
2026-08-28T09:54:46.2760483Z             },
2026-08-28T09:54:46.2760798Z             {
2026-08-28T09:54:46.2761028Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.2761185Z               "line": 479
2026-08-28T09:54:46.2761333Z             },
2026-08-28T09:54:46.2761485Z             {
2026-08-28T09:54:46.2761690Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2761853Z               "line": 24
2026-08-28T09:54:46.2762000Z             },
2026-08-28T09:54:46.2762149Z             {
2026-08-28T09:54:46.2762348Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2762507Z               "line": 42
2026-08-28T09:54:46.2762653Z             },
2026-08-28T09:54:46.2762805Z             {
2026-08-28T09:54:46.2762998Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2763161Z               "line": 401
2026-08-28T09:54:46.2763317Z             },
2026-08-28T09:54:46.2763594Z             {
2026-08-28T09:54:46.2763795Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2763956Z               "line": 443
2026-08-28T09:54:46.2764115Z             },
2026-08-28T09:54:46.2764257Z             {
2026-08-28T09:54:46.2764458Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2764629Z               "line": 522
2026-08-28T09:54:46.2764773Z             },
2026-08-28T09:54:46.2764924Z             {
2026-08-28T09:54:46.2765120Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2765282Z               "line": 585
2026-08-28T09:54:46.2765426Z             },
2026-08-28T09:54:46.2765576Z             {
2026-08-28T09:54:46.2765771Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2765931Z               "line": 638
2026-08-28T09:54:46.2766086Z             },
2026-08-28T09:54:46.2766232Z             {
2026-08-28T09:54:46.2766428Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.2766590Z               "line": 17
2026-08-28T09:54:46.2766743Z             },
2026-08-28T09:54:46.2766890Z             {
2026-08-28T09:54:46.2767086Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.2767244Z               "line": 44
2026-08-28T09:54:46.2767396Z             },
2026-08-28T09:54:46.2767549Z             {
2026-08-28T09:54:46.2767734Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.2767893Z               "line": 109
2026-08-28T09:54:46.2768040Z             },
2026-08-28T09:54:46.2768191Z             {
2026-08-28T09:54:46.2768375Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.2768537Z               "line": 124
2026-08-28T09:54:46.2768681Z             }
2026-08-28T09:54:46.2768837Z           ]
2026-08-28T09:54:46.2769085Z         },
2026-08-28T09:54:46.2769234Z         "int": {
2026-08-28T09:54:46.2769404Z           "complete": true,
2026-08-28T09:54:46.2769558Z           "evidence": [
2026-08-28T09:54:46.2769719Z             {
2026-08-28T09:54:46.2769920Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:46.2770192Z               "line": 14
2026-08-28T09:54:46.2770340Z             },
2026-08-28T09:54:46.2770493Z             {
2026-08-28T09:54:46.2770697Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:46.2770846Z               "line": 172
2026-08-28T09:54:46.2771001Z             }
2026-08-28T09:54:46.2771144Z           ]
2026-08-28T09:54:46.2771292Z         },
2026-08-28T09:54:46.2771431Z         "unit": {
2026-08-28T09:54:46.2771597Z           "complete": true,
2026-08-28T09:54:46.2771750Z           "evidence": [
2026-08-28T09:54:46.2771899Z             {
2026-08-28T09:54:46.2772089Z               "path": "crates/spt-store/src/history.rs",
2026-08-28T09:54:46.2772255Z               "line": 82
2026-08-28T09:54:46.2772408Z             },
2026-08-28T09:54:46.2772561Z             {
2026-08-28T09:54:46.2772757Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.2772913Z               "line": 1142
2026-08-28T09:54:46.2773072Z             },
2026-08-28T09:54:46.2773227Z             {
2026-08-28T09:54:46.2773422Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2773587Z               "line": 1415
2026-08-28T09:54:46.2773730Z             },
2026-08-28T09:54:46.2773882Z             {
2026-08-28T09:54:46.2774074Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2774235Z               "line": 1426
2026-08-28T09:54:46.2774384Z             },
2026-08-28T09:54:46.2774535Z             {
2026-08-28T09:54:46.2774731Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2774879Z               "line": 1716
2026-08-28T09:54:46.2775037Z             },
2026-08-28T09:54:46.2775179Z             {
2026-08-28T09:54:46.2775370Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2775518Z               "line": 1762
2026-08-28T09:54:46.2775662Z             },
2026-08-28T09:54:46.2775920Z             {
2026-08-28T09:54:46.2776104Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.2776261Z               "line": 195
2026-08-28T09:54:46.2776397Z             },
2026-08-28T09:54:46.2776544Z             {
2026-08-28T09:54:46.2776735Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.2776899Z               "line": 293
2026-08-28T09:54:46.2777050Z             }
2026-08-28T09:54:46.2777199Z           ]
2026-08-28T09:54:46.2777341Z         }
2026-08-28T09:54:46.2777494Z       }
2026-08-28T09:54:46.2777646Z     },
2026-08-28T09:54:46.2777789Z     {
2026-08-28T09:54:46.2777951Z       "id": "REQ-API-3",
2026-08-28T09:54:46.2778186Z       "title": "commune/signoff are file-drops, not commands",
2026-08-28T09:54:46.2781354Z       "requiredStages": [
2026-08-28T09:54:46.2781551Z         "impl",
2026-08-28T09:54:46.2781704Z         "unit",
2026-08-28T09:54:46.2781852Z         "int"
2026-08-28T09:54:46.2782005Z       ],
2026-08-28T09:54:46.2782181Z       "stages": {
2026-08-28T09:54:46.2782325Z         "doc": {
2026-08-28T09:54:46.2782515Z           "complete": false,
2026-08-28T09:54:46.2782668Z           "evidence": []
2026-08-28T09:54:46.2782820Z         },
2026-08-28T09:54:46.2782973Z         "impl": {
2026-08-28T09:54:46.2783140Z           "complete": true,
2026-08-28T09:54:46.2783293Z           "evidence": [
2026-08-28T09:54:46.2783444Z             {
2026-08-28T09:54:46.2783651Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.2783806Z               "line": 27
2026-08-28T09:54:46.2783963Z             },
2026-08-28T09:54:46.2784104Z             {
2026-08-28T09:54:46.2784314Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2784471Z               "line": 785
2026-08-28T09:54:46.2784620Z             }
2026-08-28T09:54:46.2784762Z           ]
2026-08-28T09:54:46.2784906Z         },
2026-08-28T09:54:46.2785062Z         "int": {
2026-08-28T09:54:46.2785226Z           "complete": true,
2026-08-28T09:54:46.2785386Z           "evidence": [
2026-08-28T09:54:46.2785711Z             {
2026-08-28T09:54:46.2785921Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:46.2786083Z               "line": 246
2026-08-28T09:54:46.2786227Z             }
2026-08-28T09:54:46.2786369Z           ]
2026-08-28T09:54:46.2786518Z         },
2026-08-28T09:54:46.2786673Z         "unit": {
2026-08-28T09:54:46.2786835Z           "complete": true,
2026-08-28T09:54:46.2786995Z           "evidence": [
2026-08-28T09:54:46.2787138Z             {
2026-08-28T09:54:46.2787338Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.2787491Z               "line": 634
2026-08-28T09:54:46.2787638Z             },
2026-08-28T09:54:46.2787783Z             {
2026-08-28T09:54:46.2787991Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2788154Z               "line": 1791
2026-08-28T09:54:46.2788297Z             }
2026-08-28T09:54:46.2788446Z           ]
2026-08-28T09:54:46.2788592Z         }
2026-08-28T09:54:46.2788737Z       }
2026-08-28T09:54:46.2788883Z     },
2026-08-28T09:54:46.2789122Z     {
2026-08-28T09:54:46.2789282Z       "id": "REQ-API-4",
2026-08-28T09:54:46.2791585Z       "title": "api resolves the adapter manifest (+ profile + install dir) from `--adapter name:profile` via the registry when `--manifest` is omitted; `--manifest` becomes an optional OVERRIDE (unregistered / local-dev manifests). Removes the require-both-flags redundancy — a registered adapter's live bringup / digest / capability needs only `--adapter` — and yields the precise install dir (the record's source_dir) rather than the --manifest parent, closing the copy-mode psyche-binary edge (v0.8.0)",
2026-08-28T09:54:46.2791760Z       "requiredStages": [
2026-08-28T09:54:46.2791909Z         "doc",
2026-08-28T09:54:46.2792060Z         "impl",
2026-08-28T09:54:46.2792207Z         "unit"
2026-08-28T09:54:46.2792356Z       ],
2026-08-28T09:54:46.2792512Z       "stages": {
2026-08-28T09:54:46.2792661Z         "doc": {
2026-08-28T09:54:46.2792942Z           "complete": true,
2026-08-28T09:54:46.2793108Z           "evidence": [
2026-08-28T09:54:46.2793252Z             {
2026-08-28T09:54:46.2793418Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.2793661Z               "line": 182
2026-08-28T09:54:46.2793810Z             }
2026-08-28T09:54:46.2793953Z           ]
2026-08-28T09:54:46.2794105Z         },
2026-08-28T09:54:46.2794254Z         "impl": {
2026-08-28T09:54:46.2794414Z           "complete": true,
2026-08-28T09:54:46.2794557Z           "evidence": [
2026-08-28T09:54:46.2794712Z             {
2026-08-28T09:54:46.2794899Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2795064Z               "line": 877
2026-08-28T09:54:46.2795208Z             }
2026-08-28T09:54:46.2795360Z           ]
2026-08-28T09:54:46.2795504Z         },
2026-08-28T09:54:46.2795646Z         "int": {
2026-08-28T09:54:46.2795810Z           "complete": false,
2026-08-28T09:54:46.2795965Z           "evidence": []
2026-08-28T09:54:46.2796124Z         },
2026-08-28T09:54:46.2796276Z         "unit": {
2026-08-28T09:54:46.2796439Z           "complete": true,
2026-08-28T09:54:46.2796595Z           "evidence": [
2026-08-28T09:54:46.2796745Z             {
2026-08-28T09:54:46.2796934Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2797093Z               "line": 1069
2026-08-28T09:54:46.2797243Z             },
2026-08-28T09:54:46.2797386Z             {
2026-08-28T09:54:46.2797569Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2797728Z               "line": 1093
2026-08-28T09:54:46.2797874Z             },
2026-08-28T09:54:46.2798019Z             {
2026-08-28T09:54:46.2798208Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.2798367Z               "line": 1117
2026-08-28T09:54:46.2798513Z             }
2026-08-28T09:54:46.2798658Z           ]
2026-08-28T09:54:46.2798805Z         }
2026-08-28T09:54:46.2799062Z       }
2026-08-28T09:54:46.2799205Z     },
2026-08-28T09:54:46.2799363Z     {
2026-08-28T09:54:46.2799559Z       "id": "REQ-API-ENDPOINT-INFO",
2026-08-28T09:54:46.2804316Z       "title": "#7: spt api endpoint-info [<id>] (JSON) lets an endpoint learn its ATTACHED (controlling) node — claude-spt surfaces local + attached node names on UserPromptSubmit so the agent knows whether getting a file to the user needs extra steps (user RC'd in from another machine). spt api * is the harness-contract agent-facing surface (JSON-first, rides perch identity/auth so the bare no-<id> form self-resolves like whoami). Payload (committed DTO, additive-forever): { id, endpoint_type, adapter, local_node:{label,key}, attached_node:{label,key}|null, controlled:bool, project:<current project id>, cwd, subnets:[...] } — attached_node from controller stamps (driven_by remote / self-node when controlled with no remote driver), null when uncontrolled. HARD dependency on #2 + #3 (stamps must be honest first). Adapter-side consumable -> perri release-ping on publish. Naming: chose 'spt api endpoint-info' over alt 'spt endpoint get-info' — api is the agent surface (doc rationale). See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #7.",
2026-08-28T09:54:46.2804508Z       "requiredStages": [
2026-08-28T09:54:46.2804661Z         "impl",
2026-08-28T09:54:46.2804809Z         "unit"
2026-08-28T09:54:46.2804955Z       ],
2026-08-28T09:54:46.2805107Z       "stages": {
2026-08-28T09:54:46.2805253Z         "doc": {
2026-08-28T09:54:46.2805416Z           "complete": false,
2026-08-28T09:54:46.2805581Z           "evidence": []
2026-08-28T09:54:46.2805731Z         },
2026-08-28T09:54:46.2805882Z         "impl": {
2026-08-28T09:54:46.2806045Z           "complete": true,
2026-08-28T09:54:46.2806197Z           "evidence": [
2026-08-28T09:54:46.2806346Z             {
2026-08-28T09:54:46.2806549Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2806708Z               "line": 1042
2026-08-28T09:54:46.2806855Z             },
2026-08-28T09:54:46.2807009Z             {
2026-08-28T09:54:46.2807319Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2807485Z               "line": 1054
2026-08-28T09:54:46.2807629Z             },
2026-08-28T09:54:46.2807774Z             {
2026-08-28T09:54:46.2807979Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2808129Z               "line": 1108
2026-08-28T09:54:46.2808278Z             },
2026-08-28T09:54:46.2808425Z             {
2026-08-28T09:54:46.2808622Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2808792Z               "line": 1137
2026-08-28T09:54:46.2808937Z             },
2026-08-28T09:54:46.2809169Z             {
2026-08-28T09:54:46.2809370Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2809533Z               "line": 1148
2026-08-28T09:54:46.2809684Z             },
2026-08-28T09:54:46.2809833Z             {
2026-08-28T09:54:46.2810027Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2810186Z               "line": 1167
2026-08-28T09:54:46.2810336Z             }
2026-08-28T09:54:46.2810484Z           ]
2026-08-28T09:54:46.2810653Z         },
2026-08-28T09:54:46.2810840Z         "int": {
2026-08-28T09:54:46.2811006Z           "complete": false,
2026-08-28T09:54:46.2811160Z           "evidence": []
2026-08-28T09:54:46.2811311Z         },
2026-08-28T09:54:46.2811460Z         "unit": {
2026-08-28T09:54:46.2811621Z           "complete": true,
2026-08-28T09:54:46.2811785Z           "evidence": [
2026-08-28T09:54:46.2811927Z             {
2026-08-28T09:54:46.2812137Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2812294Z               "line": 1260
2026-08-28T09:54:46.2812448Z             },
2026-08-28T09:54:46.2812594Z             {
2026-08-28T09:54:46.2812790Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2812942Z               "line": 1326
2026-08-28T09:54:46.2813101Z             }
2026-08-28T09:54:46.2813251Z           ]
2026-08-28T09:54:46.2813395Z         }
2026-08-28T09:54:46.2813551Z       }
2026-08-28T09:54:46.2813810Z     },
2026-08-28T09:54:46.2813962Z     {
2026-08-28T09:54:46.2814115Z       "id": "REQ-ARCH-1",
2026-08-28T09:54:46.2814335Z       "title": "Many small acyclically-layered crates",
2026-08-28T09:54:46.2814491Z       "requiredStages": [
2026-08-28T09:54:46.2814645Z         "impl"
2026-08-28T09:54:46.2814796Z       ],
2026-08-28T09:54:46.2814945Z       "stages": {
2026-08-28T09:54:46.2815101Z         "doc": {
2026-08-28T09:54:46.2815264Z           "complete": false,
2026-08-28T09:54:46.2815425Z           "evidence": []
2026-08-28T09:54:46.2815567Z         },
2026-08-28T09:54:46.2815719Z         "impl": {
2026-08-28T09:54:46.2815875Z           "complete": true,
2026-08-28T09:54:46.2816038Z           "evidence": [
2026-08-28T09:54:46.2816190Z             {
2026-08-28T09:54:46.2816381Z               "path": "crates/spt-msg/src/lib.rs",
2026-08-28T09:54:46.2816543Z               "line": 18
2026-08-28T09:54:46.2816686Z             },
2026-08-28T09:54:46.2816839Z             {
2026-08-28T09:54:46.2817029Z               "path": "crates/spt-proto/src/lib.rs",
2026-08-28T09:54:46.2817187Z               "line": 12
2026-08-28T09:54:46.2817334Z             },
2026-08-28T09:54:46.2817482Z             {
2026-08-28T09:54:46.2817672Z               "path": "crates/spt-store/src/lib.rs",
2026-08-28T09:54:46.2817822Z               "line": 12
2026-08-28T09:54:46.2817978Z             }
2026-08-28T09:54:46.2818156Z           ]
2026-08-28T09:54:46.2818311Z         },
2026-08-28T09:54:46.2818458Z         "int": {
2026-08-28T09:54:46.2818623Z           "complete": false,
2026-08-28T09:54:46.2818781Z           "evidence": []
2026-08-28T09:54:46.2818929Z         },
2026-08-28T09:54:46.2819182Z         "unit": {
2026-08-28T09:54:46.2819342Z           "complete": false,
2026-08-28T09:54:46.2819501Z           "evidence": []
2026-08-28T09:54:46.2819643Z         }
2026-08-28T09:54:46.2819802Z       }
2026-08-28T09:54:46.2819944Z     },
2026-08-28T09:54:46.2820088Z     {
2026-08-28T09:54:46.2820354Z       "id": "REQ-ARCH-2",
2026-08-28T09:54:46.2820650Z       "title": "Public SDK surface is spt-proto, spt-runtime, spt-msg",
2026-08-28T09:54:46.2820854Z       "requiredStages": [
2026-08-28T09:54:46.2821001Z         "impl"
2026-08-28T09:54:46.2821153Z       ],
2026-08-28T09:54:46.2821304Z       "stages": {
2026-08-28T09:54:46.2821453Z         "doc": {
2026-08-28T09:54:46.2821614Z           "complete": false,
2026-08-28T09:54:46.2821772Z           "evidence": []
2026-08-28T09:54:46.2821919Z         },
2026-08-28T09:54:46.2822072Z         "impl": {
2026-08-28T09:54:46.2822234Z           "complete": true,
2026-08-28T09:54:46.2822387Z           "evidence": [
2026-08-28T09:54:46.2822539Z             {
2026-08-28T09:54:46.2822735Z               "path": "crates/spt-runtime/src/lib.rs",
2026-08-28T09:54:46.2822897Z               "line": 18
2026-08-28T09:54:46.2823045Z             }
2026-08-28T09:54:46.2823193Z           ]
2026-08-28T09:54:46.2823337Z         },
2026-08-28T09:54:46.2823498Z         "int": {
2026-08-28T09:54:46.2823657Z           "complete": false,
2026-08-28T09:54:46.2823816Z           "evidence": []
2026-08-28T09:54:46.2823965Z         },
2026-08-28T09:54:46.2824111Z         "unit": {
2026-08-28T09:54:46.2824280Z           "complete": false,
2026-08-28T09:54:46.2824431Z           "evidence": []
2026-08-28T09:54:46.2824585Z         }
2026-08-28T09:54:46.2824727Z       }
2026-08-28T09:54:46.2824875Z     },
2026-08-28T09:54:46.2825018Z     {
2026-08-28T09:54:46.2825185Z       "id": "REQ-ARCH-3",
2026-08-28T09:54:46.2825534Z       "title": "Wire-protocol version independent of crate semver, N-1 compat window",
2026-08-28T09:54:46.2825695Z       "requiredStages": [
2026-08-28T09:54:46.2825849Z         "impl",
2026-08-28T09:54:46.2825995Z         "unit"
2026-08-28T09:54:46.2826142Z       ],
2026-08-28T09:54:46.2826293Z       "stages": {
2026-08-28T09:54:46.2826450Z         "doc": {
2026-08-28T09:54:46.2826616Z           "complete": false,
2026-08-28T09:54:46.2826769Z           "evidence": []
2026-08-28T09:54:46.2826922Z         },
2026-08-28T09:54:46.2827185Z         "impl": {
2026-08-28T09:54:46.2827341Z           "complete": true,
2026-08-28T09:54:46.2827494Z           "evidence": [
2026-08-28T09:54:46.2827641Z             {
2026-08-28T09:54:46.2827842Z               "path": "crates/spt-proto/src/version.rs",
2026-08-28T09:54:46.2828004Z               "line": 34
2026-08-28T09:54:46.2828148Z             },
2026-08-28T09:54:46.2828295Z             {
2026-08-28T09:54:46.2828505Z               "path": "crates/spt-proto/src/version.rs",
2026-08-28T09:54:46.2828658Z               "line": 41
2026-08-28T09:54:46.2828806Z             }
2026-08-28T09:54:46.2829028Z           ]
2026-08-28T09:54:46.2829179Z         },
2026-08-28T09:54:46.2829326Z         "int": {
2026-08-28T09:54:46.2829489Z           "complete": false,
2026-08-28T09:54:46.2829636Z           "evidence": []
2026-08-28T09:54:46.2829784Z         },
2026-08-28T09:54:46.2829936Z         "unit": {
2026-08-28T09:54:46.2830099Z           "complete": true,
2026-08-28T09:54:46.2830271Z           "evidence": [
2026-08-28T09:54:46.2830418Z             {
2026-08-28T09:54:46.2830619Z               "path": "crates/spt-proto/src/version.rs",
2026-08-28T09:54:46.2830785Z               "line": 51
2026-08-28T09:54:46.2830954Z             },
2026-08-28T09:54:46.2831100Z             {
2026-08-28T09:54:46.2831297Z               "path": "crates/spt-proto/src/version.rs",
2026-08-28T09:54:46.2831452Z               "line": 71
2026-08-28T09:54:46.2831600Z             },
2026-08-28T09:54:46.2831746Z             {
2026-08-28T09:54:46.2831941Z               "path": "crates/spt-proto/src/version.rs",
2026-08-28T09:54:46.2832098Z               "line": 83
2026-08-28T09:54:46.2832242Z             }
2026-08-28T09:54:46.2832390Z           ]
2026-08-28T09:54:46.2832542Z         }
2026-08-28T09:54:46.2832685Z       }
2026-08-28T09:54:46.2832837Z     },
2026-08-28T09:54:46.2832980Z     {
2026-08-28T09:54:46.2833138Z       "id": "REQ-ARCH-4",
2026-08-28T09:54:46.2833529Z       "title": "Copy-verbatim the commodity layer from the sister project",
2026-08-28T09:54:46.2833701Z       "requiredStages": [
2026-08-28T09:54:46.2833854Z         "impl",
2026-08-28T09:54:46.2834005Z         "unit"
2026-08-28T09:54:46.2834150Z       ],
2026-08-28T09:54:46.2834296Z       "stages": {
2026-08-28T09:54:46.2834448Z         "doc": {
2026-08-28T09:54:46.2834606Z           "complete": false,
2026-08-28T09:54:46.2834762Z           "evidence": []
2026-08-28T09:54:46.2834911Z         },
2026-08-28T09:54:46.2835062Z         "impl": {
2026-08-28T09:54:46.2835216Z           "complete": true,
2026-08-28T09:54:46.2835373Z           "evidence": [
2026-08-28T09:54:46.2835526Z             {
2026-08-28T09:54:46.2835721Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2835878Z               "line": 194
2026-08-28T09:54:46.2836026Z             },
2026-08-28T09:54:46.2836174Z             {
2026-08-28T09:54:46.2836380Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2836578Z               "line": 329
2026-08-28T09:54:46.2836736Z             },
2026-08-28T09:54:46.2836881Z             {
2026-08-28T09:54:46.2837067Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2837215Z               "line": 359
2026-08-28T09:54:46.2837363Z             },
2026-08-28T09:54:46.2837496Z             {
2026-08-28T09:54:46.2837707Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2837858Z               "line": 385
2026-08-28T09:54:46.2838007Z             },
2026-08-28T09:54:46.2838154Z             {
2026-08-28T09:54:46.2838351Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2838512Z               "line": 399
2026-08-28T09:54:46.2838651Z             },
2026-08-28T09:54:46.2838793Z             {
2026-08-28T09:54:46.2839065Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2839218Z               "line": 449
2026-08-28T09:54:46.2839370Z             }
2026-08-28T09:54:46.2839521Z           ]
2026-08-28T09:54:46.2839673Z         },
2026-08-28T09:54:46.2839973Z         "int": {
2026-08-28T09:54:46.2840125Z           "complete": false,
2026-08-28T09:54:46.2840273Z           "evidence": []
2026-08-28T09:54:46.2840420Z         },
2026-08-28T09:54:46.2840565Z         "unit": {
2026-08-28T09:54:46.2840735Z           "complete": true,
2026-08-28T09:54:46.2840894Z           "evidence": [
2026-08-28T09:54:46.2841050Z             {
2026-08-28T09:54:46.2841265Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2841426Z               "line": 510
2026-08-28T09:54:46.2841575Z             },
2026-08-28T09:54:46.2841727Z             {
2026-08-28T09:54:46.2841919Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2842078Z               "line": 520
2026-08-28T09:54:46.2842240Z             },
2026-08-28T09:54:46.2842386Z             {
2026-08-28T09:54:46.2842583Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2842744Z               "line": 541
2026-08-28T09:54:46.2842897Z             },
2026-08-28T09:54:46.2843049Z             {
2026-08-28T09:54:46.2843245Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2843402Z               "line": 564
2026-08-28T09:54:46.2843550Z             },
2026-08-28T09:54:46.2843703Z             {
2026-08-28T09:54:46.2843893Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2844056Z               "line": 575
2026-08-28T09:54:46.2844208Z             },
2026-08-28T09:54:46.2844366Z             {
2026-08-28T09:54:46.2844565Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2844720Z               "line": 586
2026-08-28T09:54:46.2844875Z             },
2026-08-28T09:54:46.2845017Z             {
2026-08-28T09:54:46.2845208Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2845366Z               "line": 598
2026-08-28T09:54:46.2845519Z             },
2026-08-28T09:54:46.2845667Z             {
2026-08-28T09:54:46.2845966Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2846133Z               "line": 611
2026-08-28T09:54:46.2846276Z             },
2026-08-28T09:54:46.2846429Z             {
2026-08-28T09:54:46.2846621Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2846776Z               "line": 622
2026-08-28T09:54:46.2846920Z             },
2026-08-28T09:54:46.2847073Z             {
2026-08-28T09:54:46.2847272Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2847422Z               "line": 639
2026-08-28T09:54:46.2847575Z             },
2026-08-28T09:54:46.2847723Z             {
2026-08-28T09:54:46.2847918Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.2848071Z               "line": 767
2026-08-28T09:54:46.2848214Z             }
2026-08-28T09:54:46.2848362Z           ]
2026-08-28T09:54:46.2848509Z         }
2026-08-28T09:54:46.2848652Z       }
2026-08-28T09:54:46.2848800Z     },
2026-08-28T09:54:46.2849053Z     {
2026-08-28T09:54:46.2849245Z       "id": "REQ-ATTACH-IDEMPOTENT-REPLAY",
2026-08-28T09:54:46.2857395Z       "title": "The equal-generation lease rung is idempotent for the same connection. (ADR-0047 decision 3, AMENDING ADR-0044's ladder inside the equal-gen rung; hertz v0.39.4 field bug 4, PINNED via OBS breadcrumbs on authorized same-seam `daemon refresh` 2026-07-22 — gen+1 premise FALSIFIED.) TODAY: a Control/Take subscribe with same identity + same nonzero gen classifies 'same lease, silent re-take' (broker.rs equal-gen branch — correct, no revoke) but re-take = become_controller, which unconditionally takes+drops the prior seat (writer exits channel-closed) with NO same-conn check — designed for the dead-seat dispatcher-restart successor, it also fires against the SAME LIVE conn re-served 15ms apart by post-cycle dispatcher replay: the lease kills its own writer, the rc viewer freezes until detach+re-attach (the field 'update freezes PTYs'). FIX: keyed (endpoint/session, by, conn, gen) — same-conn equal-gen = IDEMPOTENT REPLAY: seat + writer PRESERVED, no controller-replaced, no second initial batch; breadcrumb answers decision=idempotent (additive vocab). Equal-gen DIFFERENT-conn keeps today's silent swap (the ADR-0038 fix-6 successor — must not regress); strictly-newer keeps loud supersession, strictly-older keeps busy. BANKED open question (build-time look, not a blocker): why the dispatcher double-served one held attach 15ms apart — may have siblings. Gate: impl — the same-conn discriminator in resolve_subscribe's equal-gen branch + the idempotent decision label; unit — the four ladder cells (same-conn idempotent / different-conn swap / newer supersedes / older busy) against a mock seat; int — the bug-4 rig: replay one held Attach after a brain refresh, assert ONE writer + zero controller-replaced + the original rc interactive (RED-first), plus the different-conn successor leg stays green (redispatch/brain_swap suites).",
2026-08-28T09:54:46.2857703Z       "requiredStages": [
2026-08-28T09:54:46.2857865Z         "impl",
2026-08-28T09:54:46.2858006Z         "unit",
2026-08-28T09:54:46.2858159Z         "int"
2026-08-28T09:54:46.2858302Z       ],
2026-08-28T09:54:46.2858459Z       "stages": {
2026-08-28T09:54:46.2858608Z         "doc": {
2026-08-28T09:54:46.2858774Z           "complete": true,
2026-08-28T09:54:46.2858932Z           "evidence": [
2026-08-28T09:54:46.2859161Z             {
2026-08-28T09:54:46.2859437Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:46.2859590Z               "line": 107
2026-08-28T09:54:46.2859743Z             }
2026-08-28T09:54:46.2859884Z           ]
2026-08-28T09:54:46.2860038Z         },
2026-08-28T09:54:46.2860185Z         "impl": {
2026-08-28T09:54:46.2860343Z           "complete": true,
2026-08-28T09:54:46.2860514Z           "evidence": [
2026-08-28T09:54:46.2860660Z             {
2026-08-28T09:54:46.2860897Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2861055Z               "line": 2820
2026-08-28T09:54:46.2861316Z             },
2026-08-28T09:54:46.2861465Z             {
2026-08-28T09:54:46.2861670Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2861832Z               "line": 3000
2026-08-28T09:54:46.2861980Z             }
2026-08-28T09:54:46.2862132Z           ]
2026-08-28T09:54:46.2862275Z         },
2026-08-28T09:54:46.2862432Z         "int": {
2026-08-28T09:54:46.2862585Z           "complete": true,
2026-08-28T09:54:46.2862742Z           "evidence": [
2026-08-28T09:54:46.2862890Z             {
2026-08-28T09:54:46.2863157Z               "path": "crates/spt-daemon/tests/attach_idempotent_replay.rs",
2026-08-28T09:54:46.2863319Z               "line": 238
2026-08-28T09:54:46.2863469Z             }
2026-08-28T09:54:46.2863622Z           ]
2026-08-28T09:54:46.2863764Z         },
2026-08-28T09:54:46.2863922Z         "unit": {
2026-08-28T09:54:46.2864079Z           "complete": true,
2026-08-28T09:54:46.2864237Z           "evidence": [
2026-08-28T09:54:46.2864394Z             {
2026-08-28T09:54:46.2864604Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2864770Z               "line": 11779
2026-08-28T09:54:46.2864919Z             },
2026-08-28T09:54:46.2865071Z             {
2026-08-28T09:54:46.2865267Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2865424Z               "line": 11845
2026-08-28T09:54:46.2865572Z             }
2026-08-28T09:54:46.2865739Z           ]
2026-08-28T09:54:46.2865887Z         }
2026-08-28T09:54:46.2866038Z       }
2026-08-28T09:54:46.2866190Z     },
2026-08-28T09:54:46.2866338Z     {
2026-08-28T09:54:46.2866520Z       "id": "REQ-ATTACH-RESIZE-REPAINT",
2026-08-28T09:54:46.2876419Z       "title": "RESCOPED 2026-07-22 by ADR-0047 Amendment 2 (doyle-ratified): this REQ no longer asserts a defect. Its original claim — that the attach-stream resize never arms the presentation barrier, and that this is v0.39.4 field bug 3's root — is RETRACTED; the W3 bisect falsified it three ways (static trace send_attach_resize -> serve_attach Resize arm -> brain.resize -> KIND_RESIZE -> dispatch_resize -> begin_resize_serialized; the synthetic sibling's pass; the broker's dynamic trace attach -> RESIZE_DISPATCH -> SYNC_PUSH{controller=true} with no RESIZE_SYNC_DROP) and then pinned the real root in the rc CLIENT's console mode (REQ-RC-NEWLINE-PRESENTATION-TRUTH / KNOWN-HAZARDS 7.56). The ADR-0047 Amendment 1 DECISION (geometry change = one transaction, one exit shape, any entry) stands on its own merits and is not disturbed. WHAT THIS REQ NOW OWNS — the captured-shape regression apparatus that the bisect proved worth keeping: hertz's ENLYZEAM production capture + its integrity pins (*.log -text, the fixture README sha256 table, per-record length refusal in both the player and the reader); the capture-player replay vehicle; and the probe ladder that makes any verdict from it mean something — vehicle transparency per CELL (ConPTY re-renders, so byte equality is unsatisfiable by construction), the pre-state soundness self-check (narrow-captured bytes into a wide authority is sound only if absolutely addressed), the capability probe re-run at every shape revision with its own precondition asserted, and the no-vehicle control (grid+resize+repaint over the same bytes = 0 divergent rows, the standing proof the seam is clean). Oracle clauses are binding for this rig class and are written out in Amendment 2. Gate: unit — the vehicle-transparency predicate + its non-vacuity sibling + the record-integrity refusals; int — the client-model rig pair (rc-fixed vehicle = clean, rc vehicle = reproduces the field scrap) plus the no-vehicle control. NO impl stage: there is no broker-side implementation owed, and pretending otherwise would point an activated stage at evidence that does not exist. Kin: REQ-RC-NEWLINE-PRESENTATION-TRUTH (the actual fix), REQ-RESIZE-INPUT-MODE-INTEGRITY (7.55, untouched — its capture has no replay vehicle in its path).",
2026-08-28T09:54:46.2876741Z       "requiredStages": [
2026-08-28T09:54:46.2876993Z         "unit",
2026-08-28T09:54:46.2877142Z         "int"
2026-08-28T09:54:46.2877298Z       ],
2026-08-28T09:54:46.2877447Z       "stages": {
2026-08-28T09:54:46.2877594Z         "doc": {
2026-08-28T09:54:46.2877757Z           "complete": true,
2026-08-28T09:54:46.2877918Z           "evidence": [
2026-08-28T09:54:46.2878057Z             {
2026-08-28T09:54:46.2878252Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.2878406Z               "line": 854
2026-08-28T09:54:46.2878557Z             },
2026-08-28T09:54:46.2878706Z             {
2026-08-28T09:54:46.2879038Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:46.2879197Z               "line": 167
2026-08-28T09:54:46.2879347Z             },
2026-08-28T09:54:46.2879502Z             {
2026-08-28T09:54:46.2879775Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:46.2879938Z               "line": 252
2026-08-28T09:54:46.2880089Z             }
2026-08-28T09:54:46.2880243Z           ]
2026-08-28T09:54:46.2880395Z         },
2026-08-28T09:54:46.2880553Z         "impl": {
2026-08-28T09:54:46.2880705Z           "complete": false,
2026-08-28T09:54:46.2880868Z           "evidence": []
2026-08-28T09:54:46.2881014Z         },
2026-08-28T09:54:46.2881158Z         "int": {
2026-08-28T09:54:46.2881324Z           "complete": true,
2026-08-28T09:54:46.2881478Z           "evidence": [
2026-08-28T09:54:46.2881630Z             {
2026-08-28T09:54:46.2881876Z               "path": "crates/spt-daemon/tests/attach_resize_capture.rs",
2026-08-28T09:54:46.2882027Z               "line": 365
2026-08-28T09:54:46.2882175Z             },
2026-08-28T09:54:46.2882318Z             {
2026-08-28T09:54:46.2882585Z               "path": "crates/spt-daemon/tests/attach_resize_capture.rs",
2026-08-28T09:54:46.2882742Z               "line": 384
2026-08-28T09:54:46.2882895Z             },
2026-08-28T09:54:46.2883052Z             {
2026-08-28T09:54:46.2883291Z               "path": "crates/spt-daemon/tests/attach_resize_capture.rs",
2026-08-28T09:54:46.2883458Z               "line": 425
2026-08-28T09:54:46.2883720Z             },
2026-08-28T09:54:46.2883882Z             {
2026-08-28T09:54:46.2884122Z               "path": "crates/spt-daemon/tests/attach_resize_capture.rs",
2026-08-28T09:54:46.2884281Z               "line": 484
2026-08-28T09:54:46.2884429Z             },
2026-08-28T09:54:46.2884584Z             {
2026-08-28T09:54:46.2884829Z               "path": "crates/spt-daemon/tests/attach_resize_repaint.rs",
2026-08-28T09:54:46.2884984Z               "line": 321
2026-08-28T09:54:46.2885133Z             },
2026-08-28T09:54:46.2885280Z             {
2026-08-28T09:54:46.2885523Z               "path": "crates/spt-daemon/tests/attach_resize_repaint.rs",
2026-08-28T09:54:46.2885677Z               "line": 343
2026-08-28T09:54:46.2885829Z             }
2026-08-28T09:54:46.2885977Z           ]
2026-08-28T09:54:46.2886129Z         },
2026-08-28T09:54:46.2886277Z         "unit": {
2026-08-28T09:54:46.2886443Z           "complete": true,
2026-08-28T09:54:46.2886597Z           "evidence": [
2026-08-28T09:54:46.2886749Z             {
2026-08-28T09:54:46.2886998Z               "path": "crates/spt-term/tests/capture_vehicle_fidelity.rs",
2026-08-28T09:54:46.2887153Z               "line": 153
2026-08-28T09:54:46.2887306Z             }
2026-08-28T09:54:46.2887454Z           ]
2026-08-28T09:54:46.2887602Z         }
2026-08-28T09:54:46.2887749Z       }
2026-08-28T09:54:46.2887897Z     },
2026-08-28T09:54:46.2888046Z     {
2026-08-28T09:54:46.2888251Z       "id": "REQ-ATTACH-SEED-REQUEST-DOUBLE-SERVE",
2026-08-28T09:54:46.2897857Z       "title": "A dispatcher-SEEDED attach Request is honored ONCE — the wire replay's copy of that same Request must not re-establish it. (Seed: DAEMON-LIFECYCLE W1 build, answering ADR-0047 decision 3's banked open question; origin CODE-PROVEN, not inferred.) THE ORIGIN: serve_attach (spt-daemon/src/attach.rs) processes the dispatcher-pinned `seed_request` through handle_attach_request BEFORE its event loop (ADR-0038 B, the durable-opener seed — it exists because a ROLLED ring can no longer replay the Request). It then subscribes the stream from the floor and enters the loop, whose `AttachRecord::Request` arm calls handle_attach_request UNCONDITIONALLY — there is NO `!attached` guard, and NO record that the seed already established this exact Request. When the ring has NOT rolled, the wire replay still carries that Request, so the SAME record is handled TWICE on the SAME conn, milliseconds apart, with identical (session_id, from_seq, intent, gen, identity) — exactly hertz's v0.39.4 bug-4 capture (conn1011, 15ms apart, post-refresh replay). The two arms are the same function on the same seed record; the seed is pinned by the dispatcher on the post-cycle replay, which is the field trigger. SIBLINGS to check at triage: any other serve family that seeds an opener record AND re-reads it from the replay (xfer/rest seeds), and whether a re-established seat should also re-run the access check. FIX SHAPE (not built, W1 deliberately shipped the broker-side idempotence instead): the serve worker knows it already honored a Request — a guard on the loop's Request arm (already attached + same record = ignore), which fixes the ORIGIN rather than absorbing it at the broker. The broker idempotence stays regardless: it closes the symptom for EVERY origin, including origins not yet found. A serve-path int rig replaying the REAL double-serve shape belongs to this REQ, not to W1 (doyle ruling 2026-07-22: do not simulate a behavior we have not explained). Kin REQ-ATTACH-IDEMPOTENT-REPLAY (the broker-side absorber), REQ-STREAM-OPENER-DURABLE (why the seed exists), ADR-0038 B.",
2026-08-28T09:54:46.2898224Z       "requiredStages": [],
2026-08-28T09:54:46.2898376Z       "stages": {
2026-08-28T09:54:46.2898525Z         "doc": {
2026-08-28T09:54:46.2898845Z           "complete": false,
2026-08-28T09:54:46.2899106Z           "evidence": []
2026-08-28T09:54:46.2899263Z         },
2026-08-28T09:54:46.2899412Z         "impl": {
2026-08-28T09:54:46.2899639Z           "complete": false,
2026-08-28T09:54:46.2899935Z           "evidence": []
2026-08-28T09:54:46.2900167Z         },
2026-08-28T09:54:46.2900332Z         "int": {
2026-08-28T09:54:46.2900505Z           "complete": false,
2026-08-28T09:54:46.2900656Z           "evidence": []
2026-08-28T09:54:46.2900801Z         },
2026-08-28T09:54:46.2900957Z         "unit": {
2026-08-28T09:54:46.2901120Z           "complete": false,
2026-08-28T09:54:46.2901281Z           "evidence": []
2026-08-28T09:54:46.2901425Z         }
2026-08-28T09:54:46.2901567Z       }
2026-08-28T09:54:46.2901712Z     },
2026-08-28T09:54:46.2901863Z     {
2026-08-28T09:54:46.2902050Z       "id": "REQ-BENCH-STEP-LEDGER",
2026-08-28T09:54:46.2910214Z       "title": "BUILD-STEP TIMINGS ARE RECORDED AS ONE JSONL ROW SHAPE, READ ON DEMAND, AND GATE NOTHING. Coverage is CI workflow steps AND the local mechanical steps agents invoke on this box (gate-rig prebuilds, wave gate lanes, assembly compile-gate, release packaging) -- the local gate builds are the largest measured wall-clock sink and are invisible to CI timing entirely. Instrumentation lives in the workflow and in xtask timing wraps; it is NOT an spt binary feature. ONE ROW SHAPE: step name, sha or input-key, host, duration, timestamp -- plus an ok flag, because an aggregate that blends a three-second failure with a twenty-minute success under one step name describes neither, so failures are excluded rather than averaged in. TWO WRITERS, ONE FORMAT: the local wrap is xtask, the CI wrap is a shell snippet (the xtask binary cannot time the build that produces it), and a parity test pins the snippet against the single field list, because a format that drifts silently makes the history unreadable at exactly the moment somebody wants a trend. THE LEDGER IS NEVER COMMITTED: CI emits a per-run artifact, local steps append to a gitignored directory; a hand-maintained ledger file in git is the conflict-magnet class every lane would touch. REDUNDANCY IS KEYED ON THE INPUT, never on the run count: two runs of one step at the SAME key is repeated work and two runs at DIFFERENT keys is just work, and a counter that cannot tell them apart flags every honest build as waste; a repeat is reported as a CANDIDATE, since a rerun after a fix is legitimate. WRAPPING IS TRANSPARENT: the wrapped command's stdio is inherited untouched and its exit code is propagated, so instrumenting a step cannot change what that step does or how a caller reads it. Consumption is `xtask bench-report` on demand, read at milestone close-out, findings become filings. NO dashboard and NO per-run regression gate: this box's wall-clock moves with whatever else is building on it, so a threshold would manufacture reds out of load.",
2026-08-28T09:54:46.2910547Z       "requiredStages": [
2026-08-28T09:54:46.2910695Z         "impl",
2026-08-28T09:54:46.2910850Z         "unit"
2026-08-28T09:54:46.2910998Z       ],
2026-08-28T09:54:46.2911150Z       "stages": {
2026-08-28T09:54:46.2911303Z         "doc": {
2026-08-28T09:54:46.2911474Z           "complete": false,
2026-08-28T09:54:46.2911638Z           "evidence": []
2026-08-28T09:54:46.2911789Z         },
2026-08-28T09:54:46.2911943Z         "impl": {
2026-08-28T09:54:46.2912104Z           "complete": true,
2026-08-28T09:54:46.2912257Z           "evidence": [
2026-08-28T09:54:46.2912404Z             {
2026-08-28T09:54:46.2912606Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.2912762Z               "line": 392
2026-08-28T09:54:46.2912921Z             },
2026-08-28T09:54:46.2913072Z             {
2026-08-28T09:54:46.2913259Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.2913419Z               "line": 2956
2026-08-28T09:54:46.2913567Z             },
2026-08-28T09:54:46.2913712Z             {
2026-08-28T09:54:46.2913879Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.2914031Z               "line": 3004
2026-08-28T09:54:46.2914176Z             }
2026-08-28T09:54:46.2914394Z           ]
2026-08-28T09:54:46.2914590Z         },
2026-08-28T09:54:46.2914742Z         "int": {
2026-08-28T09:54:46.2915033Z           "complete": false,
2026-08-28T09:54:46.2915186Z           "evidence": []
2026-08-28T09:54:46.2915338Z         },
2026-08-28T09:54:46.2915491Z         "unit": {
2026-08-28T09:54:46.2915658Z           "complete": true,
2026-08-28T09:54:46.2915811Z           "evidence": [
2026-08-28T09:54:46.2915961Z             {
2026-08-28T09:54:46.2916161Z               "path": "crates/xtask/src/bench.rs",
2026-08-28T09:54:46.2916321Z               "line": 328
2026-08-28T09:54:46.2916480Z             },
2026-08-28T09:54:46.2916626Z             {
2026-08-28T09:54:46.2916809Z               "path": "crates/xtask/src/bench.rs",
2026-08-28T09:54:46.2916965Z               "line": 368
2026-08-28T09:54:46.2917114Z             },
2026-08-28T09:54:46.2917251Z             {
2026-08-28T09:54:46.2917438Z               "path": "crates/xtask/src/bench.rs",
2026-08-28T09:54:46.2917599Z               "line": 399
2026-08-28T09:54:46.2917757Z             },
2026-08-28T09:54:46.2917967Z             {
2026-08-28T09:54:46.2918191Z               "path": "crates/xtask/tests/bench_row_parity.rs",
2026-08-28T09:54:46.2918349Z               "line": 115
2026-08-28T09:54:46.2918501Z             },
2026-08-28T09:54:46.2918659Z             {
2026-08-28T09:54:46.2918871Z               "path": "crates/xtask/tests/bench_row_parity.rs",
2026-08-28T09:54:46.2919130Z               "line": 138
2026-08-28T09:54:46.2919287Z             },
2026-08-28T09:54:46.2919435Z             {
2026-08-28T09:54:46.2919645Z               "path": "crates/xtask/tests/bench_row_parity.rs",
2026-08-28T09:54:46.2919801Z               "line": 159
2026-08-28T09:54:46.2919950Z             },
2026-08-28T09:54:46.2920102Z             {
2026-08-28T09:54:46.2920313Z               "path": "crates/xtask/tests/bench_row_parity.rs",
2026-08-28T09:54:46.2920474Z               "line": 266
2026-08-28T09:54:46.2920623Z             }
2026-08-28T09:54:46.2920774Z           ]
2026-08-28T09:54:46.2920919Z         }
2026-08-28T09:54:46.2921188Z       }
2026-08-28T09:54:46.2921344Z     },
2026-08-28T09:54:46.2921496Z     {
2026-08-28T09:54:46.2921677Z       "id": "REQ-BIND-HONEST-SELF-STAMP",
2026-08-28T09:54:46.2927903Z       "title": "C2-ROOT (F028, doyle RCA 2026-07-03): the identity-attribution ROOT behind REQ-SESSIONS-LOG-ENDPOINT-ATTRIBUTION — three composing defects let a psyche-hosted SessionStart hook stamp a FOREIGN perch: (1) roster::detect_self_id leg (a) scans the owlery ONE level (roster.rs:107 read_dir(owlery)) so a NESTED psyche perch owlery/<parent>/nested/<id>-psyche can never self-resolve; (2) [session.psyche_init] (claude-spt manifest ~L347) spawns the psyche with NO env_remove + no pinned child identity, so whatever OWL_SESSION_ID/SPT_AGENT_ID reaches the child resolves to a foreign top-level perch; (3) the hook then writes info.json (session_id/pid rebind) + sessions.log on the mis-resolved victim. FIX (spt-core half): (i) identity PINNED at spawn — ManifestRuntime role spawns inject the child's OWN SPT_AGENT_ID=<child perch id> + OWL_SESSION_ID=<child session>, AND detect_self_id enumerates NESTED perches (fix the one-level owlery scan); (ii) BIND HONESTY — a session-start stamp may only write a perch whose resolved id AFFIRMATIVELY matches; never a fallback pick; refuse + loud-skip when unresolved (kin REQ-MSG-CLI-ORIGIN honest-default + #9 ancestry). ADAPTER half = PERRI touchpoint (psyche_init env scrubbing / relies on runtime pinning; hook loses silent fallback-perch behavior) — FLAG doyle BEFORE any manifest move (adapter glue-model rule). See triage C2 fix (i)+(ii).",
2026-08-28T09:54:46.2928093Z       "requiredStages": [
2026-08-28T09:54:46.2928242Z         "impl",
2026-08-28T09:54:46.2928389Z         "unit",
2026-08-28T09:54:46.2928542Z         "int"
2026-08-28T09:54:46.2928694Z       ],
2026-08-28T09:54:46.2928842Z       "stages": {
2026-08-28T09:54:46.2929080Z         "doc": {
2026-08-28T09:54:46.2929243Z           "complete": false,
2026-08-28T09:54:46.2929398Z           "evidence": []
2026-08-28T09:54:46.2929556Z         },
2026-08-28T09:54:46.2929704Z         "impl": {
2026-08-28T09:54:46.2929990Z           "complete": true,
2026-08-28T09:54:46.2930148Z           "evidence": [
2026-08-28T09:54:46.2930296Z             {
2026-08-28T09:54:46.2930496Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.2930653Z               "line": 909
2026-08-28T09:54:46.2930802Z             },
2026-08-28T09:54:46.2930953Z             {
2026-08-28T09:54:46.2931145Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.2931306Z               "line": 268
2026-08-28T09:54:46.2931455Z             },
2026-08-28T09:54:46.2931601Z             {
2026-08-28T09:54:46.2931791Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.2931941Z               "line": 200
2026-08-28T09:54:46.2932089Z             }
2026-08-28T09:54:46.2932238Z           ]
2026-08-28T09:54:46.2932390Z         },
2026-08-28T09:54:46.2932547Z         "int": {
2026-08-28T09:54:46.2932710Z           "complete": true,
2026-08-28T09:54:46.2932867Z           "evidence": [
2026-08-28T09:54:46.2933015Z             {
2026-08-28T09:54:46.2933262Z               "path": "crates/spt/tests/bind_honest_cross_perch_e2e.rs",
2026-08-28T09:54:46.2933416Z               "line": 172
2026-08-28T09:54:46.2933591Z             }
2026-08-28T09:54:46.2933759Z           ]
2026-08-28T09:54:46.2933930Z         },
2026-08-28T09:54:46.2934106Z         "unit": {
2026-08-28T09:54:46.2934289Z           "complete": true,
2026-08-28T09:54:46.2934445Z           "evidence": [
2026-08-28T09:54:46.2934591Z             {
2026-08-28T09:54:46.2934785Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.2934938Z               "line": 602
2026-08-28T09:54:46.2935095Z             },
2026-08-28T09:54:46.2935237Z             {
2026-08-28T09:54:46.2935429Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.2935582Z               "line": 555
2026-08-28T09:54:46.2935730Z             }
2026-08-28T09:54:46.2935996Z           ]
2026-08-28T09:54:46.2936148Z         }
2026-08-28T09:54:46.2936302Z       }
2026-08-28T09:54:46.2936463Z     },
2026-08-28T09:54:46.2936645Z     {
2026-08-28T09:54:46.2936851Z       "id": "REQ-BIND-PSYCHE-CUSTODY-SQUAT-GUARD",
2026-08-28T09:54:46.2941108Z       "title": "MSG-IDENTITY W1 / F-036 leg c (perri field RCA, doyle ACCEPTED defense-in-depth): a bind whose --set-session-id equals a NESTED psyche perch's own custody sid is definitionally wrong and MUST be refused — core owns psyche-custody.json and can see the collision at bind time. ROOT CONTEXT: with the F-036 env leak, each stolen bind carried a psyche sid as the new pin; the identity-env sanitize (leg a) removes the known vector, this guard makes the CLASS unreachable (any future vector that tries to rotate a real endpoint's perch onto a psyche's custody sid is refused loud). Gate: a bind attempt whose target sid appears in psyche-custody.json as a psyche's OWN sid is REFUSED with a distinct loud token (unit: custody-sid collision refuses; a normal non-custody sid bind is unaffected). Kin REQ-PSYCHE-SID-CUSTODY, session-pin cluster, [[spt-core-findings-backlog]] F-036.",
2026-08-28T09:54:46.2941303Z       "requiredStages": [
2026-08-28T09:54:46.2941466Z         "impl",
2026-08-28T09:54:46.2941613Z         "unit"
2026-08-28T09:54:46.2941767Z       ],
2026-08-28T09:54:46.2941923Z       "stages": {
2026-08-28T09:54:46.2942076Z         "doc": {
2026-08-28T09:54:46.2942237Z           "complete": false,
2026-08-28T09:54:46.2942399Z           "evidence": []
2026-08-28T09:54:46.2942549Z         },
2026-08-28T09:54:46.2942708Z         "impl": {
2026-08-28T09:54:46.2945464Z           "complete": true,
2026-08-28T09:54:46.2945670Z           "evidence": [
2026-08-28T09:54:46.2945827Z             {
2026-08-28T09:54:46.2946060Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:46.2946228Z               "line": 105
2026-08-28T09:54:46.2946374Z             },
2026-08-28T09:54:46.2946528Z             {
2026-08-28T09:54:46.2946728Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.2947047Z               "line": 186
2026-08-28T09:54:46.2947201Z             },
2026-08-28T09:54:46.2947343Z             {
2026-08-28T09:54:46.2947553Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2947708Z               "line": 55
2026-08-28T09:54:46.2947861Z             },
2026-08-28T09:54:46.2948006Z             {
2026-08-28T09:54:46.2948213Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.2948369Z               "line": 553
2026-08-28T09:54:46.2948513Z             }
2026-08-28T09:54:46.2948660Z           ]
2026-08-28T09:54:46.2948803Z         },
2026-08-28T09:54:46.2949151Z         "int": {
2026-08-28T09:54:46.2949323Z           "complete": false,
2026-08-28T09:54:46.2949485Z           "evidence": []
2026-08-28T09:54:46.2949628Z         },
2026-08-28T09:54:46.2949780Z         "unit": {
2026-08-28T09:54:46.2949938Z           "complete": true,
2026-08-28T09:54:46.2950100Z           "evidence": [
2026-08-28T09:54:46.2950248Z             {
2026-08-28T09:54:46.2950476Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:46.2950638Z               "line": 216
2026-08-28T09:54:46.2950781Z             },
2026-08-28T09:54:46.2950929Z             {
2026-08-28T09:54:46.2951143Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:46.2951302Z               "line": 244
2026-08-28T09:54:46.2951449Z             },
2026-08-28T09:54:46.2951597Z             {
2026-08-28T09:54:46.2951796Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.2951946Z               "line": 631
2026-08-28T09:54:46.2952097Z             },
2026-08-28T09:54:46.2952246Z             {
2026-08-28T09:54:46.2952436Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.2952585Z               "line": 665
2026-08-28T09:54:46.2952740Z             },
2026-08-28T09:54:46.2952883Z             {
2026-08-28T09:54:46.2953090Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2953382Z               "line": 1432
2026-08-28T09:54:46.2953520Z             },
2026-08-28T09:54:46.2953663Z             {
2026-08-28T09:54:46.2953863Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.2954020Z               "line": 1460
2026-08-28T09:54:46.2954164Z             },
2026-08-28T09:54:46.2954311Z             {
2026-08-28T09:54:46.2954507Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.2954669Z               "line": 2540
2026-08-28T09:54:46.2954813Z             },
2026-08-28T09:54:46.2954959Z             {
2026-08-28T09:54:46.2955156Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.2955308Z               "line": 2580
2026-08-28T09:54:46.2955457Z             },
2026-08-28T09:54:46.2955607Z             {
2026-08-28T09:54:46.2955797Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.2955957Z               "line": 3116
2026-08-28T09:54:46.2956110Z             }
2026-08-28T09:54:46.2956258Z           ]
2026-08-28T09:54:46.2956406Z         }
2026-08-28T09:54:46.2956577Z       }
2026-08-28T09:54:46.2956735Z     },
2026-08-28T09:54:46.2956920Z     {
2026-08-28T09:54:46.2957212Z       "id": "REQ-BOUNDARY-ROTATION-CREDENTIAL",
2026-08-28T09:54:46.2959397Z       "title": "api boundary's rotation credential is designed, documented, and eventually anchor-proven (ADR-0032): the proof is the DEPARTED session's (prior sid / token) — --to-session-id is payload, never proof; the published surface documents the adapter prior-sid persistence pattern + loud-refusal requirement; the design-true end-state additionally accepts an OS-verified parent_pid-anchor ancestry proof making adapter sid-state optional",
2026-08-28T09:54:46.2959569Z       "requiredStages": [
2026-08-28T09:54:46.2959721Z         "doc"
2026-08-28T09:54:46.2959869Z       ],
2026-08-28T09:54:46.2960017Z       "stages": {
2026-08-28T09:54:46.2960218Z         "doc": {
2026-08-28T09:54:46.2960484Z           "complete": true,
2026-08-28T09:54:46.2960751Z           "evidence": [
2026-08-28T09:54:46.2961198Z             {
2026-08-28T09:54:46.2961436Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:46.2961604Z               "line": 187
2026-08-28T09:54:46.2961756Z             },
2026-08-28T09:54:46.2961904Z             {
2026-08-28T09:54:46.2962152Z               "path": "docs/adr/0032-boundary-rotation-credential.md",
2026-08-28T09:54:46.2962309Z               "line": 3
2026-08-28T09:54:46.2962462Z             }
2026-08-28T09:54:46.2962614Z           ]
2026-08-28T09:54:46.2962811Z         },
2026-08-28T09:54:46.2962981Z         "impl": {
2026-08-28T09:54:46.2963155Z           "complete": false,
2026-08-28T09:54:46.2963315Z           "evidence": []
2026-08-28T09:54:46.2963467Z         },
2026-08-28T09:54:46.2963613Z         "int": {
2026-08-28T09:54:46.2963780Z           "complete": false,
2026-08-28T09:54:46.2963937Z           "evidence": []
2026-08-28T09:54:46.2964094Z         },
2026-08-28T09:54:46.2964251Z         "unit": {
2026-08-28T09:54:46.2964419Z           "complete": false,
2026-08-28T09:54:46.2964580Z           "evidence": []
2026-08-28T09:54:46.2964725Z         }
2026-08-28T09:54:46.2964871Z       }
2026-08-28T09:54:46.2965019Z     },
2026-08-28T09:54:46.2965167Z     {
2026-08-28T09:54:46.2965339Z       "id": "REQ-BRAIN-HASH-ONCE",
2026-08-28T09:54:46.2969962Z       "title": "REGISTRY-LIFECYCLE W1 (ADR-0040 rider; dropped THE-FORKENING W4 rider escalated — hertz re-measured live 2026-07-17: 61.29 MiB/s predicted vs 63.91 observed, 15.5%/core): the brain executable self-hash is captured EXACTLY ONCE per brain process (OnceLock in run_brain before the heartbeat loop); every write_ready reuses the cached value; failed capture stays None with no per-tick retry; current_exe_hash doc-comment corrected same commit. Once-at-start capture IS the resident-bytes truthfulness contract: the per-tick PATH re-read published the NEW file hash from a resident-OLD-bytes brain post-swap (breadcrumb lie in the enlyzeam class it exists to catch). 500ms ready-write cadence unchanged. Gate: impl — cached capture; unit — injected digest-counter==1 across initial+N heartbeat publishes with pid/generation/hash stable, fresh process fixture computes independently; existing D7 process-replacement e2e retained green (new brain publishes new hash first write).",
2026-08-28T09:54:46.2970281Z       "requiredStages": [
2026-08-28T09:54:46.2970434Z         "impl",
2026-08-28T09:54:46.2970586Z         "unit"
2026-08-28T09:54:46.2970734Z       ],
2026-08-28T09:54:46.2970883Z       "stages": {
2026-08-28T09:54:46.2971039Z         "doc": {
2026-08-28T09:54:46.2971202Z           "complete": false,
2026-08-28T09:54:46.2971364Z           "evidence": []
2026-08-28T09:54:46.2971508Z         },
2026-08-28T09:54:46.2971658Z         "impl": {
2026-08-28T09:54:46.2971821Z           "complete": true,
2026-08-28T09:54:46.2971977Z           "evidence": [
2026-08-28T09:54:46.2972131Z             {
2026-08-28T09:54:46.2972354Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.2972527Z               "line": 454
2026-08-28T09:54:46.2972674Z             }
2026-08-28T09:54:46.2972831Z           ]
2026-08-28T09:54:46.2972974Z         },
2026-08-28T09:54:46.2973127Z         "int": {
2026-08-28T09:54:46.2973294Z           "complete": false,
2026-08-28T09:54:46.2973447Z           "evidence": []
2026-08-28T09:54:46.2973599Z         },
2026-08-28T09:54:46.2973748Z         "unit": {
2026-08-28T09:54:46.2973907Z           "complete": true,
2026-08-28T09:54:46.2974070Z           "evidence": [
2026-08-28T09:54:46.2974216Z             {
2026-08-28T09:54:46.2974426Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.2974587Z               "line": 2255
2026-08-28T09:54:46.2974736Z             }
2026-08-28T09:54:46.2974882Z           ]
2026-08-28T09:54:46.2975031Z         }
2026-08-28T09:54:46.2975174Z       }
2026-08-28T09:54:46.2975323Z     },
2026-08-28T09:54:46.2975474Z     {
2026-08-28T09:54:46.2975670Z       "id": "REQ-BRAIN-RESUME-NO-CONN-DEADLOCK",
2026-08-28T09:54:46.2992332Z       "title": "UPDATE-WEDGE round 3 (v0.30.5, doyle-ruled Option A 2026-07-09 — the v0.30.4 field-verify re-wedge, root code-PROVEN + dead-peer-INDEPENDENT): the daemon brain must NOT subscribe broker PTY sessions onto its own request/reply IPC conn — it has no consumer for that output and the subscription DEADLOCKS the conn. ROOT (todlando code-read, docs/UPDATE-WEDGE-2-ROUND3-CODEREAD.md; the net-runtime AND the counter-54 reap-drive were both FALSIFIED first — docs/UPDATE-WEDGE-2-ROUND3-RIG-VERDICT.md): a conn's send half is a single `SharedSend = Arc<Mutex<SendHalf>>` (broker.rs:78). Subscriber writer threads (`viewer_writer` broker.rs:1333/1342, `controller_writer` :1451) hold `send.lock()` ACROSS a BLOCKING `write_frame`; the dispatch reply path (`send_frame` :4221 → KIND_SESSIONS_REPLY / KIND_NET_STATUS_REPLY) needs the SAME lock. `resume_sessions` (brain.rs:1031→1054) subscribes every session as a Viewer onto the brain's MAIN conn — which is ALSO the brain's request/reply channel. The daemon brain hosts no PTY sessions (brainproc.rs:184) so run_brain never drains that output; it reads the conn only during the 500ms-heartbeat net_status()/sessions() calls (drain-and-DISCARD, `_ => continue`). When an actively-streaming session backs the conn up, a subscriber writer BLOCKS in write_frame holding send.lock() → the dispatch thread can't send the heartbeat reply → net_status()/sessions() never return → the heartbeat loop stalls → the brain never drains → the writer stays blocked = SELF-DEADLOCK on the brain conn's send mutex → every subscriber writer on it wedges → BRAIN_SUBSCRIBER_STALL_EVICT (controller writer blocked >15s). BOTH severities, one mechanism: RESPAWN (resume subscribes N + the replay burst floods the conn before the loop drains) AND STEADY-STATE (an active streamer's output between heartbeats fills the socket buffer). Counter-54 (REQ-UPDATE-TRIAL-DRAIN-DRIVE) added a 2nd per-heartbeat reply round-trip (sessions()) through the contended mutex — WIDENED the window (regression-window-exact), did not create it. The round-2 Viewer fix (REQ-BRAIN-RESUME-NO-CONTROL-STEAL) removed the STEAL but kept the brain a SUBSCRIBER — viewer_writer has the same send.lock()-across-write pattern AND viewers have no stall-evict valve — so v0.30.4 field-verify wedged again. FIX (Option A, brain-side, SEAMLESS): resume_sessions does NOT subscribe (drop the subscribe_with call; §3 verification guard confirmed NO brain consumer — digest/relay/net-consumer/shellwake/presence — reads the resumed subs). The brain conn then carries only request/reply → no subscriber backpressure → no deadlock. Keep the session_cursors seed only if harmless. Rides the brain-swap ⇒ seamless (no daemon.rs:368 broker restart). Option B (a dedicated Split-reader drain of the brain conn, brain.rs:230 — the pump's carrier) is the FORWARD path for when genuinely daemon-DRIVEN sessions land (the live-agent adapter) — deferred, noted, not built. Option C (the broker-side durable CLASS fix) = REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK, deferred. Int = the confirmer rig (brain+broker+PTY, brain_decouple template): N sessions actively producing output, brain resume-subscribed onto its req/reply conn; RED-first = heartbeat stalls + an active-streaming controller stall-evicted >15s WITHOUT any dead peer present (proves dead-peer-independence); assert BOTH severities (respawn interleave + steady-state output backup); Option A turns both green. Composes with REQ-BRAIN-RESUME-NO-CONTROL-STEAL (the round-2 Viewer fix this supersedes as the wedge cure), REQ-UPDATE-TRIAL-DRAIN-DRIVE (the counter-54 reap-drive that widened the window), REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE (the stall-evict it stops triggering).",
2026-08-28T09:54:46.2992684Z       "requiredStages": [
2026-08-28T09:54:46.2992831Z         "doc",
2026-08-28T09:54:46.2992990Z         "impl",
2026-08-28T09:54:46.2993141Z         "int"
2026-08-28T09:54:46.2993285Z       ],
2026-08-28T09:54:46.2993450Z       "stages": {
2026-08-28T09:54:46.2993599Z         "doc": {
2026-08-28T09:54:46.2993876Z           "complete": true,
2026-08-28T09:54:46.2994037Z           "evidence": [
2026-08-28T09:54:46.2994191Z             {
2026-08-28T09:54:46.2994395Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.2994563Z               "line": 1567
2026-08-28T09:54:46.2994714Z             }
2026-08-28T09:54:46.2994863Z           ]
2026-08-28T09:54:46.2995009Z         },
2026-08-28T09:54:46.2995162Z         "impl": {
2026-08-28T09:54:46.2995331Z           "complete": true,
2026-08-28T09:54:46.2995494Z           "evidence": [
2026-08-28T09:54:46.2995655Z             {
2026-08-28T09:54:46.2995885Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.2996100Z               "line": 1605
2026-08-28T09:54:46.2996256Z             },
2026-08-28T09:54:46.2996409Z             {
2026-08-28T09:54:46.2996623Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.2996786Z               "line": 254
2026-08-28T09:54:46.2996942Z             },
2026-08-28T09:54:46.2997097Z             {
2026-08-28T09:54:46.2997300Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.2997458Z               "line": 5562
2026-08-28T09:54:46.2997615Z             }
2026-08-28T09:54:46.2997764Z           ]
2026-08-28T09:54:46.2997909Z         },
2026-08-28T09:54:46.2998062Z         "int": {
2026-08-28T09:54:46.2998222Z           "complete": true,
2026-08-28T09:54:46.2998380Z           "evidence": [
2026-08-28T09:54:46.2998527Z             {
2026-08-28T09:54:46.2998803Z               "path": "crates/spt-daemon/tests/brain_resume_conn_deadlock.rs",
2026-08-28T09:54:46.2999037Z               "line": 223
2026-08-28T09:54:46.2999238Z             },
2026-08-28T09:54:46.2999390Z             {
2026-08-28T09:54:46.2999653Z               "path": "crates/spt-daemon/tests/brain_resume_conn_deadlock.rs",
2026-08-28T09:54:46.2999814Z               "line": 243
2026-08-28T09:54:46.3000086Z             },
2026-08-28T09:54:46.3000235Z             {
2026-08-28T09:54:46.3000509Z               "path": "crates/spt-daemon/tests/brain_resume_conn_deadlock.rs",
2026-08-28T09:54:46.3000670Z               "line": 293
2026-08-28T09:54:46.3000817Z             }
2026-08-28T09:54:46.3000980Z           ]
2026-08-28T09:54:46.3001126Z         },
2026-08-28T09:54:46.3001276Z         "unit": {
2026-08-28T09:54:46.3001437Z           "complete": false,
2026-08-28T09:54:46.3001595Z           "evidence": []
2026-08-28T09:54:46.3001752Z         }
2026-08-28T09:54:46.3001895Z       }
2026-08-28T09:54:46.3002042Z     },
2026-08-28T09:54:46.3002192Z     {
2026-08-28T09:54:46.3002391Z       "id": "REQ-BRAIN-RESUME-NO-CONTROL-STEAL",
2026-08-28T09:54:46.3020440Z       "title": "UPDATE-WEDGE round 2 (v0.30.4, doyle-ruled 2026-07-09 — field incident on the counter-54 fetch--apply): a brain-respawn must NEVER steal, then stall-evict, the controller of a broker PTY session the daemon brain does not DRIVE. ROOT (field-pinned + SME, docs/UPDATE-WEDGE-2-RCA.md + docs/UPDATE-WEDGE-2-SME-todlando.md): `resume_sessions` (brain.rs:985) re-attaches EVERY session `KIND_SESSIONS` returns via `subscribe` = `subscribe_with(AttachIntent::Control, by:None)` (brain.rs:1450-1455). The docstring's 'a None identity never displaces (falls back to viewer)' is a MYTH for FREE / SAME-LOCAL-IDENTITY slots: `resolve_subscribe` (broker.rs:1134-1153) stall-evicts FIRST, then `become_controller` if the slot is now free OR the incumbent is also local (None==None) — viewer-fallback fires ONLY when a DIFFERENT REMOTE controls. So on a box with N spt-hosted broker PTYs, a brain-respawn STEALS the by:None controller of every free/local-controlled session (incl. the operator's LOCAL `spt rc`), which the daemon brain never drains (it hosts no PTY sessions — brainproc.rs:184) → 15s later `stall_evict_controller` (broker.rs:1039) releases driven_by → the session is UNCONTROLLABLE (Failure A). It also head-of-line-blocks the shared brain↔broker conn on the N-session controller-replay burst → every journaled `spt rc` retake deadlines ('brain IPC read deadline', the REQ-BROKER-ATTACH-JOURNAL-RESILIENT / #16 shared-conn symptom) → global rc failure on ALL N (Failure B). Field 2026-07-09 (operator-confirmed): fetch--apply 0.30.2→0.30.3 PROMOTED CLEANLY (the counter-54 fix worked) but under 7 spt-hosted PTYs (ALL with LOCAL by:None controllers) the resume SILENTLY STOLE all 7 (become_controller same-local re-take, NO Displaced notice → orphaned, output froze immediately, no rc-detach splash) + blocked every rc retake. The 5-vs-2 stall-evict split is ACTIVE-vs-IDLE, not remote-vs-local: 5 producing output → stolen writer blocked >15s → stall-evict; 2 idle → writer parked → no evict, but still silently stolen+frozen. The counter-54 promotion fix did NOT cause this — pre-existing resume-steal latent bug, hidden until N broker PTYs were present at a respawn; the single-black-holed-session A'-rig never exercised N-live-controllers-under-replay. FIX (brain-side): `resume_sessions` re-attaches as **Viewer** (`AttachIntent::Viewer`), NOT Control — a viewer never touches driven_by and is never stall-evicted (broker.rs:1063+ bounded try_send + private eviction), so steal-then-drop vanishes and the operator keeps/regains control; and it relieves shared-conn pressure (a slow viewer is DROPPED, never a 15s controller block) so rc retake gets through. Control ONLY for sessions the daemon brain genuinely DRIVES (empty set today → all become Viewer; forward-correct for the live-agent-adapter future). SECONDARY (escalation, ONLY if the gate shows residual B): stagger the resume re-attach + bound the viewer replay so the respawn burst can't saturate the conn. Int = the multi-broker-PTY-session RESPAWN rig (the coverage the A'-rig lacked): N real broker-spawned sessions with controllers producing output → real brain respawn/promote → assert (1) EVERY session keeps its controller across the swap (no stall-evict of a session the brain doesn't drive), (2) `spt rc` attaches/retakes IMMEDIATELY post-promote (no shared-conn saturation), (3) promotion still succeeds. RED-first: the current Control re-attach steals+evicts + deadlines rc. Composes with REQ-UPDATE-TRIAL-DRAIN-DRIVE (the orthogonal counter-54 promote fix), REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE (the stall-evict it stops mis-firing on non-driven sessions), REQ-BROKER-ATTACH-JOURNAL-RESILIENT (the #16 shared-conn resilience). Distinct from REQ-BRAIN-UPDATE-RESTART-CLEAN-CLOSE (that = the OLD brain's outgoing black-hole; this = the NEW brain's resume-steal).",
2026-08-28T09:54:46.3020983Z       "requiredStages": [
2026-08-28T09:54:46.3021140Z         "doc",
2026-08-28T09:54:46.3021293Z         "impl",
2026-08-28T09:54:46.3021441Z         "int"
2026-08-28T09:54:46.3021587Z       ],
2026-08-28T09:54:46.3021745Z       "stages": {
2026-08-28T09:54:46.3021890Z         "doc": {
2026-08-28T09:54:46.3022067Z           "complete": true,
2026-08-28T09:54:46.3022223Z           "evidence": [
2026-08-28T09:54:46.3022372Z             {
2026-08-28T09:54:46.3022548Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.3022720Z               "line": 697
2026-08-28T09:54:46.3022872Z             },
2026-08-28T09:54:46.3023016Z             {
2026-08-28T09:54:46.3023229Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.3023387Z               "line": 1566
2026-08-28T09:54:46.3023540Z             },
2026-08-28T09:54:46.3023683Z             {
2026-08-28T09:54:46.3023884Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.3024044Z               "line": 2350
2026-08-28T09:54:46.3024194Z             }
2026-08-28T09:54:46.3024345Z           ]
2026-08-28T09:54:46.3024487Z         },
2026-08-28T09:54:46.3024641Z         "impl": {
2026-08-28T09:54:46.3024802Z           "complete": true,
2026-08-28T09:54:46.3024965Z           "evidence": [
2026-08-28T09:54:46.3025112Z             {
2026-08-28T09:54:46.3025318Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.3025480Z               "line": 1583
2026-08-28T09:54:46.3025632Z             },
2026-08-28T09:54:46.3025872Z             {
2026-08-28T09:54:46.3026066Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.3026228Z               "line": 1606
2026-08-28T09:54:46.3026376Z             }
2026-08-28T09:54:46.3026525Z           ]
2026-08-28T09:54:46.3026671Z         },
2026-08-28T09:54:46.3026819Z         "int": {
2026-08-28T09:54:46.3026983Z           "complete": true,
2026-08-28T09:54:46.3027136Z           "evidence": [
2026-08-28T09:54:46.3027288Z             {
2026-08-28T09:54:46.3027537Z               "path": "crates/spt/tests/resume_no_control_steal_e2e.rs",
2026-08-28T09:54:46.3027702Z               "line": 361
2026-08-28T09:54:46.3027851Z             },
2026-08-28T09:54:46.3028007Z             {
2026-08-28T09:54:46.3028246Z               "path": "crates/spt/tests/resume_no_control_steal_e2e.rs",
2026-08-28T09:54:46.3028433Z               "line": 712
2026-08-28T09:54:46.3028604Z             },
2026-08-28T09:54:46.3028777Z             {
2026-08-28T09:54:46.3029134Z               "path": "crates/spt/tests/resume_no_control_steal_e2e.rs",
2026-08-28T09:54:46.3029291Z               "line": 738
2026-08-28T09:54:46.3029444Z             }
2026-08-28T09:54:46.3029594Z           ]
2026-08-28T09:54:46.3029747Z         },
2026-08-28T09:54:46.3029892Z         "unit": {
2026-08-28T09:54:46.3030056Z           "complete": false,
2026-08-28T09:54:46.3030212Z           "evidence": []
2026-08-28T09:54:46.3030356Z         }
2026-08-28T09:54:46.3030513Z       }
2026-08-28T09:54:46.3030656Z     },
2026-08-28T09:54:46.3030804Z     {
2026-08-28T09:54:46.3031014Z       "id": "REQ-BRAIN-UPDATE-RESTART-CLEAN-CLOSE",
2026-08-28T09:54:46.3040763Z       "title": "SEED (DEFERRED, doyle 2026-07-09 — post-counter-54 root-hardening for UPDATE-WEDGE; mint now, impl a FUTURE milestone): on a PLANNED brain-restart (`BRAIN_UPDATE_RESTART`, the seamless update-apply brain-cycle), the outgoing brain's LOCAL (by:None) controller conns are GRACEFULLY CLEAN-CLOSED as the brain is cycled, instead of hard-killed and left to black-hole. ROOT (field-pinned 2026-07-09, daemon.stderr.log L24277-24303): the update-restart path hard-kills the outgoing brain (`child.kill()`, brainproc.rs:851); its live-agent controller conns then block on dead pipes (never EOF) → the broker reads them WEDGED (broker.rs:2695-2700) → the new candidate's promotion DRAINED gate (`any_local_controller_wedged`, broker.rs:2704) stays true until the W2 stall-evict matures (~15s). REQ-UPDATE-TRIAL-DRAIN-DRIVE (counter-54) makes the candidate DRIVE that reap so it promotes within the 30s window — but at a ~15s wedge-maturity hitch (frozen PTYs during the swap). A CLEAN close makes the conn 'simply absent → drained=false AT ONCE → fast promote' (broker.rs:2699-2700), ELIMINATING the hitch = truly seamless (honors the paradigm the field freeze broke). SUPERSEDES the earlier livehost-reattach framing of 'Fix Y': livehost is SPAWN-FRESH (fresh session uuid/pid per boot, nothing to re-attach — wrong site, and it never ran in the trial window); the correct site is the brain-cycle / update-restart path (a bounded graceful-drain of the outgoing brain BEFORE the kill). Non-trivial: hard-kill → bounded graceful drain; a drain that hangs must NOT wedge the swap (timeout then kill anyway, never block the update). Composes with REQ-UPDATE-TRIAL-DRAIN-DRIVE (defense-in-depth reap-drive REMAINS for any conn that still black-holes — a peer/relay conn, a drain-timeout kill) + REQ-UPDATE-PROMOTE-DRAINED (the gate) + REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE (the stall-evict). Int: a planned update-restart under a live-agent controller conn → the new candidate promotes WITHOUT waiting the ~15s wedge-maturity (drained reads false immediately, no STALL_EVICT), RED-first vs the current hard-kill-then-reap-drive ~15s hitch.",
2026-08-28T09:54:46.3041106Z       "requiredStages": [],
2026-08-28T09:54:46.3041264Z       "stages": {
2026-08-28T09:54:46.3041416Z         "doc": {
2026-08-28T09:54:46.3041579Z           "complete": false,
2026-08-28T09:54:46.3041754Z           "evidence": []
2026-08-28T09:54:46.3042017Z         },
2026-08-28T09:54:46.3042171Z         "impl": {
2026-08-28T09:54:46.3042336Z           "complete": false,
2026-08-28T09:54:46.3042504Z           "evidence": []
2026-08-28T09:54:46.3042646Z         },
2026-08-28T09:54:46.3042803Z         "int": {
2026-08-28T09:54:46.3042963Z           "complete": false,
2026-08-28T09:54:46.3043115Z           "evidence": []
2026-08-28T09:54:46.3043264Z         },
2026-08-28T09:54:46.3043410Z         "unit": {
2026-08-28T09:54:46.3043579Z           "complete": false,
2026-08-28T09:54:46.3043735Z           "evidence": []
2026-08-28T09:54:46.3043898Z         }
2026-08-28T09:54:46.3044045Z       }
2026-08-28T09:54:46.3044202Z     },
2026-08-28T09:54:46.3044350Z     {
2026-08-28T09:54:46.3044556Z       "id": "REQ-BROKER-ATTACH-JOURNAL-RESILIENT",
2026-08-28T09:54:46.3048699Z       "title": "A poisoned EffectJournal mutex or a sick NetHost runtime must NOT permanently brick all future attaches. Bug #16 (URGENT): a live spt-hosted endpoint (eel-a) attach fails with 'brain IPC read deadline elapsed' after a self-update brain-respawn — the broker survives the respawn and one journaled op (dispatch_net_stream_open journal.apply_once + loopback open_stream runtime.block_on nethost.rs:1060) enters a bad state, so every journaled attach silently kills its per-conn reply thread while non-journaled ops keep working. Fix: recover PoisonError via into_inner (effect.rs apply_once, replace the .expect panics) so one panic cannot brick all attaches; bound the loopback open_stream block_on (nethost.rs:1060) like the QUIC bounded_block_on so a sick runtime fails fast with an error frame not an opaque 10s deadline. Reinforces REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #16.",
2026-08-28T09:54:46.3048881Z       "requiredStages": [
2026-08-28T09:54:46.3049104Z         "impl",
2026-08-28T09:54:46.3049258Z         "unit"
2026-08-28T09:54:46.3049404Z       ],
2026-08-28T09:54:46.3049672Z       "stages": {
2026-08-28T09:54:46.3049820Z         "doc": {
2026-08-28T09:54:46.3049991Z           "complete": false,
2026-08-28T09:54:46.3050150Z           "evidence": []
2026-08-28T09:54:46.3050296Z         },
2026-08-28T09:54:46.3050450Z         "impl": {
2026-08-28T09:54:46.3050606Z           "complete": true,
2026-08-28T09:54:46.3050763Z           "evidence": [
2026-08-28T09:54:46.3050909Z             {
2026-08-28T09:54:46.3051123Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.3051275Z               "line": 379
2026-08-28T09:54:46.3051423Z             },
2026-08-28T09:54:46.3051581Z             {
2026-08-28T09:54:46.3051787Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.3051947Z               "line": 1824
2026-08-28T09:54:46.3052097Z             }
2026-08-28T09:54:46.3052248Z           ]
2026-08-28T09:54:46.3052392Z         },
2026-08-28T09:54:46.3052548Z         "int": {
2026-08-28T09:54:46.3052702Z           "complete": false,
2026-08-28T09:54:46.3052858Z           "evidence": []
2026-08-28T09:54:46.3053012Z         },
2026-08-28T09:54:46.3053164Z         "unit": {
2026-08-28T09:54:46.3053329Z           "complete": true,
2026-08-28T09:54:46.3053481Z           "evidence": [
2026-08-28T09:54:46.3053632Z             {
2026-08-28T09:54:46.3053833Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.3053990Z               "line": 689
2026-08-28T09:54:46.3054134Z             }
2026-08-28T09:54:46.3054285Z           ]
2026-08-28T09:54:46.3054434Z         }
2026-08-28T09:54:46.3054581Z       }
2026-08-28T09:54:46.3054730Z     },
2026-08-28T09:54:46.3054872Z     {
2026-08-28T09:54:46.3055059Z       "id": "REQ-BROKER-EXIT-EVERY-REAP",
2026-08-28T09:54:46.3066544Z       "title": "PORTER (releases#201, todlando mechanism pass 2026-08-21): the broker exit waiter emits a terminal KIND_EXIT for EVERY reap it performs, INCLUDING the reap whose PtySession::wait() yields Err. This requirement states EXISTENCE; REQ-BROKER-OUTPUT-BEFORE-EXIT states ORDERING — the two are separate seams over the same frame, and any Exit this requirement adds is bound by that one's exit-behind-output enqueue discipline. TODAY broker.rs's `if let Ok(status) = status` gates the WHOLE Exit emission block, and only that block: the row removal, the best-effort kill, the drain bytes_forwarded quiesce and the reap-time unlatch (stamp_reaped, REQ-HAZARD-CONTROL-STAMP-LIFETIME) all sit OUTSIDE it and all still run on the Err arm (measured at b88fab2a: block spans broker.rs 6430-6457, stamp_reaped at 6467). So the session is genuinely, completely gone from the table AND the perch is unlatched, while NO Exit frame ever reaches the controller or viewer sinks — the attached rc has no terminal event to act on and burns its full 30s reconnect window over a session that can never come back. The Err arm is reachable in the field, not only under injection: PtySession::wait (spt-term/src/pty.rs:203) is `self.child.lock().unwrap().wait().map_err(SurfaceError::Io)`, so ANY Io error on the child handle takes it — the kill-vs-natural reap race included, where our own kill() and the child's natural exit contend for the same handle. AN ABSENT EXIT CODE IS NOT A ZERO AND IT IS NOT A NO-RECORD (the absent-is-not-zero discipline, releases#197): ExitEvent.code is ALREADY Option<i32>, so the Err arm can name the death with the code ABSENT rather than fabricating a 0 or suppressing the frame — a suppressed frame is indistinguishable to the viewer from a session still running. Gate: impl — Exit enqueued on BOTH arms of the wait outcome, code absent-but-named on Err, still behind the drain quiesce; unit — the event built for an Err reap carries code: None and is not skipped; int — a NARROW fault valve makes wait() yield Err while row removal, drain quiesce and stamp_reaped ALL still run (the existing SPT_TEST_EXIT_WAITER_SUPPRESSED is precedent for the shape but suppresses the ENTIRE waiter, so it does NOT reproduce this face) => the attached controller and viewer OBSERVE an Exit frame, with the valve-off control arm proving the same panel observes the healthy Exit (non-vacuity: a panel no assertion depends on is untested by construction); doc — KNOWN-HAZARDS.",
2026-08-28T09:54:46.3067319Z       "requiredStages": [
2026-08-28T09:54:46.3067568Z         "impl",
2026-08-28T09:54:46.3067877Z         "int"
2026-08-28T09:54:46.3068102Z       ],
2026-08-28T09:54:46.3068354Z       "stages": {
2026-08-28T09:54:46.3068588Z         "doc": {
2026-08-28T09:54:46.3068930Z           "complete": false,
2026-08-28T09:54:46.3069357Z           "evidence": []
2026-08-28T09:54:46.3069624Z         },
2026-08-28T09:54:46.3069881Z         "impl": {
2026-08-28T09:54:46.3070140Z           "complete": true,
2026-08-28T09:54:46.3070378Z           "evidence": [
2026-08-28T09:54:46.3070606Z             {
2026-08-28T09:54:46.3070830Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3070989Z               "line": 8118
2026-08-28T09:54:46.3071131Z             }
2026-08-28T09:54:46.3071275Z           ]
2026-08-28T09:54:46.3071435Z         },
2026-08-28T09:54:46.3071594Z         "int": {
2026-08-28T09:54:46.3071759Z           "complete": true,
2026-08-28T09:54:46.3071916Z           "evidence": [
2026-08-28T09:54:46.3072062Z             {
2026-08-28T09:54:46.3072306Z               "path": "crates/spt-daemon/tests/exit_every_reap.rs",
2026-08-28T09:54:46.3072467Z               "line": 289
2026-08-28T09:54:46.3072616Z             }
2026-08-28T09:54:46.3072767Z           ]
2026-08-28T09:54:46.3072912Z         },
2026-08-28T09:54:46.3073063Z         "unit": {
2026-08-28T09:54:46.3073226Z           "complete": false,
2026-08-28T09:54:46.3073387Z           "evidence": []
2026-08-28T09:54:46.3073537Z         }
2026-08-28T09:54:46.3073688Z       }
2026-08-28T09:54:46.3073827Z     },
2026-08-28T09:54:46.3073978Z     {
2026-08-28T09:54:46.3074176Z       "id": "REQ-BROKER-OUTPUT-BEFORE-EXIT",
2026-08-28T09:54:46.3079802Z       "title": "RC-RENDER-TRUTH W3 (ADR-0043 decision 1, hertz stale-glyphs RCA leg 1 P0): the PTY drain/output writer is the SOLE FIFO sequencer for terminal Output + Exit per attach sink — Exit is enqueued BEHIND all prior output (drain EOF/completion first, then Exit); the exit waiter never direct-writes KIND_EXIT around the queued output path (a mutex serializes bytes, not producer order). Kills the stranded-final-frame race (final EL/SGR-reset/cursor-show/?1049l lost when Exit overtakes Output — already admitted and compensated in the broker test suite, never fixed in production rc). Gate: impl — single sequencer, exit-behind-output enqueue; unit — ordering invariant on the writer queue (exit never precedes queued output for a sink); int — short-lived child emits 'XXXX ESC[2K ESC[?25h ESC[?1049l' then exits => that exact Output precedes Exit through the PRODUCTION broker->attach->rc path; doc — ADR-0043.",
2026-08-28T09:54:46.3080332Z       "requiredStages": [
2026-08-28T09:54:46.3080527Z         "doc",
2026-08-28T09:54:46.3080709Z         "impl",
2026-08-28T09:54:46.3080895Z         "unit",
2026-08-28T09:54:46.3081090Z         "int"
2026-08-28T09:54:46.3081272Z       ],
2026-08-28T09:54:46.3081467Z       "stages": {
2026-08-28T09:54:46.3081657Z         "doc": {
2026-08-28T09:54:46.3081859Z           "complete": true,
2026-08-28T09:54:46.3082048Z           "evidence": [
2026-08-28T09:54:46.3082226Z             {
2026-08-28T09:54:46.3082688Z               "path": "docs/adr/0043-terminal-render-lifecycle.md",
2026-08-28T09:54:46.3082966Z               "line": 45
2026-08-28T09:54:46.3083228Z             }
2026-08-28T09:54:46.3083491Z           ]
2026-08-28T09:54:46.3083748Z         },
2026-08-28T09:54:46.3083995Z         "impl": {
2026-08-28T09:54:46.3084200Z           "complete": true,
2026-08-28T09:54:46.3084397Z           "evidence": [
2026-08-28T09:54:46.3084591Z             {
2026-08-28T09:54:46.3084853Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3085053Z               "line": 3478
2026-08-28T09:54:46.3085232Z             },
2026-08-28T09:54:46.3085418Z             {
2026-08-28T09:54:46.3085828Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3086000Z               "line": 3618
2026-08-28T09:54:46.3086157Z             },
2026-08-28T09:54:46.3086305Z             {
2026-08-28T09:54:46.3086514Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3086668Z               "line": 3632
2026-08-28T09:54:46.3086820Z             },
2026-08-28T09:54:46.3086964Z             {
2026-08-28T09:54:46.3087153Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3087303Z               "line": 3812
2026-08-28T09:54:46.3087449Z             },
2026-08-28T09:54:46.3087613Z             {
2026-08-28T09:54:46.3087824Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3087983Z               "line": 8145
2026-08-28T09:54:46.3088130Z             }
2026-08-28T09:54:46.3088283Z           ]
2026-08-28T09:54:46.3088425Z         },
2026-08-28T09:54:46.3088579Z         "int": {
2026-08-28T09:54:46.3088749Z           "complete": true,
2026-08-28T09:54:46.3088908Z           "evidence": [
2026-08-28T09:54:46.3089145Z             {
2026-08-28T09:54:46.3089389Z               "path": "crates/spt-daemon/tests/render_lifecycle.rs",
2026-08-28T09:54:46.3089552Z               "line": 76
2026-08-28T09:54:46.3089713Z             }
2026-08-28T09:54:46.3089862Z           ]
2026-08-28T09:54:46.3090004Z         },
2026-08-28T09:54:46.3090160Z         "unit": {
2026-08-28T09:54:46.3090325Z           "complete": true,
2026-08-28T09:54:46.3090482Z           "evidence": [
2026-08-28T09:54:46.3090630Z             {
2026-08-28T09:54:46.3090835Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3091002Z               "line": 10184
2026-08-28T09:54:46.3091145Z             }
2026-08-28T09:54:46.3091297Z           ]
2026-08-28T09:54:46.3091446Z         }
2026-08-28T09:54:46.3091598Z       }
2026-08-28T09:54:46.3091746Z     },
2026-08-28T09:54:46.3091898Z     {
2026-08-28T09:54:46.3092081Z       "id": "REQ-BROKER-SCREEN-GRID",
2026-08-28T09:54:46.3096546Z       "title": "Bugs #6 + #12 + #7/#8-artifacts: the broker is a raw-byte pump with no screen model — OutputLog replays the raw ring from seq 0 into a fresh terminal on attach, so an alt-screen TUI (Claude Code) corrupts scrollback (#6) and rc-to-a-pre-running-endpoint garbles (#12 — rc and endpoint run --attach are the SAME client fn, so it is replay content not a client-VT bug). Fix: a server-side VT/grid/screen model (tmux/mosh-style) that maintains authoritative screen + alt/main + cursor and synthesizes a CLEAN current-screen repaint on attach instead of replaying mid-stream ring bytes. Also eliminates residual-cell artifacts on animate/scroll/resize (#7/#8). Operator NON-NEGOTIABLE: accurate PTY representation with zero artifacts. (win32 vterm in the report means this server-side emulator, not ConPTY which is already the backend.) See docs/NEXT-MILESTONE-BUG-TRIAGE.md #6/#12.",
2026-08-28T09:54:46.3097065Z       "requiredStages": [
2026-08-28T09:54:46.3097262Z         "doc",
2026-08-28T09:54:46.3097442Z         "impl",
2026-08-28T09:54:46.3097632Z         "unit",
2026-08-28T09:54:46.3097810Z         "int"
2026-08-28T09:54:46.3097989Z       ],
2026-08-28T09:54:46.3098177Z       "stages": {
2026-08-28T09:54:46.3098361Z         "doc": {
2026-08-28T09:54:46.3098557Z           "complete": true,
2026-08-28T09:54:46.3098756Z           "evidence": [
2026-08-28T09:54:46.3099052Z             {
2026-08-28T09:54:46.3099444Z               "path": "docs/adr/0031-server-side-screen-grid-render-repaint.md",
2026-08-28T09:54:46.3099648Z               "line": 17
2026-08-28T09:54:46.3099821Z             }
2026-08-28T09:54:46.3100006Z           ]
2026-08-28T09:54:46.3100183Z         },
2026-08-28T09:54:46.3100364Z         "impl": {
2026-08-28T09:54:46.3100568Z           "complete": true,
2026-08-28T09:54:46.3100754Z           "evidence": [
2026-08-28T09:54:46.3100928Z             {
2026-08-28T09:54:46.3101162Z               "path": "crates/spt-term/src/lib.rs",
2026-08-28T09:54:46.3101581Z               "line": 56
2026-08-28T09:54:46.3101758Z             },
2026-08-28T09:54:46.3101958Z             {
2026-08-28T09:54:46.3102210Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3102401Z               "line": 323
2026-08-28T09:54:46.3102577Z             },
2026-08-28T09:54:46.3102754Z             {
2026-08-28T09:54:46.3102993Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3103179Z               "line": 945
2026-08-28T09:54:46.3103356Z             },
2026-08-28T09:54:46.3103530Z             {
2026-08-28T09:54:46.3103771Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3103962Z               "line": 1245
2026-08-28T09:54:46.3104137Z             }
2026-08-28T09:54:46.3104320Z           ]
2026-08-28T09:54:46.3104490Z         },
2026-08-28T09:54:46.3104677Z         "int": {
2026-08-28T09:54:46.3104868Z           "complete": true,
2026-08-28T09:54:46.3105255Z           "evidence": [
2026-08-28T09:54:46.3105449Z             {
2026-08-28T09:54:46.3105697Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3105894Z               "line": 12057
2026-08-28T09:54:46.3106040Z             },
2026-08-28T09:54:46.3106187Z             {
2026-08-28T09:54:46.3106390Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.3106544Z               "line": 635
2026-08-28T09:54:46.3106685Z             }
2026-08-28T09:54:46.3106839Z           ]
2026-08-28T09:54:46.3106986Z         },
2026-08-28T09:54:46.3107135Z         "unit": {
2026-08-28T09:54:46.3107315Z           "complete": true,
2026-08-28T09:54:46.3107464Z           "evidence": [
2026-08-28T09:54:46.3107621Z             {
2026-08-28T09:54:46.3107822Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3107982Z               "line": 11700
2026-08-28T09:54:46.3108127Z             },
2026-08-28T09:54:46.3108278Z             {
2026-08-28T09:54:46.3108480Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3108641Z               "line": 1380
2026-08-28T09:54:46.3108916Z             },
2026-08-28T09:54:46.3109161Z             {
2026-08-28T09:54:46.3109384Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3109540Z               "line": 1394
2026-08-28T09:54:46.3109695Z             },
2026-08-28T09:54:46.3109837Z             {
2026-08-28T09:54:46.3110033Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3110180Z               "line": 1416
2026-08-28T09:54:46.3110329Z             },
2026-08-28T09:54:46.3110471Z             {
2026-08-28T09:54:46.3110658Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3110819Z               "line": 1435
2026-08-28T09:54:46.3110968Z             },
2026-08-28T09:54:46.3111119Z             {
2026-08-28T09:54:46.3111333Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3111497Z               "line": 1448
2026-08-28T09:54:46.3111641Z             },
2026-08-28T09:54:46.3111812Z             {
2026-08-28T09:54:46.3112013Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3112169Z               "line": 1472
2026-08-28T09:54:46.3112323Z             },
2026-08-28T09:54:46.3112475Z             {
2026-08-28T09:54:46.3112666Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3112823Z               "line": 1482
2026-08-28T09:54:46.3113004Z             },
2026-08-28T09:54:46.3113152Z             {
2026-08-28T09:54:46.3113352Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3113511Z               "line": 1493
2026-08-28T09:54:46.3113657Z             },
2026-08-28T09:54:46.3113811Z             {
2026-08-28T09:54:46.3114010Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3114172Z               "line": 1504
2026-08-28T09:54:46.3114322Z             },
2026-08-28T09:54:46.3114474Z             {
2026-08-28T09:54:46.3114665Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3114928Z               "line": 1514
2026-08-28T09:54:46.3115089Z             },
2026-08-28T09:54:46.3115238Z             {
2026-08-28T09:54:46.3115458Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.3115619Z               "line": 1522
2026-08-28T09:54:46.3115773Z             }
2026-08-28T09:54:46.3115918Z           ]
2026-08-28T09:54:46.3116068Z         }
2026-08-28T09:54:46.3116224Z       }
2026-08-28T09:54:46.3116368Z     },
2026-08-28T09:54:46.3116520Z     {
2026-08-28T09:54:46.3116719Z       "id": "REQ-BROKER-STOP-DENY-NAMES-BLAST",
2026-08-28T09:54:46.3126460Z       "title": "The endpoint-deny refusal TELLS THE CALLER WHAT IT COST THEM AND HOW TO PROCEED, carrying TWO required elements rather than a bare denial. FIRST, THE BLAST RADIUS BY NAME: the refusal states that the operation would kill the running sessions of all spt-hosted endpoints and LISTS THE RESIDENT SESSIONS, reusing the composition the live-session refusal already prints — a refusal that says only 'denied' teaches nothing, while one that names the eight endpoints about to die explains itself. SECOND, THE GROUND AND ITS CURE: the refusal names WHICH ground identified the caller as an endpoint, and the ONE action that clears THAT ground. THE PRINTED ACTION MUST BE TRUE FOR THE GROUND THAT ACTUALLY FIRED — an environment-variable ground prints unsetting that named variable, an ancestry ground prints running from a shell not descended from an agent session — because an instruction that cannot clear the condition it is offered for is the same defect as a warning that prints a command the reader cannot run, arriving from the opposite direction. THE REASON IT IS SAFE TO PRINT A CLEARING ACTION AT ALL is that clearing the environment does NOT clear the ground: an agent that unsets its identity variables is STILL caught by the ancestry leg, so the printed line helps a HUMAN whose shell merely inherited the variable while doing nothing for an agent trying to escape. That property is load-bearing and therefore PINNED BY ITS OWN UNIT — environment variables cleared plus an ancestry ground still refuses. Without that pin the printed unset line IS an escape hatch and this requirement inverts from a guard into a bypass manual, which is exactly the failure mode a prohibition written as text rather than enforced at the tool layer always reaches. Gate: impl — the two-element refusal composition with the per-ground clearing action selected from a TYPED ground rather than by matching the ground's prose, so the two can never disagree about which leg fired; unit — the refusal carries BOTH elements (the resident list AND the ground with its clearing action), each ground kind yields the action that actually clears it, and the escape-hatch pin: env cleared + ancestry ground still refuses.",
2026-08-28T09:54:46.3126784Z       "requiredStages": [
2026-08-28T09:54:46.3126943Z         "impl",
2026-08-28T09:54:46.3127089Z         "unit"
2026-08-28T09:54:46.3127236Z       ],
2026-08-28T09:54:46.3127397Z       "stages": {
2026-08-28T09:54:46.3127548Z         "doc": {
2026-08-28T09:54:46.3127717Z           "complete": false,
2026-08-28T09:54:46.3127878Z           "evidence": []
2026-08-28T09:54:46.3128031Z         },
2026-08-28T09:54:46.3128187Z         "impl": {
2026-08-28T09:54:46.3128350Z           "complete": true,
2026-08-28T09:54:46.3128502Z           "evidence": [
2026-08-28T09:54:46.3128655Z             {
2026-08-28T09:54:46.3128846Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3129089Z               "line": 7954
2026-08-28T09:54:46.3129247Z             },
2026-08-28T09:54:46.3129394Z             {
2026-08-28T09:54:46.3129581Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3129737Z               "line": 23800
2026-08-28T09:54:46.3129886Z             }
2026-08-28T09:54:46.3130032Z           ]
2026-08-28T09:54:46.3130180Z         },
2026-08-28T09:54:46.3130328Z         "int": {
2026-08-28T09:54:46.3130490Z           "complete": false,
2026-08-28T09:54:46.3130657Z           "evidence": []
2026-08-28T09:54:46.3130909Z         },
2026-08-28T09:54:46.3131062Z         "unit": {
2026-08-28T09:54:46.3131229Z           "complete": true,
2026-08-28T09:54:46.3131386Z           "evidence": [
2026-08-28T09:54:46.3131535Z             {
2026-08-28T09:54:46.3131715Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3131882Z               "line": 37819
2026-08-28T09:54:46.3132030Z             },
2026-08-28T09:54:46.3132178Z             {
2026-08-28T09:54:46.3132352Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3132519Z               "line": 37876
2026-08-28T09:54:46.3132665Z             }
2026-08-28T09:54:46.3132814Z           ]
2026-08-28T09:54:46.3132961Z         }
2026-08-28T09:54:46.3133109Z       }
2026-08-28T09:54:46.3133261Z     },
2026-08-28T09:54:46.3133406Z     {
2026-08-28T09:54:46.3133600Z       "id": "REQ-BROKER-STOP-ENDPOINT-DENY",
2026-08-28T09:54:46.3146213Z       "title": "A broker-stopping command invoked from a context that resolves to an spt ENDPOINT is a FULL NO-OP that refuses, under every flag combination. Two commands are broker-stopping: `spt daemon stop` (INCLUDING `--force`) and `spt update apply --finish`. THE GROUNDING IS THAT THE CALLER CANNOT SURVIVE ITS OWN COMMAND: stopping the broker kills the hosted PTY of every spt-hosted endpoint on the node INCLUDING THE INVOKER'S OWN, so the agent's next chained command dies with the session that would have reported the outcome — the failure is silent from the only side that could see it, which is why this is enforced at the tool layer and not written as advice an agent is asked to follow. THE HUMAN CONTRACT IS UNTOUCHED: the pre-existing live-session refusal keeps its exact shipped behavior and `--force` remains a human's override of it. The endpoint deny is deliberately NOT overridable by any flag, because the caller who would reach for `--force` here is precisely the caller who cannot live through the result; an override would be a footgun with a safety catch that only the wrong hand can reach. THE RESOLUTION SEAM IS REUSED, NEVER RE-INVENTED: the same agent-ground resolution the engine-room ceremony refusal already uses answers this question, so 'what counts as an agent' has ONE definition on this node and a change to it can never make two refusals disagree. REFUSAL PRECEDES EVERY SIDE EFFECT — before the live-session guard, before the stop-inhibit is minted, before any teardown — so a refused call leaves nothing behind to clean up. ONE GUARD SITE PER COMMAND FAMILY, and for the finish command that site is INSIDE the apply function's finish arm, which is what BOTH the explicit `update apply --finish` verb AND the composite update's lethal-last Finish leg route through: guarding the verb alone would leave the composite lethal, and guarding both separately would be two rules free to drift. The composite already treats a failed finish leg as non-aborting, so the refusal degrades into the existing contract instead of inventing one. THE NON-FINISH `apply` ARM STAYS UNGUARDED and that is a decision, not an omission: it hands off to the running broker in place, the broker survives, the invoker's PTY does not die, and guarding it would deny agents a leg that is safe for them today. Gate: impl — the pure deny decision over the reused agent-ground resolution, wired at both sites ahead of every side effect, with the single-site rationale stated at the finish guard so no one later adds a second one at the verb; unit — an endpoint context is refused with force=true and force=false alike, a human context is unaffected in both, the finish arm refuses while the non-finish arm proceeds, and the decision is pure over its ground input; int — an e2e proves an endpoint-context caller cannot stop the daemon by ANY flag combination and that the daemon is still running afterwards.",
2026-08-28T09:54:46.3146556Z       "requiredStages": [
2026-08-28T09:54:46.3146722Z         "impl",
2026-08-28T09:54:46.3146870Z         "unit",
2026-08-28T09:54:46.3147027Z         "int"
2026-08-28T09:54:46.3147171Z       ],
2026-08-28T09:54:46.3147443Z       "stages": {
2026-08-28T09:54:46.3147594Z         "doc": {
2026-08-28T09:54:46.3147767Z           "complete": false,
2026-08-28T09:54:46.3147928Z           "evidence": []
2026-08-28T09:54:46.3148077Z         },
2026-08-28T09:54:46.3148233Z         "impl": {
2026-08-28T09:54:46.3148394Z           "complete": true,
2026-08-28T09:54:46.3148550Z           "evidence": [
2026-08-28T09:54:46.3148693Z             {
2026-08-28T09:54:46.3148883Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3149137Z               "line": 7953
2026-08-28T09:54:46.3149284Z             },
2026-08-28T09:54:46.3149442Z             {
2026-08-28T09:54:46.3149617Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3149775Z               "line": 8008
2026-08-28T09:54:46.3149923Z             },
2026-08-28T09:54:46.3150076Z             {
2026-08-28T09:54:46.3150252Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3150414Z               "line": 9271
2026-08-28T09:54:46.3150567Z             }
2026-08-28T09:54:46.3150720Z           ]
2026-08-28T09:54:46.3150877Z         },
2026-08-28T09:54:46.3151021Z         "int": {
2026-08-28T09:54:46.3151185Z           "complete": true,
2026-08-28T09:54:46.3151344Z           "evidence": [
2026-08-28T09:54:46.3151491Z             {
2026-08-28T09:54:46.3151744Z               "path": "crates/spt/tests/broker_stop_endpoint_deny_e2e.rs",
2026-08-28T09:54:46.3151906Z               "line": 111
2026-08-28T09:54:46.3152059Z             }
2026-08-28T09:54:46.3152202Z           ]
2026-08-28T09:54:46.3152350Z         },
2026-08-28T09:54:46.3152496Z         "unit": {
2026-08-28T09:54:46.3152659Z           "complete": true,
2026-08-28T09:54:46.3152811Z           "evidence": [
2026-08-28T09:54:46.3152965Z             {
2026-08-28T09:54:46.3153146Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3153312Z               "line": 37787
2026-08-28T09:54:46.3153464Z             }
2026-08-28T09:54:46.3153620Z           ]
2026-08-28T09:54:46.3153771Z         }
2026-08-28T09:54:46.3153920Z       }
2026-08-28T09:54:46.3154071Z     },
2026-08-28T09:54:46.3154334Z     {
2026-08-28T09:54:46.3154521Z       "id": "REQ-BUILD-UNIQUE-BIN-NAMES",
2026-08-28T09:54:46.3158164Z       "title": "No two workspace packages declare a bin of the same name. Same-named bins share ONE `target/<profile>/` output filename, clobber each other, and a CARGO_BIN_EXE_* lookup then resolves to whichever built last (the PR#28 Windows gate-escape). The invariant was previously carried ONLY as prose that named a single counterpart by name, and prose of that shape ages the moment the counterpart moves: a reader greps the named bin, finds nothing, and concludes the hazard is retired. ENUMERATION IS BINDING: the check reads cargo metadata target list, NEVER `[[bin]]` manifest stanzas — a stanza grep is structurally unable to see an autodiscovered src/bin/*.rs target, so it would certify an absence it cannot observe, which is how a live bin was recorded as non-existent in the register.",
2026-08-28T09:54:46.3158351Z       "requiredStages": [
2026-08-28T09:54:46.3158512Z         "impl",
2026-08-28T09:54:46.3158657Z         "unit"
2026-08-28T09:54:46.3158812Z       ],
2026-08-28T09:54:46.3159045Z       "stages": {
2026-08-28T09:54:46.3159196Z         "doc": {
2026-08-28T09:54:46.3159363Z           "complete": false,
2026-08-28T09:54:46.3159520Z           "evidence": []
2026-08-28T09:54:46.3159673Z         },
2026-08-28T09:54:46.3159820Z         "impl": {
2026-08-28T09:54:46.3159978Z           "complete": true,
2026-08-28T09:54:46.3160135Z           "evidence": [
2026-08-28T09:54:46.3160284Z             {
2026-08-28T09:54:46.3160488Z               "path": "crates/xtask/src/binnames.rs",
2026-08-28T09:54:46.3160641Z               "line": 56
2026-08-28T09:54:46.3160793Z             },
2026-08-28T09:54:46.3160942Z             {
2026-08-28T09:54:46.3161136Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3161289Z               "line": 410
2026-08-28T09:54:46.3161442Z             }
2026-08-28T09:54:46.3161708Z           ]
2026-08-28T09:54:46.3161856Z         },
2026-08-28T09:54:46.3165275Z         "int": {
2026-08-28T09:54:46.3165548Z           "complete": false,
2026-08-28T09:54:46.3165715Z           "evidence": []
2026-08-28T09:54:46.3165862Z         },
2026-08-28T09:54:46.3166011Z         "unit": {
2026-08-28T09:54:46.3166177Z           "complete": true,
2026-08-28T09:54:46.3166345Z           "evidence": [
2026-08-28T09:54:46.3166491Z             {
2026-08-28T09:54:46.3166698Z               "path": "crates/xtask/src/binnames.rs",
2026-08-28T09:54:46.3166858Z               "line": 118
2026-08-28T09:54:46.3167005Z             },
2026-08-28T09:54:46.3167155Z             {
2026-08-28T09:54:46.3167357Z               "path": "crates/xtask/src/binnames.rs",
2026-08-28T09:54:46.3167513Z               "line": 135
2026-08-28T09:54:46.3167662Z             },
2026-08-28T09:54:46.3167808Z             {
2026-08-28T09:54:46.3167996Z               "path": "crates/xtask/src/binnames.rs",
2026-08-28T09:54:46.3168166Z               "line": 148
2026-08-28T09:54:46.3168315Z             },
2026-08-28T09:54:46.3168467Z             {
2026-08-28T09:54:46.3168658Z               "path": "crates/xtask/src/binnames.rs",
2026-08-28T09:54:46.3168820Z               "line": 160
2026-08-28T09:54:46.3169145Z             }
2026-08-28T09:54:46.3169307Z           ]
2026-08-28T09:54:46.3169467Z         }
2026-08-28T09:54:46.3169615Z       }
2026-08-28T09:54:46.3169765Z     },
2026-08-28T09:54:46.3169909Z     {
2026-08-28T09:54:46.3170099Z       "id": "REQ-CARRIER-CLAIM-EXCLUSIVE",
2026-08-28T09:54:46.3177162Z       "title": "MSG-IDENTITY W4 / F-033 + operator self-send probe 2026-07-09 (dup-delivery cluster, RCA-FIRST): a spooled message row is delivered by EXACTLY ONE carrier — the first carrier to take a row (hook-poll drain, relay idle-inject, relay-backlog, psyche) atomically CLAIMS it so no other carrier can re-deliver the same row. FIELD EVIDENCE (authoritative, operator-observed): a default-window doyle-to-doyle send while doyle was BUSY delivered on BOTH the busy POLL path AND the idle RELAY path; spool row 156: window='default', delivered=1, taken_leg='idle-inject' — the relay claimed a row a poll also surfaced (REQ-SPOOL-TAKE-AUDIT instrument, already shipped, is the RCA tool: taken_leg/taken_sid/taken_at per row). PRIOR: F-033 (perri 2026-07-08) — the psyche-download filing arrived as TWO copies, dup-delivery live-confirmed. RCA-FIRST (report-before-fix): pin whether the poll drains before/after the relay's delivered=1 mark; whether the busy-to-idle edge re-offers a row a poll already took; whether take-marking is atomic per carrier or check-then-mark racy. DISTINCT from F-035 (that = active_only window honor, spt-core exonerated; THIS = a default msg on both carriers — F-035's lock never asserted a default msg can't ride both). Gate: int — a default send to a BUSY live agent that polls mid-turn AND transitions idle delivers EXACTLY ONCE (spool-audit shows one taken_leg, recipient sees one copy); unit — concurrent take attempts on one row yield one winner. Kin REQ-SPOOL-TAKE-AUDIT, REQ-RELAY-NO-BUSY-DELIVER, REQ-IDLE-PARKED-DELIVERY, [[spt-core-findings-backlog]].",
2026-08-28T09:54:46.3177523Z       "requiredStages": [
2026-08-28T09:54:46.3177678Z         "impl",
2026-08-28T09:54:46.3177830Z         "unit",
2026-08-28T09:54:46.3177979Z         "int"
2026-08-28T09:54:46.3178126Z       ],
2026-08-28T09:54:46.3178284Z       "stages": {
2026-08-28T09:54:46.3178431Z         "doc": {
2026-08-28T09:54:46.3178594Z           "complete": false,
2026-08-28T09:54:46.3178751Z           "evidence": []
2026-08-28T09:54:46.3178899Z         },
2026-08-28T09:54:46.3179185Z         "impl": {
2026-08-28T09:54:46.3179361Z           "complete": true,
2026-08-28T09:54:46.3179524Z           "evidence": [
2026-08-28T09:54:46.3179666Z             {
2026-08-28T09:54:46.3179872Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3180032Z               "line": 502
2026-08-28T09:54:46.3180170Z             },
2026-08-28T09:54:46.3180426Z             {
2026-08-28T09:54:46.3180630Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3180803Z               "line": 539
2026-08-28T09:54:46.3180974Z             },
2026-08-28T09:54:46.3181127Z             {
2026-08-28T09:54:46.3181317Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3181475Z               "line": 589
2026-08-28T09:54:46.3181623Z             },
2026-08-28T09:54:46.3181776Z             {
2026-08-28T09:54:46.3181961Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3182123Z               "line": 692
2026-08-28T09:54:46.3182271Z             },
2026-08-28T09:54:46.3182415Z             {
2026-08-28T09:54:46.3182616Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3182772Z               "line": 726
2026-08-28T09:54:46.3182918Z             }
2026-08-28T09:54:46.3183063Z           ]
2026-08-28T09:54:46.3183209Z         },
2026-08-28T09:54:46.3183358Z         "int": {
2026-08-28T09:54:46.3183529Z           "complete": true,
2026-08-28T09:54:46.3183686Z           "evidence": [
2026-08-28T09:54:46.3183838Z             {
2026-08-28T09:54:46.3184073Z               "path": "crates/spt-store/tests/carrier_claim_int.rs",
2026-08-28T09:54:46.3184226Z               "line": 1
2026-08-28T09:54:46.3184377Z             },
2026-08-28T09:54:46.3184521Z             {
2026-08-28T09:54:46.3184754Z               "path": "crates/spt-store/tests/carrier_claim_int.rs",
2026-08-28T09:54:46.3184908Z               "line": 71
2026-08-28T09:54:46.3185049Z             }
2026-08-28T09:54:46.3185196Z           ]
2026-08-28T09:54:46.3185347Z         },
2026-08-28T09:54:46.3185523Z         "unit": {
2026-08-28T09:54:46.3185676Z           "complete": true,
2026-08-28T09:54:46.3185833Z           "evidence": [
2026-08-28T09:54:46.3185995Z             {
2026-08-28T09:54:46.3186197Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3186353Z               "line": 1501
2026-08-28T09:54:46.3186502Z             },
2026-08-28T09:54:46.3186648Z             {
2026-08-28T09:54:46.3187169Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.3187335Z               "line": 1571
2026-08-28T09:54:46.3187484Z             }
2026-08-28T09:54:46.3187645Z           ]
2026-08-28T09:54:46.3187837Z         }
2026-08-28T09:54:46.3187992Z       }
2026-08-28T09:54:46.3188140Z     },
2026-08-28T09:54:46.3188286Z     {
2026-08-28T09:54:46.3188458Z       "id": "REQ-CI-DOCS-ONLY-THIN",
2026-08-28T09:54:46.3194204Z       "title": "CI (operator-ruled 2026-07-16, from PR #8 review; registry-only extension operator-approved 2026-07-27; superseded for main pushes by ADR-0050 on 2026-07-29): a PR whose ENTIRE diff is Markdown OUTSIDE docs-site/ and/or the declarative `traceable-reqs.toml` registry runs THIN CI — the heavy build/test jobs are skipped via a changed-files classifier job. `traceable-reqs.toml` has no Rust/product consumer; its load-bearing correctness gate is traceability. Invariants: the traceability gate ALWAYS runs (doc/registry tags and activated-stage coverage are load-bearing evidence, and a run with zero checks is unmergeable); any docs-site/ change runs the PR lint/unit/traceability lane; any other non-Markdown path runs that same lane. Main pushes also run thin CI only; the full evidence for main's exact SHA is the uncancelled golden run that produced it, and main advances only by fast-forward to that tested SHA. The classifier is plain git diff over the PR merge commit (HEAD^1..HEAD, fetch-depth 2) — no third-party changed-files action on the self-hosted runners. Skipped-required-check note: GitHub treats an if-skipped job as satisfying required status checks, and the classifier + traceability always report, so thin PRs stay mergeable.",
2026-08-28T09:54:46.3194398Z       "requiredStages": [
2026-08-28T09:54:46.3194562Z         "impl"
2026-08-28T09:54:46.3194703Z       ],
2026-08-28T09:54:46.3194853Z       "stages": {
2026-08-28T09:54:46.3194999Z         "doc": {
2026-08-28T09:54:46.3195158Z           "complete": false,
2026-08-28T09:54:46.3195444Z           "evidence": []
2026-08-28T09:54:46.3195595Z         },
2026-08-28T09:54:46.3196098Z         "impl": {
2026-08-28T09:54:46.3196355Z           "complete": true,
2026-08-28T09:54:46.3196603Z           "evidence": [
2026-08-28T09:54:46.3196752Z             {
2026-08-28T09:54:46.3196946Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.3197100Z               "line": 16
2026-08-28T09:54:46.3197313Z             }
2026-08-28T09:54:46.3197495Z           ]
2026-08-28T09:54:46.3197663Z         },
2026-08-28T09:54:46.3197833Z         "int": {
2026-08-28T09:54:46.3198021Z           "complete": false,
2026-08-28T09:54:46.3198177Z           "evidence": []
2026-08-28T09:54:46.3198326Z         },
2026-08-28T09:54:46.3198481Z         "unit": {
2026-08-28T09:54:46.3198648Z           "complete": false,
2026-08-28T09:54:46.3198803Z           "evidence": []
2026-08-28T09:54:46.3199032Z         }
2026-08-28T09:54:46.3199184Z       }
2026-08-28T09:54:46.3199361Z     },
2026-08-28T09:54:46.3199499Z     {
2026-08-28T09:54:46.3199700Z       "id": "REQ-CI-FREE-SPACE-PREFLIGHT",
2026-08-28T09:54:46.3207721Z       "title": "Every CI job on a shared self-hosted runner FAILS LOUD AND FIRST on insufficient free disk, never obscurely on a downstream timing/space symptom: a preflight step asserts a free-space floor on the workspace drive and fails naming the RESOURCE (free bytes, floor, drive) so the next exhaustion costs one clear red instead of a release window of mystery flakes (proposer: deployah, during the v0.44.0 disk-exhaustion incident — the rule-failed-its-author-needs-a-mechanism shape: 'check disk first' was already a memory rule and still cost two CI windows because it lived in judgement, not mechanism). Floor calibration honest at mint: the observed incident burned tens of GB per suite run (leaked fixture dirs + build targets); pick a floor from measured suite consumption plus headroom and RECORD the derivation in the workflow comment — an unexplained magic number invites drift. AMENDED 2026-08-03 (hertz RCA of golden 30860770146, doyle-ruled option (i) the same day): 'FIRST' now means first among EXPENSIVE steps, not literally step 1, in the two two-host jobs — there the floor is asserted AFTER `actions/checkout`, because checkout runs `git clean -ffdx` and that IS the reclaim. Measured: the Windows test leg materialises ~50 GiB of gitignored `target/` (29,777 of 30,022 files written inside that job's own window), the next job's checkout deletes it, and twohost-a starts seconds later — so the pre-checkout read is taken at the disk's maximum. 30860770146 died exactly there: RESOURCE red at 24.4 GiB free, no test run, over bytes its own next step was about to reclaim; the reorder alone would have turned that red green with zero reclaim. The protective purpose is intact — checkout is seconds and every build is still downstream — but the ordering is now a stated exception rather than an accident, and the other jobs keep the literal-first shape.",
2026-08-28T09:54:46.3208075Z       "requiredStages": [
2026-08-28T09:54:46.3208223Z         "int"
2026-08-28T09:54:46.3208379Z       ],
2026-08-28T09:54:46.3208538Z       "stages": {
2026-08-28T09:54:46.3208684Z         "doc": {
2026-08-28T09:54:46.3208853Z           "complete": false,
2026-08-28T09:54:46.3209079Z           "evidence": []
2026-08-28T09:54:46.3209241Z         },
2026-08-28T09:54:46.3209401Z         "impl": {
2026-08-28T09:54:46.3209564Z           "complete": false,
2026-08-28T09:54:46.3209720Z           "evidence": []
2026-08-28T09:54:46.3209874Z         },
2026-08-28T09:54:46.3210025Z         "int": {
2026-08-28T09:54:46.3210184Z           "complete": true,
2026-08-28T09:54:46.3210345Z           "evidence": [
2026-08-28T09:54:46.3210489Z             {
2026-08-28T09:54:46.3210684Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.3210838Z               "line": 24
2026-08-28T09:54:46.3210993Z             },
2026-08-28T09:54:46.3211133Z             {
2026-08-28T09:54:46.3211318Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.3211594Z               "line": 73
2026-08-28T09:54:46.3211746Z             },
2026-08-28T09:54:46.3211901Z             {
2026-08-28T09:54:46.3212116Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.3212259Z               "line": 86
2026-08-28T09:54:46.3212402Z             },
2026-08-28T09:54:46.3212550Z             {
2026-08-28T09:54:46.3212732Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.3212926Z               "line": 122
2026-08-28T09:54:46.3213089Z             },
2026-08-28T09:54:46.3213231Z             {
2026-08-28T09:54:46.3213423Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.3213575Z               "line": 144
2026-08-28T09:54:46.3213724Z             },
2026-08-28T09:54:46.3213866Z             {
2026-08-28T09:54:46.3214062Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3214214Z               "line": 36
2026-08-28T09:54:46.3214382Z             },
2026-08-28T09:54:46.3214604Z             {
2026-08-28T09:54:46.3214851Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3215039Z               "line": 150
2026-08-28T09:54:46.3215209Z             },
2026-08-28T09:54:46.3215415Z             {
2026-08-28T09:54:46.3215606Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3215763Z               "line": 163
2026-08-28T09:54:46.3215906Z             },
2026-08-28T09:54:46.3216058Z             {
2026-08-28T09:54:46.3216246Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3216396Z               "line": 718
2026-08-28T09:54:46.3216545Z             },
2026-08-28T09:54:46.3216682Z             {
2026-08-28T09:54:46.3216880Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3217031Z               "line": 731
2026-08-28T09:54:46.3217211Z             },
2026-08-28T09:54:46.3217427Z             {
2026-08-28T09:54:46.3217638Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3217799Z               "line": 903
2026-08-28T09:54:46.3218076Z             },
2026-08-28T09:54:46.3218225Z             {
2026-08-28T09:54:46.3218410Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3218568Z               "line": 1013
2026-08-28T09:54:46.3218715Z             },
2026-08-28T09:54:46.3218860Z             {
2026-08-28T09:54:46.3219151Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3219307Z               "line": 1111
2026-08-28T09:54:46.3219465Z             },
2026-08-28T09:54:46.3219611Z             {
2026-08-28T09:54:46.3219806Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:46.3219966Z               "line": 54
2026-08-28T09:54:46.3220114Z             },
2026-08-28T09:54:46.3220261Z             {
2026-08-28T09:54:46.3220454Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:46.3220609Z               "line": 67
2026-08-28T09:54:46.3220763Z             },
2026-08-28T09:54:46.3220905Z             {
2026-08-28T09:54:46.3221097Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:46.3221258Z               "line": 132
2026-08-28T09:54:46.3221403Z             }
2026-08-28T09:54:46.3221549Z           ]
2026-08-28T09:54:46.3221698Z         },
2026-08-28T09:54:46.3221854Z         "unit": {
2026-08-28T09:54:46.3222018Z           "complete": false,
2026-08-28T09:54:46.3222182Z           "evidence": []
2026-08-28T09:54:46.3222330Z         }
2026-08-28T09:54:46.3222475Z       }
2026-08-28T09:54:46.3222628Z     },
2026-08-28T09:54:46.3222772Z     {
2026-08-28T09:54:46.3222952Z       "id": "REQ-CI-LINK-HEALTH-PROBE",
2026-08-28T09:54:46.3234806Z       "title": "The shared-runner quiet predicate gains a NETWORK axis: both two-host jobs measure the link to their peer immediately before rendezvous, print it, and carry it in the bench ledger. (INFRA-REGISTER IR-1; hertz 2026-08-03.) WHY THE EXISTING PREDICATE CANNOT SEE THIS: its two axes are process-shaped (zero non-terminal CI runs; no local cargo/rustc/nextest by parent chain), and both PASSED on run 30771155390 — a run whose link took 321s for a 1s checkout with bidirectional 10s QUIC dial timeouts, PUMP_PEER_FAIL moving a 0→3→0 and b 8→22→8 across green/red/rerun. A network-shaped red was triaged as a product one because nothing in the run recorded the network. kitsubito is wifi-only INDEFINITELY (operator-confirmed 2026-08-02), so the link cannot be hardened and the predicate must SEE it. JITTER IS THE SIGNAL, NOT THE MEDIAN: the motivating link mostly worked, so the probe takes 5 samples and records BOTH `link-rtt-med-<peer>` and `link-rtt-max-<peer>` rows — measured while building this, an idle link ran 10..83ms on one direction and 3..75ms on the other, i.e. the spread is the whole datum and a median alone reads healthy through the failure. ALSO CARRIED: DERP-vs-direct path (a relayed rendezvous is a different network than the one the rig's timings were tuned on), sample loss, and the peer's resolved IP so a reader can check it against the rig's own SPT_TWO_HOST_PEER_IP. AN INSTRUMENT, NOT A GATE — always exits 0, no threshold refuses a rendezvous: whether a number should is an unmade ruling, and a probe that reds a run converts 'the link was slow' into 'the suite failed', which is the confusion it exists to remove. A FAILED PROBE IS A LABELLED HOLE, NEVER SILENCE: no tailscale on PATH or no reply still writes an `ok:false` row, because 'attempted and did not land' is a different claim from 'never probed'. The absence of the CLI is TESTED rather than caught on the pwsh side (under GitHub's `stop` preference a missing command is terminating), and the bash side uses no `| head` (pipefail + SIGPIPE = 141 on an instrument). Gate: impl = .github/bench/link-probe.{sh,ps1} + the probe step in twohost-a (peer kitsubito) and twohost-b (peer hfenduleam), both exercised on the REAL boxes before shipping — five-sample success, no-reply, and absent-CLI arms on each shell, the absent-CLI mutation counted before it ran after a first attempt silently re-measured the unmutated arm; doc = docs/GOLDEN-CI.md 'The link is a third axis' (how to read the LINK line, what relay/loss/jitter each mean, and that the probe does not gate). Kin REQ-BENCH-STEP-LEDGER (the row shape these writers share, and whose parity gate now DISCOVERS its writers instead of listing them), REQ-CI-FREE-SPACE-PREFLIGHT (the same predicate's disk axis, amended the same day).",
2026-08-28T09:54:46.3235224Z       "requiredStages": [
2026-08-28T09:54:46.3235382Z         "doc",
2026-08-28T09:54:46.3235535Z         "impl"
2026-08-28T09:54:46.3235681Z       ],
2026-08-28T09:54:46.3235844Z       "stages": {
2026-08-28T09:54:46.3235991Z         "doc": {
2026-08-28T09:54:46.3236154Z           "complete": true,
2026-08-28T09:54:46.3236310Z           "evidence": [
2026-08-28T09:54:46.3236464Z             {
2026-08-28T09:54:46.3236668Z               "path": "docs/GOLDEN-CI.md",
2026-08-28T09:54:46.3236845Z               "line": 54
2026-08-28T09:54:46.3236992Z             }
2026-08-28T09:54:46.3237150Z           ]
2026-08-28T09:54:46.3237302Z         },
2026-08-28T09:54:46.3237455Z         "impl": {
2026-08-28T09:54:46.3237622Z           "complete": true,
2026-08-28T09:54:46.3237784Z           "evidence": [
2026-08-28T09:54:46.3237931Z             {
2026-08-28T09:54:46.3238125Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3238281Z               "line": 943
2026-08-28T09:54:46.3238425Z             },
2026-08-28T09:54:46.3238576Z             {
2026-08-28T09:54:46.3238787Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3239035Z               "line": 1047
2026-08-28T09:54:46.3239187Z             }
2026-08-28T09:54:46.3239336Z           ]
2026-08-28T09:54:46.3239487Z         },
2026-08-28T09:54:46.3239631Z         "int": {
2026-08-28T09:54:46.3239802Z           "complete": false,
2026-08-28T09:54:46.3239960Z           "evidence": []
2026-08-28T09:54:46.3240122Z         },
2026-08-28T09:54:46.3240275Z         "unit": {
2026-08-28T09:54:46.3240547Z           "complete": false,
2026-08-28T09:54:46.3240713Z           "evidence": []
2026-08-28T09:54:46.3240864Z         }
2026-08-28T09:54:46.3241011Z       }
2026-08-28T09:54:46.3241148Z     },
2026-08-28T09:54:46.3241297Z     {
2026-08-28T09:54:46.3241487Z       "id": "REQ-CI-LOAD-BEARING-PATCH-PIN",
2026-08-28T09:54:46.3253621Z       "title": "A `[patch.crates-io]` pin that FIXES A SHIPPED DEFECT is asserted still in force by `xtask check`, in BOTH of the two ways it can silently lapse. (INFRA-REGISTER IR-4 part 1, releases#125 fix-lane intake; hertz 2026-08-03.) THE PIN AT RISK: swarm-discovery 0.6.0-alpha.2's `updater::gc` answers a send to a stopped actor by scheduling another gc task 10ms later — a ~100 Hz retry loop per destroyed updater that can never reach a live receiver, so every updater recreation leaks one more loop. Latent in EVERY daemon since v0.38.1; the field cost was a kitsubito daemon burning two cores for two weeks (~9 accumulated loops). Fixed upstream in rkuhn/swarm-discovery PR #27, which is in NO crates.io release (0.6.3 predates it) and iroh pins swarm-discovery to EXACTLY 0.6.0-alpha.2, so no published version satisfies the graph — the tree carries a minimal-delta backport fork pinned by `rev`, i.e. content-addressed. TWO FAILURE MODES, WHICH IS WHY ONE ASSERTION IS NOT ENOUGH: (1) a routine `cargo update` or an iroh bump re-resolves Cargo.lock back to the registry crate while the stanza still sits in Cargo.toml looking correct — the lock disagrees with the manifest, or resolves from the registry outright; (2) the STANZA IS DELETED, after which there is nothing left for the lock to disagree with and a lock-only check reads clean over a reintroduced defect. So the manifest is asked whether the pin exists AT ALL, and only then is the lock asked whether it agrees. THE EXPECTED REV IS READ FROM THE MANIFEST, never duplicated into xtask: a third copy of the sha is one more thing to forget, and a legitimate re-pin would then red on the wrong file. What IS hardcoded is the crate plus the reason its patch is load-bearing — the judgement a lock file cannot carry and a human needs in order to decide whether dropping it is safe — and the refusal PRINTS that reason plus its own drop condition (upstream ships PR #27 AND iroh's pin reaches it), so the guard states when it should be removed rather than becoming permanent by default. Removing a crate from the guard list is therefore a reviewed edit in the same commit, not a silent lapse. Gate: impl = LOAD_BEARING_PATCHES + check_load_bearing_patch_pins wired into `xtask check` (already a golden docs-drift step on both OS legs, so this rides an existing leg rather than adding one); unit = the three failure modes each proved separately (deleted stanza, registry resolution, moved rev), the two parser traps that would make the guard answer for the wrong thing (a prefix-named crate, the trailing `[[patch.unused]]` table), and an arm that runs the real workspace so the guard cannot ship green against a tree it does not actually hold. Kin REQ-CI-WINDOWS-PHASE-A-BOUND, REQ-HEAVY-UNIT-CLASSIFICATION (same `xtask check` seam: a rule that outlived the memory it depended on).",
2026-08-28T09:54:46.3253948Z       "requiredStages": [
2026-08-28T09:54:46.3254100Z         "impl",
2026-08-28T09:54:46.3254256Z         "unit"
2026-08-28T09:54:46.3254400Z       ],
2026-08-28T09:54:46.3254546Z       "stages": {
2026-08-28T09:54:46.3254696Z         "doc": {
2026-08-28T09:54:46.3254861Z           "complete": false,
2026-08-28T09:54:46.3255020Z           "evidence": []
2026-08-28T09:54:46.3255171Z         },
2026-08-28T09:54:46.3255325Z         "impl": {
2026-08-28T09:54:46.3255486Z           "complete": true,
2026-08-28T09:54:46.3255650Z           "evidence": [
2026-08-28T09:54:46.3255796Z             {
2026-08-28T09:54:46.3255983Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3256139Z               "line": 637
2026-08-28T09:54:46.3256294Z             },
2026-08-28T09:54:46.3256436Z             {
2026-08-28T09:54:46.3256632Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3256892Z               "line": 683
2026-08-28T09:54:46.3257045Z             },
2026-08-28T09:54:46.3257198Z             {
2026-08-28T09:54:46.3257374Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3257532Z               "line": 712
2026-08-28T09:54:46.3257679Z             },
2026-08-28T09:54:46.3257832Z             {
2026-08-28T09:54:46.3258017Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3258171Z               "line": 732
2026-08-28T09:54:46.3258323Z             },
2026-08-28T09:54:46.3258467Z             {
2026-08-28T09:54:46.3258651Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3258800Z               "line": 764
2026-08-28T09:54:46.3259036Z             }
2026-08-28T09:54:46.3259185Z           ]
2026-08-28T09:54:46.3259330Z         },
2026-08-28T09:54:46.3259478Z         "int": {
2026-08-28T09:54:46.3259649Z           "complete": false,
2026-08-28T09:54:46.3259812Z           "evidence": []
2026-08-28T09:54:46.3259964Z         },
2026-08-28T09:54:46.3260113Z         "unit": {
2026-08-28T09:54:46.3260278Z           "complete": true,
2026-08-28T09:54:46.3260437Z           "evidence": [
2026-08-28T09:54:46.3260579Z             {
2026-08-28T09:54:46.3260766Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3260932Z               "line": 792
2026-08-28T09:54:46.3261077Z             },
2026-08-28T09:54:46.3261228Z             {
2026-08-28T09:54:46.3261410Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3261566Z               "line": 804
2026-08-28T09:54:46.3261711Z             },
2026-08-28T09:54:46.3261852Z             {
2026-08-28T09:54:46.3262033Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3262188Z               "line": 813
2026-08-28T09:54:46.3262336Z             },
2026-08-28T09:54:46.3262483Z             {
2026-08-28T09:54:46.3262689Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3262922Z               "line": 822
2026-08-28T09:54:46.3263150Z             },
2026-08-28T09:54:46.3263571Z             {
2026-08-28T09:54:46.3263785Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3263944Z               "line": 837
2026-08-28T09:54:46.3264094Z             },
2026-08-28T09:54:46.3264249Z             {
2026-08-28T09:54:46.3264432Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3264604Z               "line": 852
2026-08-28T09:54:46.3264778Z             },
2026-08-28T09:54:46.3264926Z             {
2026-08-28T09:54:46.3265111Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3265265Z               "line": 867
2026-08-28T09:54:46.3265421Z             },
2026-08-28T09:54:46.3265570Z             {
2026-08-28T09:54:46.3265760Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3265966Z               "line": 881
2026-08-28T09:54:46.3266123Z             }
2026-08-28T09:54:46.3266271Z           ]
2026-08-28T09:54:46.3266423Z         }
2026-08-28T09:54:46.3266576Z       }
2026-08-28T09:54:46.3266728Z     },
2026-08-28T09:54:46.3266877Z     {
2026-08-28T09:54:46.3267063Z       "id": "REQ-CI-LOCAL-GATE-DISPOSAL",
2026-08-28T09:54:46.3271482Z       "title": "Local gate-battery parity (path-scoped reap before target disposal + free-byte proof): a local self-hosted gate battery that creates a throwaway Cargo target reaps only process trees owned by that battery, with ownership proved by executable path or owned temporary/cache root under its workspace or declared target roots — never by process name alone; proves the scoped survivor census is zero BEFORE deleting the target; and reports drive free bytes before and after disposal. It MUST NOT machine-wide kill spt processes. Evidence: six Phase-B child daemons outlived suite completion for about two minutes in-job and indefinitely in local rigs; foreign job processes exited with the job; post+30s scoped census was zero. This extends existing CI end-reap semantics to local gate rigs, not production lifecycle behavior.",
2026-08-28T09:54:46.3271855Z       "requiredStages": [],
2026-08-28T09:54:46.3272017Z       "stages": {
2026-08-28T09:54:46.3272174Z         "doc": {
2026-08-28T09:54:46.3272337Z           "complete": false,
2026-08-28T09:54:46.3272497Z           "evidence": []
2026-08-28T09:54:46.3272645Z         },
2026-08-28T09:54:46.3272800Z         "impl": {
2026-08-28T09:54:46.3272963Z           "complete": false,
2026-08-28T09:54:46.3273129Z           "evidence": []
2026-08-28T09:54:46.3273278Z         },
2026-08-28T09:54:46.3273429Z         "int": {
2026-08-28T09:54:46.3273587Z           "complete": false,
2026-08-28T09:54:46.3273744Z           "evidence": []
2026-08-28T09:54:46.3273893Z         },
2026-08-28T09:54:46.3274040Z         "unit": {
2026-08-28T09:54:46.3274203Z           "complete": false,
2026-08-28T09:54:46.3274364Z           "evidence": []
2026-08-28T09:54:46.3274513Z         }
2026-08-28T09:54:46.3274669Z       }
2026-08-28T09:54:46.3274809Z     },
2026-08-28T09:54:46.3274960Z     {
2026-08-28T09:54:46.3275164Z       "id": "REQ-CI-NOTIFY-CANCELLED-CLASS",
2026-08-28T09:54:46.3283398Z       "title": "releases#107: the CI notifier classifies CANCELLED separately from FAILURE, so a cancelled golden run stops paging the fleet as a red. `.github/ci/ci-notify.sh` `check()` (lines 94-111) folds `failure | cancelled` into one `failing` string and renders `verdict=\"FAILURE\"` for any non-empty value. PRECEDENCE IS THE WHOLE RISK: a genuine failure normally CANCELS its siblings, so mixed failure+cancelled IS the shape of a real red — ANY `failure` present ⇒ FAILURE verdict (cancelled jobs may still be listed as context); ONLY zero failures AND ≥1 cancelled ⇒ the cancelled class, worded so it does not contain the word FAILURE. `skipped` stays non-red (REQ-CI-DOCS-ONLY-THIN deliberately skips jobs on docs-only PRs). Getting the precedence backwards silences real reds. Gate: impl — the split classes plus a LIBRARY seam, because the script is untestable as written (it `exit 0`s early when `spt` is absent from PATH and otherwise proceeds to real sends). Minted proposing a `CI_NOTIFY_DRY_RUN` env knob; SHIPPED as `SPT_CI_NOTIFY_LIB=1`, which sources the file for its `compute_verdict`/`compose_body` functions and returns before the probe/recipient/send sections — the seam `reap-census.sh` already established with `SPT_CI_REAP_LIB`, and it exposes the BODY as well as the verdict, which the wording half of this requirement needs. Executing (rather than sourcing) with the flag set exits 2 rather than no-opping to 0. unit — a `ci-notify-selftest.sh` driving the RESULT_* matrix (all-success / single-failure / all-cancelled / failure+cancelled / skipped-only / never-ran) and asserting both the verdict and the rendered body, wired into golden.yml the way `.github/ci/reap-census-selftest.sh` is. The selftest MUST carry a POSITIVE CONTROL — that a real FAILURE still pages — not merely that cancelled goes quiet. Kin REQ-CI-DOCS-ONLY-THIN, REQ-GOLDEN-CI-LANE.",
2026-08-28T09:54:46.3283786Z       "requiredStages": [
2026-08-28T09:54:46.3283970Z         "impl",
2026-08-28T09:54:46.3284115Z         "unit"
2026-08-28T09:54:46.3284270Z       ],
2026-08-28T09:54:46.3284420Z       "stages": {
2026-08-28T09:54:46.3284572Z         "doc": {
2026-08-28T09:54:46.3284740Z           "complete": false,
2026-08-28T09:54:46.3284896Z           "evidence": []
2026-08-28T09:54:46.3285049Z         },
2026-08-28T09:54:46.3285196Z         "impl": {
2026-08-28T09:54:46.3285359Z           "complete": true,
2026-08-28T09:54:46.3285515Z           "evidence": [
2026-08-28T09:54:46.3285667Z             {
2026-08-28T09:54:46.3285856Z               "path": ".github/ci/ci-notify.sh",
2026-08-28T09:54:46.3286013Z               "line": 92
2026-08-28T09:54:46.3286165Z             }
2026-08-28T09:54:46.3286308Z           ]
2026-08-28T09:54:46.3286466Z         },
2026-08-28T09:54:46.3286614Z         "int": {
2026-08-28T09:54:46.3286781Z           "complete": false,
2026-08-28T09:54:46.3286938Z           "evidence": []
2026-08-28T09:54:46.3287091Z         },
2026-08-28T09:54:46.3287358Z         "unit": {
2026-08-28T09:54:46.3287520Z           "complete": true,
2026-08-28T09:54:46.3287687Z           "evidence": [
2026-08-28T09:54:46.3287830Z             {
2026-08-28T09:54:46.3288044Z               "path": ".github/ci/ci-notify-selftest.sh",
2026-08-28T09:54:46.3288198Z               "line": 24
2026-08-28T09:54:46.3288354Z             },
2026-08-28T09:54:46.3288496Z             {
2026-08-28T09:54:46.3288697Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3288854Z               "line": 307
2026-08-28T09:54:46.3289092Z             }
2026-08-28T09:54:46.3289241Z           ]
2026-08-28T09:54:46.3289392Z         }
2026-08-28T09:54:46.3289541Z       }
2026-08-28T09:54:46.3289689Z     },
2026-08-28T09:54:46.3289832Z     {
2026-08-28T09:54:46.3290022Z       "id": "REQ-CI-POSTJOB-DAEMON-REAP",
2026-08-28T09:54:46.3302978Z       "title": "A CI job REAPS ITS OWN test-spawned daemons at battery end, in-job, and logs a process census at job start AND job end so contamination and reap effectiveness are visible in every run's log. (Load-flake family leg 1, doyle-ratified 2026-07-22 from deployah's third-run analysis.) THE SIGNATURE THIS CLOSES: a DIFFERENT single daemon-spawning test dying per run with a bare exit 1 and NO assertion output — process-level death, not a failed assert — while sibling tests in the same families pass alongside it, on BYTE-IDENTICAL code. Evidence: release PR #56 ran four times over a zero-.rs-delta tree; runs 1/2/3 killed brain_decouple (twice, on a disk-starved box), then adapter_translate, then adapter_digest at 105.9 GB free; box census during runs showed 43 live spt-family processes and 6486 handles against an 1881-test Phase-A full-parallel battery; run 4 went GREEN once disk and leaked session-0 daemons were cleared. WHY IN-JOB IS LOAD-BEARING AND NOT A CONVENIENCE: there are TWO leak populations on hfenduleam. Population A is session-1 (agent/gate-spawned) and is sweepable by path from any shell. Population B is SESSION-0, spawned by the actions.runner.* service — a session-1 shell CANNOT kill those (Access denied; ExecutablePath unreadable) even though they are healthy. Every CI run therefore leaves session-0 daemons behind that contend with the NEXT run while also leaking its own mid-run, and an external sweep can never reach them. The runner's own job context owns its session-0 children, so only a post-job step inside the job can reap them. KILL SCOPE IS NARROW AND PATH-VERIFIED PER-PID AT KILL TIME (never machine-wide, and never trusting the census snapshot, whose pids can be recycled): eligible only under the run's own build roots — CARGO_TARGET_DIR, the workspace target, the notify-adapter checkout's target, RUNNER_TEMP, and the pinned n1 old-broker build cache. TWO HARD EXCLUSIONS are checked AFTER the root test rather than instead of it, so that live infra survives a bug in the root computation: anything under an spt-core/bin/ install prefix, and any owl binary. A process whose image path cannot be READ is reported but NEVER killed — unreadable means unverifiable and the safe direction is to leave it standing. A BOUNDED SETTLE precedes the kill pass so a cleanly-exiting daemon is not counted as a leak; after it, a survivor is a leak by definition, which is what makes the strict-mode trigger a mechanism rather than a judgement call. Rides BOTH the test and n1-gate jobs (doyle scope ruling): n1_pairing spawns real daemon trees from the workspace and from the out-of-tree pin cache, so reaping one job leaves half the cause standing. Gate: impl — the two census/reap scripts under .github/ci/ plus their job-start and always() job-end wiring on both jobs, both runners. Kin REQ-CI-WINDOWS-PHASE-A-BOUND (the other cause-side leg), REQ-CI-DOCS-ONLY-THIN (recipe-layer precedent: impl-only, no product code).",
2026-08-28T09:54:46.3303312Z       "requiredStages": [
2026-08-28T09:54:46.3303464Z         "impl"
2026-08-28T09:54:46.3303617Z       ],
2026-08-28T09:54:46.3303768Z       "stages": {
2026-08-28T09:54:46.3303923Z         "doc": {
2026-08-28T09:54:46.3304423Z           "complete": false,
2026-08-28T09:54:46.3304586Z           "evidence": []
2026-08-28T09:54:46.3304738Z         },
2026-08-28T09:54:46.3304887Z         "impl": {
2026-08-28T09:54:46.3305053Z           "complete": true,
2026-08-28T09:54:46.3305206Z           "evidence": [
2026-08-28T09:54:46.3305354Z             {
2026-08-28T09:54:46.3305540Z               "path": ".github/ci/reap-census.sh",
2026-08-28T09:54:46.3305706Z               "line": 42
2026-08-28T09:54:46.3305860Z             },
2026-08-28T09:54:46.3306006Z             {
2026-08-28T09:54:46.3306203Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3306359Z               "line": 637
2026-08-28T09:54:46.3306513Z             },
2026-08-28T09:54:46.3306659Z             {
2026-08-28T09:54:46.3306859Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3307023Z               "line": 845
2026-08-28T09:54:46.3307172Z             },
2026-08-28T09:54:46.3307323Z             {
2026-08-28T09:54:46.3307525Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3307691Z               "line": 979
2026-08-28T09:54:46.3307835Z             },
2026-08-28T09:54:46.3307981Z             {
2026-08-28T09:54:46.3308173Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3308335Z               "line": 1086
2026-08-28T09:54:46.3308488Z             }
2026-08-28T09:54:46.3308640Z           ]
2026-08-28T09:54:46.3308789Z         },
2026-08-28T09:54:46.3309037Z         "int": {
2026-08-28T09:54:46.3309212Z           "complete": false,
2026-08-28T09:54:46.3309371Z           "evidence": []
2026-08-28T09:54:46.3309521Z         },
2026-08-28T09:54:46.3309669Z         "unit": {
2026-08-28T09:54:46.3309840Z           "complete": false,
2026-08-28T09:54:46.3309998Z           "evidence": []
2026-08-28T09:54:46.3310146Z         }
2026-08-28T09:54:46.3310299Z       }
2026-08-28T09:54:46.3310442Z     },
2026-08-28T09:54:46.3310589Z     {
2026-08-28T09:54:46.3310785Z       "id": "REQ-CI-PRERELINK-EXE-LOCK-REAP",
2026-08-28T09:54:46.3323502Z       "title": "NO CI step that RELINKS a workspace binary runs while an earlier phase's leaked binary is still executing from the same target. (BAROMETER golden triage, hertz RCA 2026-08-02, releases#123.) THE DEFECT THIS CLOSES IS PLACEMENT, NOT MECHANISM: REQ-CI-POSTJOB-DAEMON-REAP's reap already kills exactly the right processes with exactly the right scoping, but it is the LAST step in the job, so it runs after every step it would have saved. Windows cannot overwrite a running image, so a leaked `spt.exe` from Phase A/B makes the next `cargo test -p spt --test <x>` die with 'failed to remove file ...\\target\\debug\\spt.exe: Access is denied. (os error 5)'. EVIDENCE, twice out of twice on the same head: golden 30754060525 and 30758010357, both Windows `test` jobs — job-start census scoped=0 (so the leak is generated IN-job, not inherited), pre-reap census scoped=4 with the same handle-count signature both runs (two ~258-260 daemons + two ~134 brains), job-end reap killing 4 and 3 respectively AFTER the job had already died of them. The second run also shows the masking: run 1's Phase-A red hid this, and every run that survives Phase A dies at the notify relink instead. THE FIX IS CLASS-SHAPED: the guard rides EVERY relink-after-an-E2E edge (notify, installer, docs-drift, and the two-host gated-CLI step in twohost-a), not only the edge that reddened a run. ONE PREDICATE OVER ONE POPULATION: it is the same reap-census script under a `prerelink` phase, so a mid-job reap can never classify a process differently from the job-end reap; the pre-existing inline `Get-Process | Stop-Process` before the docs gate is REPLACED by it rather than left as a second, weaker rule (it scoped by GITHUB_WORKSPACE alone, missing CARGO_TARGET_DIR/RUNNER_TEMP/n1-cache roots, re-verified nothing at kill time, and printed no evidence). Census labels carry the phase (`prerelink-pre-reap`, `prerelink`) so a mid-job census is never counted as an end-of-job one by the strict-mode trigger. STRICT STAYS AN END-OF-JOB MECHANISM: a prerelink survivor warns and never reds its own step, because the relink it guards is the very next step and fails with the exact file it could not remove — a louder and more specific signal than a reap step exiting 1. WINDOWS-ONLY BY CONSTRUCTION: Linux replaces a running exe happily; role B (Linux) of the two-host pair needs no guard. Gate: impl — the `prerelink` phase in .github/ci/reap-census.ps1 plus its four wirings in golden.yml. No unit stage, for REQ-CI-POSTJOB-DAEMON-REAP's stated reason: the evidence is a recipe the runner executes and the acceptance is read off the run log (a `CI-REAP-PRERELINK summary:` line before each relink, and no os-error-5). Kin REQ-CI-POSTJOB-DAEMON-REAP (same machinery, the other placement), REQ-CI-WINDOWS-PHASE-A-BOUND (the co-tenant load leg).",
2026-08-28T09:54:46.3323978Z       "requiredStages": [
2026-08-28T09:54:46.3324132Z         "impl"
2026-08-28T09:54:46.3324288Z       ],
2026-08-28T09:54:46.3324437Z       "stages": {
2026-08-28T09:54:46.3324594Z         "doc": {
2026-08-28T09:54:46.3324771Z           "complete": false,
2026-08-28T09:54:46.3324927Z           "evidence": []
2026-08-28T09:54:46.3325086Z         },
2026-08-28T09:54:46.3325232Z         "impl": {
2026-08-28T09:54:46.3325398Z           "complete": true,
2026-08-28T09:54:46.3325549Z           "evidence": [
2026-08-28T09:54:46.3325702Z             {
2026-08-28T09:54:46.3325896Z               "path": ".github/ci/reap-census.ps1",
2026-08-28T09:54:46.3326055Z               "line": 189
2026-08-28T09:54:46.3326206Z             },
2026-08-28T09:54:46.3326350Z             {
2026-08-28T09:54:46.3326545Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3326708Z               "line": 482
2026-08-28T09:54:46.3326855Z             },
2026-08-28T09:54:46.3327141Z             {
2026-08-28T09:54:46.3327513Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3327770Z               "line": 513
2026-08-28T09:54:46.3327974Z             },
2026-08-28T09:54:46.3328124Z             {
2026-08-28T09:54:46.3328511Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3328707Z               "line": 548
2026-08-28T09:54:46.3328859Z             },
2026-08-28T09:54:46.3329088Z             {
2026-08-28T09:54:46.3329294Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3329465Z               "line": 1071
2026-08-28T09:54:46.3329613Z             }
2026-08-28T09:54:46.3329775Z           ]
2026-08-28T09:54:46.3329909Z         },
2026-08-28T09:54:46.3330056Z         "int": {
2026-08-28T09:54:46.3330243Z           "complete": false,
2026-08-28T09:54:46.3330419Z           "evidence": []
2026-08-28T09:54:46.3330572Z         },
2026-08-28T09:54:46.3330717Z         "unit": {
2026-08-28T09:54:46.3330885Z           "complete": false,
2026-08-28T09:54:46.3331042Z           "evidence": []
2026-08-28T09:54:46.3331195Z         }
2026-08-28T09:54:46.3331342Z       }
2026-08-28T09:54:46.3331491Z     },
2026-08-28T09:54:46.3331647Z     {
2026-08-28T09:54:46.3331844Z       "id": "REQ-CI-TOOLCHAIN-VERSION-PRINT",
2026-08-28T09:54:46.3342371Z       "title": "Every golden run PRINTS the toolchain that judged it, on BOTH OS legs, from inside the job. (INFRA-REGISTER IR-4 part 3, carrying IR-9; hertz 2026-08-03.) WHY A PRINT IS EVIDENCE AND A BOX IS NOT: both golden boxes own rustup-managed toolchains that drift independently, so 'did CI resolve this the way I did?' — the question the acaaa4f lock comparison needed answered — had NO answer in any run log. MEASURED on the two boxes' INTERACTIVE accounts 2026-08-03: hfenduleam (Windows leg) cargo/rustc 1.93.0, clippy 0.1.93; kitsubito (Linux leg) cargo/rustc 1.96.0, clippy 0.1.96 — three minor versions apart, which is IR-9's class with numbers on it. That measurement is a PRIOR, not the fact: a runner service account's toolchain is what judges a lane and an interactive shell on the same box does not prove it, which is precisely why the step prints from inside the job. Direction of the skew is deliberately NOT asserted — clippy renames and removes lints as well as adding them, so 'newer is stricter' is unmeasured. IR-9's docs half (align the boxes, or declare one authoritative clippy leg) is HELD by doyle's ruling of the same day: rule it once this step reports runner-account versions, rather than on the prior. STEP SHAPE: one `TOOLCHAIN ` line prefix on every line of both legs so a run's toolchain is one grep; cargo, rustc, and clippy versions are the load-bearing three and their absence reds the step; the rustup active-toolchain line is a convenience and its absence must NOT red a step whose whole job is to print — which needs a different construction per shell, and both were exercised before shipping rather than reasoned about. Windows: under GitHub's pwsh wrapper (`$ErrorActionPreference = 'stop'` + a trailing `$LASTEXITCODE` check) a MISSING COMMAND is a terminating error, so rustup's absence is TESTED with Get-Command rather than caught, and a present rustup's non-zero exit is cleared before the wrapper reads it. Linux: no `| head` anywhere — under `set -o pipefail` a producer SIGPIPEd by an early-exiting head surfaces as exit 141 and reds the print, so first-line trimming is parameter expansion. Gate: impl = the two `Toolchain versions` steps in golden.yml's `test` job (the job that builds, tests, and lints, so the one whose resolver and lint set a reader is asking about). Kin REQ-LOCK-TOUCHING-LANE-PROCEDURE (the procedure that sends an author here), REQ-CI-LOAD-BEARING-PATCH-PIN.",
2026-08-28T09:54:46.3342719Z       "requiredStages": [
2026-08-28T09:54:46.3342870Z         "impl"
2026-08-28T09:54:46.3343029Z       ],
2026-08-28T09:54:46.3343180Z       "stages": {
2026-08-28T09:54:46.3343330Z         "doc": {
2026-08-28T09:54:46.3343489Z           "complete": false,
2026-08-28T09:54:46.3343656Z           "evidence": []
2026-08-28T09:54:46.3343802Z         },
2026-08-28T09:54:46.3343959Z         "impl": {
2026-08-28T09:54:46.3344130Z           "complete": true,
2026-08-28T09:54:46.3344299Z           "evidence": [
2026-08-28T09:54:46.3344445Z             {
2026-08-28T09:54:46.3344759Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3344918Z               "line": 238
2026-08-28T09:54:46.3345060Z             },
2026-08-28T09:54:46.3345233Z             {
2026-08-28T09:54:46.3345524Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.3345776Z               "line": 266
2026-08-28T09:54:46.3345994Z             }
2026-08-28T09:54:46.3346158Z           ]
2026-08-28T09:54:46.3346366Z         },
2026-08-28T09:54:46.3346523Z         "int": {
2026-08-28T09:54:46.3346697Z           "complete": false,
2026-08-28T09:54:46.3346855Z           "evidence": []
2026-08-28T09:54:46.3347002Z         },
2026-08-28T09:54:46.3347142Z         "unit": {
2026-08-28T09:54:46.3347307Z           "complete": false,
2026-08-28T09:54:46.3347466Z           "evidence": []
2026-08-28T09:54:46.3347608Z         }
2026-08-28T09:54:46.3347756Z       }
2026-08-28T09:54:46.3347918Z     },
2026-08-28T09:54:46.3348067Z     {
2026-08-28T09:54:46.3348256Z       "id": "REQ-CI-WINDOWS-PHASE-A-BOUND",
2026-08-28T09:54:46.3362412Z       "title": "Phase-A nextest parallelism is BOUNDED on the Windows self-hosted leg, so the full-parallel 1881-test battery stops saturating a box that also hosts the live agent fleet. (Load-flake family leg 2 = deployah option (c), doyle-ratified 2026-07-22.) Windows leg ONLY: kitsubito does not host the fleet, and its parallelism is deliberately untouched. MECHANISM AND WHY THIS ONE: the bound lives in a [profile.ci-windows] nextest profile selected by a STEP-LEVEL NEXTEST_PROFILE expression on the Phase-A step, NOT by a per-OS pair of Phase-A steps — duplicating that step would put a FOURTH copy of the <HEAVY> filter string in the tree, and .config/nextest.toml's own header names keeping THREE in sync as the standing hazard. THE NON-INHERITANCE GATE-CHECK (doyle demanded it discharged, and it did not come back clean): a custom nextest profile inherits scalar settings from default but NOT profile.default.overrides — the argument cuts both ways. Of the five overrides on default, exactly ONE is kind(test): the by-binary <HEAVY> integration filter, which is Phase B's alone and needs no mirror. The other FOUR are the FLAKE-LEDGER: attach_viewport_reconnects_across_a_broker_bounce class — real-broker units that are kind(bin)/kind(lib), escape the by-binary filter, and therefore RUN IN PHASE A depending on the heavy-broker-pty group to stay serialized (rc::tests four names, (applyhost|livehost|pump)::tests, wansend::tests, api::startup::tests). Shipping the profile without them would have SILENTLY UN-SERIALIZED ON WINDOWS the exact class whose un-serialization produced two separate 240s timeouts. They are mirrored verbatim, and the parity is ENFORCED rather than remembered: xtask check's check_phase_a_profile_parity fails the build when a default override that is not kind(test) is missing from ci-windows, keyed on that SHAPE and not on a name list — the same posture as that ledger entry's second half, whose whole lesson is that a class written in prose and shipped as an enumeration decays. A DRIFTED mirror reads as missing, not as present: the invariant is that it is the SAME filter in both profiles, not that something is in both. THE BOUND ITSELF IS CHOSEN, NOT DERIVED, and is recorded that way at the value: hfenduleam is 16 logical cores and the bound is 8 (half), for fleet-co-tenant headroom. No measurement separates 8 from 6 or 12 and none was run — the ratified fix is stop saturating the box, not find the saturation knee. Retuning is one integer. Gate: impl — the ci-windows profile with its mirrored overrides plus the ci.yml step-level profile selection plus the xtask parity check; unit — the parity predicate's exemption rule (a kind(test) override needs no mirror), its detection of an unmirrored Phase-A override, its rejection of a DRIFTED mirror, and a case over the REAL checked-in config so the check cannot ship green against a tree that already violates it. Kin REQ-CI-POSTJOB-DAEMON-REAP (the other cause-side leg), REQ-HEAVY-UNIT-CLASSIFICATION (the check one layer in), FLAKE-LEDGER: attach_viewport_reconnects_across_a_broker_bounce + the HEAVY-AT-BIRTH ruling (.config/nextest.toml).",
2026-08-28T09:54:46.3362966Z       "requiredStages": [
2026-08-28T09:54:46.3363119Z         "impl",
2026-08-28T09:54:46.3363267Z         "unit"
2026-08-28T09:54:46.3363414Z       ],
2026-08-28T09:54:46.3363571Z       "stages": {
2026-08-28T09:54:46.3363724Z         "doc": {
2026-08-28T09:54:46.3363891Z           "complete": false,
2026-08-28T09:54:46.3364053Z           "evidence": []
2026-08-28T09:54:46.3364201Z         },
2026-08-28T09:54:46.3364353Z         "impl": {
2026-08-28T09:54:46.3364520Z           "complete": true,
2026-08-28T09:54:46.3364681Z           "evidence": [
2026-08-28T09:54:46.3364833Z             {
2026-08-28T09:54:46.3365022Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3365176Z               "line": 543
2026-08-28T09:54:46.3365336Z             },
2026-08-28T09:54:46.3365495Z             {
2026-08-28T09:54:46.3365676Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3365833Z               "line": 569
2026-08-28T09:54:46.3365986Z             },
2026-08-28T09:54:46.3366138Z             {
2026-08-28T09:54:46.3366315Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3366472Z               "line": 582
2026-08-28T09:54:46.3366620Z             }
2026-08-28T09:54:46.3366781Z           ]
2026-08-28T09:54:46.3366930Z         },
2026-08-28T09:54:46.3367082Z         "int": {
2026-08-28T09:54:46.3367250Z           "complete": false,
2026-08-28T09:54:46.3367411Z           "evidence": []
2026-08-28T09:54:46.3367567Z         },
2026-08-28T09:54:46.3367723Z         "unit": {
2026-08-28T09:54:46.3367884Z           "complete": true,
2026-08-28T09:54:46.3368038Z           "evidence": [
2026-08-28T09:54:46.3368189Z             {
2026-08-28T09:54:46.3368377Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3368625Z               "line": 2411
2026-08-28T09:54:46.3368771Z             },
2026-08-28T09:54:46.3368920Z             {
2026-08-28T09:54:46.3369245Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3369401Z               "line": 2421
2026-08-28T09:54:46.3369554Z             },
2026-08-28T09:54:46.3369706Z             {
2026-08-28T09:54:46.3369893Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3370048Z               "line": 2448
2026-08-28T09:54:46.3370191Z             },
2026-08-28T09:54:46.3370341Z             {
2026-08-28T09:54:46.3370528Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.3370689Z               "line": 2463
2026-08-28T09:54:46.3370834Z             }
2026-08-28T09:54:46.3370989Z           ]
2026-08-28T09:54:46.3371144Z         }
2026-08-28T09:54:46.3371290Z       }
2026-08-28T09:54:46.3371439Z     },
2026-08-28T09:54:46.3371586Z     {
2026-08-28T09:54:46.3371783Z       "id": "REQ-CLI-1",
2026-08-28T09:54:46.3375435Z       "title": "spt endpoint noun namespace: absorbs fork/suspend/wake/shutdown/rename/stop/digest + access (ported 1:1: allow|revoke|open|list, decision 21) + description (ex-resources blurb; bare=show, set=author); merged endpoint list [--local|--subnet <name>] grouped by subnet with SELF pinned, --detail adding the ex-resources yellow-pages blurb projection; bare spt endpoint = the list (M8 decisions 1-2, 25). SUPERSEDED (F-025 item 3): the LISTING SHAPE now lives in REQ-ENDPOINT-LIST-NODE-GROUPED (node-grouped over unique instances, not grouped-by-subnet) + REQ-ENDPOINT-LIST-REST-FILTER (suspended-hidden + --show-all); the `--local` flag was dropped by REQ-ENDPOINT-LIST-MERGE-LOCAL (the list ALWAYS merges local). This REQ owns only the endpoint noun NAMESPACE + parse surface — not the render shape.",
2026-08-28T09:54:46.3375616Z       "requiredStages": [
2026-08-28T09:54:46.3375764Z         "impl",
2026-08-28T09:54:46.3375916Z         "unit"
2026-08-28T09:54:46.3376069Z       ],
2026-08-28T09:54:46.3376226Z       "stages": {
2026-08-28T09:54:46.3376374Z         "doc": {
2026-08-28T09:54:46.3376660Z           "complete": false,
2026-08-28T09:54:46.3376822Z           "evidence": []
2026-08-28T09:54:46.3376975Z         },
2026-08-28T09:54:46.3377122Z         "impl": {
2026-08-28T09:54:46.3377285Z           "complete": true,
2026-08-28T09:54:46.3377441Z           "evidence": [
2026-08-28T09:54:46.3377591Z             {
2026-08-28T09:54:46.3377771Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3377938Z               "line": 434
2026-08-28T09:54:46.3378094Z             },
2026-08-28T09:54:46.3378237Z             {
2026-08-28T09:54:46.3378425Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3378578Z               "line": 2329
2026-08-28T09:54:46.3378730Z             },
2026-08-28T09:54:46.3378880Z             {
2026-08-28T09:54:46.3379146Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3379303Z               "line": 6146
2026-08-28T09:54:46.3379452Z             }
2026-08-28T09:54:46.3379609Z           ]
2026-08-28T09:54:46.3379762Z         },
2026-08-28T09:54:46.3379922Z         "int": {
2026-08-28T09:54:46.3380077Z           "complete": false,
2026-08-28T09:54:46.3380237Z           "evidence": []
2026-08-28T09:54:46.3380382Z         },
2026-08-28T09:54:46.3380528Z         "unit": {
2026-08-28T09:54:46.3380679Z           "complete": true,
2026-08-28T09:54:46.3380836Z           "evidence": [
2026-08-28T09:54:46.3380982Z             {
2026-08-28T09:54:46.3381161Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3381321Z               "line": 28966
2026-08-28T09:54:46.3381469Z             }
2026-08-28T09:54:46.3381622Z           ]
2026-08-28T09:54:46.3381770Z         }
2026-08-28T09:54:46.3381922Z       }
2026-08-28T09:54:46.3382066Z     },
2026-08-28T09:54:46.3382217Z     {
2026-08-28T09:54:46.3382372Z       "id": "REQ-CLI-2",
2026-08-28T09:54:46.3383599Z       "title": "spt daemon noun: run|stop|status (hidden daemon verb becomes daemon run; agent-endpoint shutdown keeps its name under endpoint); daemon status renders the pump heartbeat (last-tick recency) so a half-dead daemon is never rendered implied-healthy (M8 decisions 5, 23)",
2026-08-28T09:54:46.3383919Z       "requiredStages": [
2026-08-28T09:54:46.3384072Z         "impl",
2026-08-28T09:54:46.3384225Z         "unit"
2026-08-28T09:54:46.3384373Z       ],
2026-08-28T09:54:46.3384530Z       "stages": {
2026-08-28T09:54:46.3384677Z         "doc": {
2026-08-28T09:54:46.3384844Z           "complete": false,
2026-08-28T09:54:46.3385006Z           "evidence": []
2026-08-28T09:54:46.3385159Z         },
2026-08-28T09:54:46.3385311Z         "impl": {
2026-08-28T09:54:46.3385469Z           "complete": true,
2026-08-28T09:54:46.3385640Z           "evidence": [
2026-08-28T09:54:46.3385782Z             {
2026-08-28T09:54:46.3385990Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.3386152Z               "line": 557
2026-08-28T09:54:46.3386296Z             },
2026-08-28T09:54:46.3386596Z             {
2026-08-28T09:54:46.3386948Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:46.3387220Z               "line": 108
2026-08-28T09:54:46.3387445Z             },
2026-08-28T09:54:46.3387644Z             {
2026-08-28T09:54:46.3387859Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:46.3390841Z               "line": 331
2026-08-28T09:54:46.3391023Z             },
2026-08-28T09:54:46.3391168Z             {
2026-08-28T09:54:46.3391359Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3391528Z               "line": 991
2026-08-28T09:54:46.3391682Z             },
2026-08-28T09:54:46.3391824Z             {
2026-08-28T09:54:46.3392015Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3392172Z               "line": 2473
2026-08-28T09:54:46.3392326Z             },
2026-08-28T09:54:46.3392472Z             {
2026-08-28T09:54:46.3392650Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3392821Z               "line": 7819
2026-08-28T09:54:46.3392969Z             },
2026-08-28T09:54:46.3393270Z             {
2026-08-28T09:54:46.3393455Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3393613Z               "line": 8001
2026-08-28T09:54:46.3393760Z             },
2026-08-28T09:54:46.3393905Z             {
2026-08-28T09:54:46.3394083Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3394236Z               "line": 8127
2026-08-28T09:54:46.3394383Z             }
2026-08-28T09:54:46.3394523Z           ]
2026-08-28T09:54:46.3394669Z         },
2026-08-28T09:54:46.3394819Z         "int": {
2026-08-28T09:54:46.3394984Z           "complete": false,
2026-08-28T09:54:46.3395143Z           "evidence": []
2026-08-28T09:54:46.3395290Z         },
2026-08-28T09:54:46.3395448Z         "unit": {
2026-08-28T09:54:46.3395647Z           "complete": true,
2026-08-28T09:54:46.3396010Z           "evidence": [
2026-08-28T09:54:46.3396228Z             {
2026-08-28T09:54:46.3396574Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:46.3396828Z               "line": 466
2026-08-28T09:54:46.3396988Z             },
2026-08-28T09:54:46.3397132Z             {
2026-08-28T09:54:46.3397322Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3397480Z               "line": 30683
2026-08-28T09:54:46.3397622Z             }
2026-08-28T09:54:46.3397776Z           ]
2026-08-28T09:54:46.3397923Z         }
2026-08-28T09:54:46.3398076Z       }
2026-08-28T09:54:46.3398219Z     },
2026-08-28T09:54:46.3398368Z     {
2026-08-28T09:54:46.3398529Z       "id": "REQ-CLI-3",
2026-08-28T09:54:46.3399794Z       "title": "Agent hot path stays flat across the M8 reorg: send/ring/ready/whoami/how-to unchanged; notify moves to subnet notify while notif stays top-level; breaking renames land clean with no deprecation shims (zero external CLI consumers pre-spt-claude-code) (M8 decisions 3-4, 9)",
2026-08-28T09:54:46.3399961Z       "requiredStages": [
2026-08-28T09:54:46.3400132Z         "impl",
2026-08-28T09:54:46.3400509Z         "unit"
2026-08-28T09:54:46.3400662Z       ],
2026-08-28T09:54:46.3400819Z       "stages": {
2026-08-28T09:54:46.3400963Z         "doc": {
2026-08-28T09:54:46.3401133Z           "complete": false,
2026-08-28T09:54:46.3401301Z           "evidence": []
2026-08-28T09:54:46.3401443Z         },
2026-08-28T09:54:46.3401597Z         "impl": {
2026-08-28T09:54:46.3401757Z           "complete": true,
2026-08-28T09:54:46.3401914Z           "evidence": [
2026-08-28T09:54:46.3402055Z             {
2026-08-28T09:54:46.3402242Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3402398Z               "line": 2323
2026-08-28T09:54:46.3402547Z             }
2026-08-28T09:54:46.3402694Z           ]
2026-08-28T09:54:46.3402838Z         },
2026-08-28T09:54:46.3402990Z         "int": {
2026-08-28T09:54:46.3403153Z           "complete": false,
2026-08-28T09:54:46.3403314Z           "evidence": []
2026-08-28T09:54:46.3403458Z         },
2026-08-28T09:54:46.3403615Z         "unit": {
2026-08-28T09:54:46.3403778Z           "complete": true,
2026-08-28T09:54:46.3403944Z           "evidence": [
2026-08-28T09:54:46.3404097Z             {
2026-08-28T09:54:46.3404283Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3404436Z               "line": 28931
2026-08-28T09:54:46.3404581Z             }
2026-08-28T09:54:46.3404730Z           ]
2026-08-28T09:54:46.3404873Z         }
2026-08-28T09:54:46.3405025Z       }
2026-08-28T09:54:46.3405174Z     },
2026-08-28T09:54:46.3405316Z     {
2026-08-28T09:54:46.3405473Z       "id": "REQ-CLI-4",
2026-08-28T09:54:46.3409204Z       "title": "User-facing CLI output is human-readable: DIRECT-USER commands (e.g. adapter update/list/use) render friendly prose instead of raw CODE:RESULT markers — \"claude-spt is up to date (0.2.0).\" not \"ADAPTER_UPDATE_UPTODATE:claude-spt: installed 0.2.0, latest 0.2.0\". Strictly bounded to the direct-user surface: the adapter-PARSED bringup tokens (SEEDED/BOUND/READY/NO_SEED on seed/listen, which adapters grep) stay machine-parseable — humanization is additive (a human line beside the marker, or a --porcelain/--quiet split), never a silent rename of a dual-contract marker. The user-facing bringup composition belongs to the adapter (perri); this REQ owns only the direct-user CLI surface. (v0.9.0)",
2026-08-28T09:54:46.3409567Z       "requiredStages": [],
2026-08-28T09:54:46.3409727Z       "stages": {
2026-08-28T09:54:46.3409870Z         "doc": {
2026-08-28T09:54:46.3410039Z           "complete": false,
2026-08-28T09:54:46.3410197Z           "evidence": []
2026-08-28T09:54:46.3410344Z         },
2026-08-28T09:54:46.3410493Z         "impl": {
2026-08-28T09:54:46.3410654Z           "complete": true,
2026-08-28T09:54:46.3410808Z           "evidence": [
2026-08-28T09:54:46.3410964Z             {
2026-08-28T09:54:46.3411151Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3411307Z               "line": 20687
2026-08-28T09:54:46.3411462Z             }
2026-08-28T09:54:46.3411608Z           ]
2026-08-28T09:54:46.3411771Z         },
2026-08-28T09:54:46.3411913Z         "int": {
2026-08-28T09:54:46.3412086Z           "complete": false,
2026-08-28T09:54:46.3412242Z           "evidence": []
2026-08-28T09:54:46.3412393Z         },
2026-08-28T09:54:46.3412549Z         "unit": {
2026-08-28T09:54:46.3412711Z           "complete": false,
2026-08-28T09:54:46.3412869Z           "evidence": []
2026-08-28T09:54:46.3413011Z         }
2026-08-28T09:54:46.3413160Z       }
2026-08-28T09:54:46.3413307Z     },
2026-08-28T09:54:46.3413460Z     {
2026-08-28T09:54:46.3413655Z       "id": "REQ-CLI-BROKEN-PIPE-TOLERANT",
2026-08-28T09:54:46.3415871Z       "title": "#10 (F026 micro): `spt <anything> | <pager/Select-First-N>` must not PANIC when stdout closes early. A closed downstream reader mid-print panics with 'failed printing to stdout: The pipe is being closed. (os error 232)' (live repro: `spt daemon status | Select -First N`). Fix: tolerate BrokenPipe process-wide — a write to a closed stdout exits 0 (SIGPIPE-equivalent: a consumer that stops reading is a normal end, not a crash), without leaking a Rust panic + backtrace to the user.",
2026-08-28T09:54:46.3416157Z       "requiredStages": [
2026-08-28T09:54:46.3416315Z         "impl",
2026-08-28T09:54:46.3416467Z         "unit"
2026-08-28T09:54:46.3416611Z       ],
2026-08-28T09:54:46.3416768Z       "stages": {
2026-08-28T09:54:46.3416912Z         "doc": {
2026-08-28T09:54:46.3417078Z           "complete": false,
2026-08-28T09:54:46.3417231Z           "evidence": []
2026-08-28T09:54:46.3417372Z         },
2026-08-28T09:54:46.3417530Z         "impl": {
2026-08-28T09:54:46.3417689Z           "complete": true,
2026-08-28T09:54:46.3417842Z           "evidence": [
2026-08-28T09:54:46.3417990Z             {
2026-08-28T09:54:46.3418171Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3418324Z               "line": 37
2026-08-28T09:54:46.3418481Z             },
2026-08-28T09:54:46.3418625Z             {
2026-08-28T09:54:46.3418806Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3419063Z               "line": 51
2026-08-28T09:54:46.3419220Z             },
2026-08-28T09:54:46.3419368Z             {
2026-08-28T09:54:46.3419549Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3419702Z               "line": 153
2026-08-28T09:54:46.3419855Z             }
2026-08-28T09:54:46.3419992Z           ]
2026-08-28T09:54:46.3420142Z         },
2026-08-28T09:54:46.3420287Z         "int": {
2026-08-28T09:54:46.3420454Z           "complete": false,
2026-08-28T09:54:46.3420613Z           "evidence": []
2026-08-28T09:54:46.3420757Z         },
2026-08-28T09:54:46.3420904Z         "unit": {
2026-08-28T09:54:46.3421068Z           "complete": true,
2026-08-28T09:54:46.3421219Z           "evidence": [
2026-08-28T09:54:46.3421373Z             {
2026-08-28T09:54:46.3421557Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3421716Z               "line": 209
2026-08-28T09:54:46.3421863Z             }
2026-08-28T09:54:46.3422022Z           ]
2026-08-28T09:54:46.3422168Z         }
2026-08-28T09:54:46.3422430Z       }
2026-08-28T09:54:46.3422578Z     },
2026-08-28T09:54:46.3422727Z     {
2026-08-28T09:54:46.3422906Z       "id": "REQ-CLI-HELP-MARKDOWN",
2026-08-28T09:54:46.3427548Z       "title": "`spt --help` (and every subcommand --help) renders the inline Markdown authored in the clap doc-comments as terminal styling, never as literal markers: `**bold**` → ANSI bold, `` `code` `` → ANSI cyan, `[text](url)` → `text`. The markers are STRIPPED either way — a raw `**` or backtick must NEVER reach the user (the operator-reported v0.12.0 defect: help text reads `**ctrl-b**` and stray backticks verbatim). Color/bold escapes are emitted ONLY when the help is going to a real terminal AND color is not suppressed (NO_COLOR unset · CLICOLOR != 0 · CLICOLOR_FORCE forces on); a pipe / redirect / CI / NO_COLOR falls back to strip-only (clean plaintext, zero escapes) so machine-readable help is byte-identical regardless of marker syntax. Pure transform over the clap-rendered help string at the single run()/bare_invocation chokepoint; preserves pre-existing ANSI (CSI sequences passed through untouched), never spans markers across a newline, leaves unmatched/empty markers literal, and does not alter the help layout. (v0.12.1)",
2026-08-28T09:54:46.3427753Z       "requiredStages": [
2026-08-28T09:54:46.3427905Z         "impl",
2026-08-28T09:54:46.3428056Z         "unit"
2026-08-28T09:54:46.3428203Z       ],
2026-08-28T09:54:46.3428354Z       "stages": {
2026-08-28T09:54:46.3428503Z         "doc": {
2026-08-28T09:54:46.3428664Z           "complete": false,
2026-08-28T09:54:46.3428827Z           "evidence": []
2026-08-28T09:54:46.3429070Z         },
2026-08-28T09:54:46.3429222Z         "impl": {
2026-08-28T09:54:46.3429380Z           "complete": true,
2026-08-28T09:54:46.3429542Z           "evidence": [
2026-08-28T09:54:46.3429690Z             {
2026-08-28T09:54:46.3429885Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3430034Z               "line": 8
2026-08-28T09:54:46.3430306Z             },
2026-08-28T09:54:46.3430466Z             {
2026-08-28T09:54:46.3430649Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3430809Z               "line": 131
2026-08-28T09:54:46.3430962Z             },
2026-08-28T09:54:46.3431108Z             {
2026-08-28T09:54:46.3431288Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3431446Z               "line": 162
2026-08-28T09:54:46.3431589Z             },
2026-08-28T09:54:46.3431742Z             {
2026-08-28T09:54:46.3431923Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3432080Z               "line": 309
2026-08-28T09:54:46.3432228Z             }
2026-08-28T09:54:46.3432375Z           ]
2026-08-28T09:54:46.3432533Z         },
2026-08-28T09:54:46.3432676Z         "int": {
2026-08-28T09:54:46.3432843Z           "complete": false,
2026-08-28T09:54:46.3432995Z           "evidence": []
2026-08-28T09:54:46.3433143Z         },
2026-08-28T09:54:46.3433306Z         "unit": {
2026-08-28T09:54:46.3433461Z           "complete": true,
2026-08-28T09:54:46.3433627Z           "evidence": [
2026-08-28T09:54:46.3433773Z             {
2026-08-28T09:54:46.3433956Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3434102Z               "line": 345
2026-08-28T09:54:46.3434251Z             },
2026-08-28T09:54:46.3434398Z             {
2026-08-28T09:54:46.3434590Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3434751Z               "line": 352
2026-08-28T09:54:46.3434899Z             },
2026-08-28T09:54:46.3435056Z             {
2026-08-28T09:54:46.3435238Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3435390Z               "line": 359
2026-08-28T09:54:46.3435538Z             },
2026-08-28T09:54:46.3435691Z             {
2026-08-28T09:54:46.3435867Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3436088Z               "line": 366
2026-08-28T09:54:46.3436372Z             },
2026-08-28T09:54:46.3436677Z             {
2026-08-28T09:54:46.3436991Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3437464Z               "line": 393
2026-08-28T09:54:46.3437689Z             },
2026-08-28T09:54:46.3437855Z             {
2026-08-28T09:54:46.3438112Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3438265Z               "line": 403
2026-08-28T09:54:46.3438413Z             },
2026-08-28T09:54:46.3438569Z             {
2026-08-28T09:54:46.3438758Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3438919Z               "line": 413
2026-08-28T09:54:46.3439195Z             },
2026-08-28T09:54:46.3439354Z             {
2026-08-28T09:54:46.3439539Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3439697Z               "line": 427
2026-08-28T09:54:46.3439844Z             },
2026-08-28T09:54:46.3439988Z             {
2026-08-28T09:54:46.3440178Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3440340Z               "line": 436
2026-08-28T09:54:46.3440483Z             },
2026-08-28T09:54:46.3440637Z             {
2026-08-28T09:54:46.3440822Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3440975Z               "line": 444
2026-08-28T09:54:46.3441122Z             }
2026-08-28T09:54:46.3441276Z           ]
2026-08-28T09:54:46.3441422Z         }
2026-08-28T09:54:46.3441579Z       }
2026-08-28T09:54:46.3441724Z     },
2026-08-28T09:54:46.3441867Z     {
2026-08-28T09:54:46.3442030Z       "id": "REQ-CLI-JSON",
2026-08-28T09:54:46.3445202Z       "title": "A global `--json` flag (clap global=true) honored by the READ/STATUS command set: endpoint list/whoami, daemon status, subnet status/show-code, endpoint description/role, adapter list/version, notif list, grant list, access list, shell list, how-to (endpoint digest already has it). Action commands do not honor it. A shared print_json() helper + a coverage TEST asserting every command in the set emits valid JSON (guards against the missing-shared-formatter drift). Output uses explicit per-command output DTOs with committed field names — internal structs are NOT serialized verbatim (their fields would become a public contract; JSON is a consumed wire-parity surface). (v0.16.0)",
2026-08-28T09:54:46.3445502Z       "requiredStages": [
2026-08-28T09:54:46.3445650Z         "impl",
2026-08-28T09:54:46.3445807Z         "unit",
2026-08-28T09:54:46.3445950Z         "int"
2026-08-28T09:54:46.3446099Z       ],
2026-08-28T09:54:46.3446251Z       "stages": {
2026-08-28T09:54:46.3446404Z         "doc": {
2026-08-28T09:54:46.3446566Z           "complete": false,
2026-08-28T09:54:46.3446728Z           "evidence": []
2026-08-28T09:54:46.3446874Z         },
2026-08-28T09:54:46.3447033Z         "impl": {
2026-08-28T09:54:46.3447199Z           "complete": true,
2026-08-28T09:54:46.3447352Z           "evidence": [
2026-08-28T09:54:46.3447504Z             {
2026-08-28T09:54:46.3447690Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3447861Z               "line": 85
2026-08-28T09:54:46.3448019Z             },
2026-08-28T09:54:46.3448171Z             {
2026-08-28T09:54:46.3448353Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3448510Z               "line": 729
2026-08-28T09:54:46.3448658Z             },
2026-08-28T09:54:46.3448801Z             {
2026-08-28T09:54:46.3449105Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3449276Z               "line": 2245
2026-08-28T09:54:46.3449422Z             },
2026-08-28T09:54:46.3449575Z             {
2026-08-28T09:54:46.3449755Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3449914Z               "line": 2541
2026-08-28T09:54:46.3450056Z             },
2026-08-28T09:54:46.3450210Z             {
2026-08-28T09:54:46.3450385Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3450539Z               "line": 5288
2026-08-28T09:54:46.3450690Z             },
2026-08-28T09:54:46.3450835Z             {
2026-08-28T09:54:46.3451024Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3451291Z               "line": 5339
2026-08-28T09:54:46.3451445Z             },
2026-08-28T09:54:46.3451592Z             {
2026-08-28T09:54:46.3451775Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3451930Z               "line": 5372
2026-08-28T09:54:46.3452087Z             },
2026-08-28T09:54:46.3452237Z             {
2026-08-28T09:54:46.3452414Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3452576Z               "line": 5458
2026-08-28T09:54:46.3452714Z             },
2026-08-28T09:54:46.3452862Z             {
2026-08-28T09:54:46.3453034Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3453191Z               "line": 5482
2026-08-28T09:54:46.3453333Z             },
2026-08-28T09:54:46.3453482Z             {
2026-08-28T09:54:46.3453688Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3453863Z               "line": 5494
2026-08-28T09:54:46.3454012Z             },
2026-08-28T09:54:46.3454167Z             {
2026-08-28T09:54:46.3454350Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3454505Z               "line": 5502
2026-08-28T09:54:46.3454653Z             },
2026-08-28T09:54:46.3454804Z             {
2026-08-28T09:54:46.3454980Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3455133Z               "line": 5621
2026-08-28T09:54:46.3455281Z             },
2026-08-28T09:54:46.3455429Z             {
2026-08-28T09:54:46.3455601Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3455781Z               "line": 5759
2026-08-28T09:54:46.3455930Z             },
2026-08-28T09:54:46.3456077Z             {
2026-08-28T09:54:46.3456269Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3456421Z               "line": 5996
2026-08-28T09:54:46.3456564Z             },
2026-08-28T09:54:46.3456705Z             {
2026-08-28T09:54:46.3456884Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3457141Z               "line": 6050
2026-08-28T09:54:46.3457289Z             },
2026-08-28T09:54:46.3457439Z             {
2026-08-28T09:54:46.3457627Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3457778Z               "line": 6152
2026-08-28T09:54:46.3457926Z             },
2026-08-28T09:54:46.3458078Z             {
2026-08-28T09:54:46.3458250Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3458412Z               "line": 6171
2026-08-28T09:54:46.3458556Z             },
2026-08-28T09:54:46.3458703Z             {
2026-08-28T09:54:46.3458880Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3459148Z               "line": 6192
2026-08-28T09:54:46.3459318Z             },
2026-08-28T09:54:46.3459463Z             {
2026-08-28T09:54:46.3459647Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3459799Z               "line": 6247
2026-08-28T09:54:46.3459959Z             },
2026-08-28T09:54:46.3460107Z             {
2026-08-28T09:54:46.3460292Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3460455Z               "line": 6255
2026-08-28T09:54:46.3460621Z             },
2026-08-28T09:54:46.3460765Z             {
2026-08-28T09:54:46.3460945Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3461103Z               "line": 6279
2026-08-28T09:54:46.3461246Z             },
2026-08-28T09:54:46.3461404Z             {
2026-08-28T09:54:46.3461580Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3461738Z               "line": 6362
2026-08-28T09:54:46.3461880Z             },
2026-08-28T09:54:46.3462025Z             {
2026-08-28T09:54:46.3462214Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3462368Z               "line": 8131
2026-08-28T09:54:46.3462518Z             },
2026-08-28T09:54:46.3462666Z             {
2026-08-28T09:54:46.3462849Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3462998Z               "line": 8228
2026-08-28T09:54:46.3463150Z             },
2026-08-28T09:54:46.3463303Z             {
2026-08-28T09:54:46.3463479Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3463751Z               "line": 8501
2026-08-28T09:54:46.3463889Z             },
2026-08-28T09:54:46.3464042Z             {
2026-08-28T09:54:46.3464258Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3464428Z               "line": 8988
2026-08-28T09:54:46.3464577Z             },
2026-08-28T09:54:46.3464728Z             {
2026-08-28T09:54:46.3464906Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3465080Z               "line": 9000
2026-08-28T09:54:46.3465237Z             },
2026-08-28T09:54:46.3465388Z             {
2026-08-28T09:54:46.3465569Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3465773Z               "line": 9035
2026-08-28T09:54:46.3465994Z             },
2026-08-28T09:54:46.3466170Z             {
2026-08-28T09:54:46.3466351Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3466504Z               "line": 9053
2026-08-28T09:54:46.3466666Z             },
2026-08-28T09:54:46.3466829Z             {
2026-08-28T09:54:46.3467004Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3467167Z               "line": 13210
2026-08-28T09:54:46.3467310Z             },
2026-08-28T09:54:46.3467458Z             {
2026-08-28T09:54:46.3467634Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3467792Z               "line": 13233
2026-08-28T09:54:46.3467942Z             },
2026-08-28T09:54:46.3468090Z             {
2026-08-28T09:54:46.3468271Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3468424Z               "line": 13951
2026-08-28T09:54:46.3468577Z             },
2026-08-28T09:54:46.3468725Z             {
2026-08-28T09:54:46.3468906Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3469144Z               "line": 13981
2026-08-28T09:54:46.3469301Z             },
2026-08-28T09:54:46.3469450Z             {
2026-08-28T09:54:46.3469635Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3469911Z               "line": 14003
2026-08-28T09:54:46.3470066Z             },
2026-08-28T09:54:46.3470216Z             {
2026-08-28T09:54:46.3470392Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3470552Z               "line": 14137
2026-08-28T09:54:46.3470700Z             },
2026-08-28T09:54:46.3470852Z             {
2026-08-28T09:54:46.3471029Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3471186Z               "line": 14274
2026-08-28T09:54:46.3471335Z             },
2026-08-28T09:54:46.3471481Z             {
2026-08-28T09:54:46.3471673Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3471825Z               "line": 14320
2026-08-28T09:54:46.3471979Z             },
2026-08-28T09:54:46.3472121Z             {
2026-08-28T09:54:46.3472289Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3472445Z               "line": 15437
2026-08-28T09:54:46.3472590Z             },
2026-08-28T09:54:46.3472736Z             {
2026-08-28T09:54:46.3472914Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3473102Z               "line": 15466
2026-08-28T09:54:46.3473255Z             },
2026-08-28T09:54:46.3473442Z             {
2026-08-28T09:54:46.3473616Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3473776Z               "line": 15482
2026-08-28T09:54:46.3473925Z             },
2026-08-28T09:54:46.3474072Z             {
2026-08-28T09:54:46.3474244Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3474397Z               "line": 15524
2026-08-28T09:54:46.3474540Z             },
2026-08-28T09:54:46.3474688Z             {
2026-08-28T09:54:46.3474864Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3475021Z               "line": 15546
2026-08-28T09:54:46.3475170Z             },
2026-08-28T09:54:46.3475312Z             {
2026-08-28T09:54:46.3475490Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3475649Z               "line": 20205
2026-08-28T09:54:46.3475798Z             },
2026-08-28T09:54:46.3476057Z             {
2026-08-28T09:54:46.3476239Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3476401Z               "line": 20217
2026-08-28T09:54:46.3476549Z             },
2026-08-28T09:54:46.3476706Z             {
2026-08-28T09:54:46.3476883Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3477041Z               "line": 20225
2026-08-28T09:54:46.3477192Z             },
2026-08-28T09:54:46.3477340Z             {
2026-08-28T09:54:46.3477517Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3477670Z               "line": 20520
2026-08-28T09:54:46.3477822Z             },
2026-08-28T09:54:46.3477975Z             {
2026-08-28T09:54:46.3478146Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3478305Z               "line": 21028
2026-08-28T09:54:46.3478451Z             },
2026-08-28T09:54:46.3478602Z             {
2026-08-28T09:54:46.3478789Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3479038Z               "line": 21141
2026-08-28T09:54:46.3479184Z             },
2026-08-28T09:54:46.3479338Z             {
2026-08-28T09:54:46.3479518Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3479676Z               "line": 21922
2026-08-28T09:54:46.3479827Z             },
2026-08-28T09:54:46.3479972Z             {
2026-08-28T09:54:46.3480152Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3480311Z               "line": 22313
2026-08-28T09:54:46.3480467Z             },
2026-08-28T09:54:46.3480616Z             {
2026-08-28T09:54:46.3480795Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3480957Z               "line": 22324
2026-08-28T09:54:46.3481103Z             },
2026-08-28T09:54:46.3481251Z             {
2026-08-28T09:54:46.3481431Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3481585Z               "line": 22664
2026-08-28T09:54:46.3481732Z             },
2026-08-28T09:54:46.3481990Z             {
2026-08-28T09:54:46.3482172Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3482338Z               "line": 23447
2026-08-28T09:54:46.3482486Z             },
2026-08-28T09:54:46.3482634Z             {
2026-08-28T09:54:46.3482811Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3482967Z               "line": 23457
2026-08-28T09:54:46.3483116Z             },
2026-08-28T09:54:46.3483257Z             {
2026-08-28T09:54:46.3483440Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3483596Z               "line": 23530
2026-08-28T09:54:46.3483743Z             }
2026-08-28T09:54:46.3483894Z           ]
2026-08-28T09:54:46.3484041Z         },
2026-08-28T09:54:46.3484195Z         "int": {
2026-08-28T09:54:46.3484351Z           "complete": true,
2026-08-28T09:54:46.3484509Z           "evidence": [
2026-08-28T09:54:46.3484661Z             {
2026-08-28T09:54:46.3484857Z               "path": "crates/spt/tests/json_emit.rs",
2026-08-28T09:54:46.3485029Z               "line": 54
2026-08-28T09:54:46.3485186Z             }
2026-08-28T09:54:46.3485334Z           ]
2026-08-28T09:54:46.3485486Z         },
2026-08-28T09:54:46.3485639Z         "unit": {
2026-08-28T09:54:46.3485791Z           "complete": true,
2026-08-28T09:54:46.3485988Z           "evidence": [
2026-08-28T09:54:46.3486130Z             {
2026-08-28T09:54:46.3486358Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3486588Z               "line": 28885
2026-08-28T09:54:46.3486799Z             }
2026-08-28T09:54:46.3486951Z           ]
2026-08-28T09:54:46.3487095Z         }
2026-08-28T09:54:46.3487247Z       }
2026-08-28T09:54:46.3487400Z     },
2026-08-28T09:54:46.3487562Z     {
2026-08-28T09:54:46.3487743Z       "id": "REQ-CLI-MONIC-TRIGGER-SECTION",
2026-08-28T09:54:46.3498017Z       "title": "`spt endpoint monic --help` carries a composed `Trigger kinds:` section naming every kind a trigger can watch, WHAT it watches, and WHETHER ANYTHING EVALUATES IT TODAY — the third column being the load-bearing one, because `user-input` and `agent-output` are ratified but INERT, and a section that listed them beside the live kinds without saying so would present a trigger that can never fire as one that works. That is the same honesty `monic list` already owes a stored trigger, now owed at the moment of CHOOSING one. The section is composed AT RENDER TIME from a single row table whose row carries the `TriggerKind` ITSELF, so the kind's wire spelling and its evaluated-today answer are DERIVED — from the enum and from the existing `has_live_consumer` predicate — rather than restated beside them: a kind cannot appear in the help under a spelling the `--triggers` parser would reject, nor be described as evaluated when nothing evaluates it, and a kind added to the vocabulary reaches the help by the sole act of being in the table. PLAIN TEXT, no inline Markdown, for the reason the surface section carries the identical rule: the CLI renders help through `helpfmt`, and a composer in the store crate can be read by a consumer that never passes through that renderer, so a Markdown marker reaches one audience styled and the other as literal asterisks. The words match the published docs table (kind | watches | evaluated today) rather than paraphrasing it, so an operator who read the manual and an operator who read the help learned the same vocabulary. Gate: doc — the docs-site trigger-kind table these rows speak in the same words, and the generated public CLI reference; impl — the row table beside the enum it describes, the render-time composer taking the table AS A PARAMETER, and the after-help wiring at the sited verb; unit — a fixture table carrying an INVENTED row renders that row with no edit to any display site (table-drivenness proven rather than inferred from a snapshot whose rows all agree), EVERY enum variant is present in the table (a kind added to the vocabulary cannot be silently missing from the section), a live and an inert row render their differing third column, the rendered help at the sited verb carries the composer's own text byte-for-byte rather than a second literal, and that help leaks no internal code.",
2026-08-28T09:54:46.3498470Z       "requiredStages": [
2026-08-28T09:54:46.3498623Z         "doc",
2026-08-28T09:54:46.3498776Z         "impl",
2026-08-28T09:54:46.3498918Z         "unit"
2026-08-28T09:54:46.3499158Z       ],
2026-08-28T09:54:46.3499319Z       "stages": {
2026-08-28T09:54:46.3499492Z         "doc": {
2026-08-28T09:54:46.3499651Z           "complete": true,
2026-08-28T09:54:46.3499809Z           "evidence": [
2026-08-28T09:54:46.3499966Z             {
2026-08-28T09:54:46.3500181Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:46.3500337Z               "line": 453
2026-08-28T09:54:46.3500482Z             }
2026-08-28T09:54:46.3500633Z           ]
2026-08-28T09:54:46.3500777Z         },
2026-08-28T09:54:46.3500939Z         "impl": {
2026-08-28T09:54:46.3501097Z           "complete": true,
2026-08-28T09:54:46.3501268Z           "evidence": [
2026-08-28T09:54:46.3501412Z             {
2026-08-28T09:54:46.3501611Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3501769Z               "line": 133
2026-08-28T09:54:46.3501915Z             },
2026-08-28T09:54:46.3502068Z             {
2026-08-28T09:54:46.3502285Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3502444Z               "line": 150
2026-08-28T09:54:46.3502585Z             },
2026-08-28T09:54:46.3502739Z             {
2026-08-28T09:54:46.3502933Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3503086Z               "line": 169
2026-08-28T09:54:46.3503239Z             },
2026-08-28T09:54:46.3503387Z             {
2026-08-28T09:54:46.3503572Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3503725Z               "line": 182
2026-08-28T09:54:46.3503912Z             },
2026-08-28T09:54:46.3504077Z             {
2026-08-28T09:54:46.3504270Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3504431Z               "line": 219
2026-08-28T09:54:46.3504702Z             },
2026-08-28T09:54:46.3504854Z             {
2026-08-28T09:54:46.3505047Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3505205Z               "line": 233
2026-08-28T09:54:46.3505353Z             },
2026-08-28T09:54:46.3505505Z             {
2026-08-28T09:54:46.3505738Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3505902Z               "line": 888
2026-08-28T09:54:46.3506120Z             },
2026-08-28T09:54:46.3506358Z             {
2026-08-28T09:54:46.3506601Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3506803Z               "line": 915
2026-08-28T09:54:46.3506959Z             },
2026-08-28T09:54:46.3507104Z             {
2026-08-28T09:54:46.3507292Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3507459Z               "line": 2155
2026-08-28T09:54:46.3507604Z             },
2026-08-28T09:54:46.3507762Z             {
2026-08-28T09:54:46.3507943Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3508111Z               "line": 2176
2026-08-28T09:54:46.3508257Z             },
2026-08-28T09:54:46.3508406Z             {
2026-08-28T09:54:46.3508605Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3508792Z               "line": 2186
2026-08-28T09:54:46.3509050Z             }
2026-08-28T09:54:46.3509221Z           ]
2026-08-28T09:54:46.3509379Z         },
2026-08-28T09:54:46.3509536Z         "int": {
2026-08-28T09:54:46.3509704Z           "complete": false,
2026-08-28T09:54:46.3509860Z           "evidence": []
2026-08-28T09:54:46.3510014Z         },
2026-08-28T09:54:46.3510164Z         "unit": {
2026-08-28T09:54:46.3510331Z           "complete": true,
2026-08-28T09:54:46.3510564Z           "evidence": [
2026-08-28T09:54:46.3510775Z             {
2026-08-28T09:54:46.3511056Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3511285Z               "line": 2019
2026-08-28T09:54:46.3511666Z             },
2026-08-28T09:54:46.3511891Z             {
2026-08-28T09:54:46.3512176Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3512400Z               "line": 2044
2026-08-28T09:54:46.3512613Z             },
2026-08-28T09:54:46.3512830Z             {
2026-08-28T09:54:46.3513131Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3513375Z               "line": 2090
2026-08-28T09:54:46.3513595Z             },
2026-08-28T09:54:46.3513813Z             {
2026-08-28T09:54:46.3514099Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:46.3514338Z               "line": 2124
2026-08-28T09:54:46.3514576Z             },
2026-08-28T09:54:46.3514811Z             {
2026-08-28T09:54:46.3515106Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3515347Z               "line": 35202
2026-08-28T09:54:46.3515575Z             },
2026-08-28T09:54:46.3515779Z             {
2026-08-28T09:54:46.3516128Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3516346Z               "line": 35244
2026-08-28T09:54:46.3516566Z             }
2026-08-28T09:54:46.3516800Z           ]
2026-08-28T09:54:46.3517120Z         }
2026-08-28T09:54:46.3517334Z       }
2026-08-28T09:54:46.3517543Z     },
2026-08-28T09:54:46.3517773Z     {
2026-08-28T09:54:46.3518165Z       "id": "REQ-CLI-NODE-VERB-PRIMARY",
2026-08-28T09:54:46.3536025Z       "title": "THE PER-MACHINE SUPERVISOR SURFACE IS SPELLED `spt node`, AND `spt daemon` REMAINS A FULL ALIAS OF IT — ONE PARSE TREE, NOT TWO. The noun operators type for their own machine was `daemon`, which names the PROCESS rather than the thing the process supervises; the surface is a node's state (daemon state, member subnets, local endpoints), so `node` is the primary spelling and `daemon` is a clap `visible_alias` on the same command. THE ALIAS IS FULL AND PER-SUBCOMMAND, NOT ROOT-ONLY: bare (the status view), run (incl. the hidden --detached auto-start-ladder flag), start, stop (incl. --force), status, access + its allow/deny/remove editing arms, refresh, and the hidden brain entry (bare and stamped) all parse identically under either spelling. A root-only equivalence proves the alias resolves and proves NOTHING about a subcommand added later under one spelling, which is why the unit asserts the parsed action as a VALUE per subcommand rather than matching variants. THE CHANGE IS CLI-SURFACE-ONLY: the spt-daemon crate, the wire, and the docs model term `spt-daemon` are untouched, and `daemon access` is mirrored as a NOUN, not duplicated as policy — one parse tree, one roster store. THE DEPRECATION NOTE IS SHARED AND ALIAS-NEUTRAL (doyle fork-D ruling): clap renders help per COMMAND, not per alias, so the note lives in the one `///` block and is worded to be TRUE under both spellings — deprecation when read on `daemon --help`, information when read on `node --help`. No argv sniffing, no stderr-only notice, no second variant. THE BRAIN SPAWN ARGV KEEPS THE `daemon` SPELLING (doyle fork-A ruling, KH-2.3): brain_child_args builds `daemon brain --generation N --start-reason R`, and the compatibility it exists for runs toward binaries that PREDATE the alias — an N-1 parser knows only the old spelling and an alias cannot rescue a parser that never had it, so migrating the spawn site is a later milestone gated on a fleet version floor, never this lane. REMOVAL OF THE ALIAS IS BLOCKED ON AN INSTALL-ARTIFACT MIGRATION (doyle fork-C ruling) AND THAT CONSTRAINT RIDES THE DOC SURFACE, not this file alone: installed OS service units and scheduled-task rungs on every deployed machine already carry `spt daemon run`, and renaming the verb does not rewrite them, so a future milestone must migrate those artifacts before scheduling removal. THE DEPRECATED SPELLING IS DOCUMENTED, NOT HIDDEN (doyle fork-E ruling): `visible_alias` rather than the hidden `--deferred`-style precedent, so the alias reaches the generated reference as a findable deprecated row — a deprecation an operator cannot find is not a deprecation. Gate: impl — the primary/alias rename with the shared note, the dispatch arm, the surface-help path table moved to the primary spelling, and the KH-2.3 spawn-argv sentence; unit — per-subcommand alias equivalence over the enumerated surface, the bare form defaulting to the status view under both spellings, and the note rendering in BOTH spellings' long help (the shape-(i) choice made visible, so moving the note to a runtime print reds here); doc — CONTEXT.md's disambiguation line separating this VERB from the retired `spt-node` separate-process deliverable, plus the reference regen carrying the deprecated row and the removal constraint. Kin REQ-CLI-2 (the noun this re-spells), REQ-HAZARD-HANDOFF-ARGV-COMPAT (the spawn argv it must not modernize), REQ-DOCS-5 (the generator whose drift gate must be green on the regen).",
2026-08-28T09:54:46.3536837Z       "requiredStages": [
2026-08-28T09:54:46.3537033Z         "doc",
2026-08-28T09:54:46.3537220Z         "impl",
2026-08-28T09:54:46.3537376Z         "unit"
2026-08-28T09:54:46.3537582Z       ],
2026-08-28T09:54:46.3537753Z       "stages": {
2026-08-28T09:54:46.3537906Z         "doc": {
2026-08-28T09:54:46.3538106Z           "complete": true,
2026-08-28T09:54:46.3538277Z           "evidence": [
2026-08-28T09:54:46.3538440Z             {
2026-08-28T09:54:46.3538616Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.3538769Z               "line": 32
2026-08-28T09:54:46.3538921Z             }
2026-08-28T09:54:46.3539192Z           ]
2026-08-28T09:54:46.3539341Z         },
2026-08-28T09:54:46.3539495Z         "impl": {
2026-08-28T09:54:46.3539661Z           "complete": true,
2026-08-28T09:54:46.3539820Z           "evidence": [
2026-08-28T09:54:46.3539971Z             {
2026-08-28T09:54:46.3540191Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.3540353Z               "line": 1208
2026-08-28T09:54:46.3540501Z             },
2026-08-28T09:54:46.3540653Z             {
2026-08-28T09:54:46.3540878Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.3541169Z               "line": 55
2026-08-28T09:54:46.3541326Z             },
2026-08-28T09:54:46.3541478Z             {
2026-08-28T09:54:46.3541666Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3541826Z               "line": 373
2026-08-28T09:54:46.3541973Z             },
2026-08-28T09:54:46.3542122Z             {
2026-08-28T09:54:46.3542302Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3542470Z               "line": 2029
2026-08-28T09:54:46.3542612Z             },
2026-08-28T09:54:46.3542760Z             {
2026-08-28T09:54:46.3542946Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3543098Z               "line": 2474
2026-08-28T09:54:46.3543246Z             }
2026-08-28T09:54:46.3543394Z           ]
2026-08-28T09:54:46.3543542Z         },
2026-08-28T09:54:46.3543695Z         "int": {
2026-08-28T09:54:46.3543862Z           "complete": false,
2026-08-28T09:54:46.3544015Z           "evidence": []
2026-08-28T09:54:46.3544170Z         },
2026-08-28T09:54:46.3544337Z         "unit": {
2026-08-28T09:54:46.3544496Z           "complete": true,
2026-08-28T09:54:46.3544655Z           "evidence": [
2026-08-28T09:54:46.3544802Z             {
2026-08-28T09:54:46.3544998Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3545154Z               "line": 30774
2026-08-28T09:54:46.3545313Z             },
2026-08-28T09:54:46.3545460Z             {
2026-08-28T09:54:46.3545642Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3545803Z               "line": 30819
2026-08-28T09:54:46.3549770Z             },
2026-08-28T09:54:46.3549978Z             {
2026-08-28T09:54:46.3550179Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3550346Z               "line": 36294
2026-08-28T09:54:46.3550494Z             },
2026-08-28T09:54:46.3550642Z             {
2026-08-28T09:54:46.3550832Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3550990Z               "line": 36329
2026-08-28T09:54:46.3551301Z             }
2026-08-28T09:54:46.3551452Z           ]
2026-08-28T09:54:46.3551601Z         }
2026-08-28T09:54:46.3551747Z       }
2026-08-28T09:54:46.3551896Z     },
2026-08-28T09:54:46.3552038Z     {
2026-08-28T09:54:46.3552216Z       "id": "REQ-CLI-OUTPUT-MARKDOWN",
2026-08-28T09:54:46.3558873Z       "title": "Human-prose COMMAND OUTPUT (not just `--help`) renders the inline Markdown authored in its source strings as terminal styling, never literal markers: `` `code` `` → ANSI cyan, `**bold**` → ANSI bold, `[text](url)` → `text`, markers STRIPPED either way. REQ-CLI-HELP-MARKDOWN only hooked the clap `--help` chokepoint, so command output still printed raw Markdown (audit: `spt how-to` topic text showed `# headers`/backticks, `spt subnet`/`subnet status` hint footers showed stray backticks, the daemon-status `not running` line, the `ENDPOINT_RUN_STARTED` attach hint, and the daemon's `SUBNET_DETACHED` startup line — 13 prose surfaces). The same line-bounded pure `helpfmt::render` is applied at each emit site, color-gated by the OUTPUT STREAM's own tty (`stdout_color` for print/println, the new `stderr_color` for eprintln). HARNESS-SAFETY (binding): color is tty-gated, so an adapter (piped / non-tty / NO_COLOR) gets STRIP mode = zero ANSI + markers removed; every dual-contract MACHINE token on a rendered line (`ENDPOINT_RUN_STARTED:`, `NO_SUCH_TOPIC:`, `SUBNET_DETACHED:`) carries NO Markdown markers, so it survives strip byte-intact — the adapter parse is never perturbed. Pure-machine output (the `<EVENT …>` envelope, bringup parse-tokens SEEDED/BOUND/READY/NO_SEED, `--json`, QR) is NEVER routed through the renderer. The one spt-daemon source string (`SUBNET_DETACHED`, the bin-local renderer is unreachable from the daemon crate) is authored marker-free instead. (v0.12.2)",
2026-08-28T09:54:46.3559178Z       "requiredStages": [
2026-08-28T09:54:46.3559337Z         "impl",
2026-08-28T09:54:46.3559483Z         "unit"
2026-08-28T09:54:46.3559642Z       ],
2026-08-28T09:54:46.3559793Z       "stages": {
2026-08-28T09:54:46.3559994Z         "doc": {
2026-08-28T09:54:46.3560772Z           "complete": false,
2026-08-28T09:54:46.3561040Z           "evidence": []
2026-08-28T09:54:46.3561268Z         },
2026-08-28T09:54:46.3561565Z         "impl": {
2026-08-28T09:54:46.3561745Z           "complete": true,
2026-08-28T09:54:46.3561960Z           "evidence": [
2026-08-28T09:54:46.3562122Z             {
2026-08-28T09:54:46.3562336Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.3562490Z               "line": 156
2026-08-28T09:54:46.3562636Z             },
2026-08-28T09:54:46.3562805Z             {
2026-08-28T09:54:46.3562989Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3563151Z               "line": 4732
2026-08-28T09:54:46.3563566Z             },
2026-08-28T09:54:46.3563885Z             {
2026-08-28T09:54:46.3564228Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3564662Z               "line": 8761
2026-08-28T09:54:46.3565030Z             },
2026-08-28T09:54:46.3565343Z             {
2026-08-28T09:54:46.3565689Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3566123Z               "line": 14210
2026-08-28T09:54:46.3566481Z             },
2026-08-28T09:54:46.3566810Z             {
2026-08-28T09:54:46.3567195Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3567626Z               "line": 14364
2026-08-28T09:54:46.3567974Z             },
2026-08-28T09:54:46.3568286Z             {
2026-08-28T09:54:46.3568624Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3569176Z               "line": 15461
2026-08-28T09:54:46.3569539Z             },
2026-08-28T09:54:46.3569854Z             {
2026-08-28T09:54:46.3570212Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3570663Z               "line": 44
2026-08-28T09:54:46.3571022Z             }
2026-08-28T09:54:46.3571337Z           ]
2026-08-28T09:54:46.3571637Z         },
2026-08-28T09:54:46.3572101Z         "int": {
2026-08-28T09:54:46.3572440Z           "complete": false,
2026-08-28T09:54:46.3572806Z           "evidence": []
2026-08-28T09:54:46.3573154Z         },
2026-08-28T09:54:46.3573455Z         "unit": {
2026-08-28T09:54:46.3573788Z           "complete": true,
2026-08-28T09:54:46.3574159Z           "evidence": [
2026-08-28T09:54:46.3574498Z             {
2026-08-28T09:54:46.3574841Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3575261Z               "line": 34132
2026-08-28T09:54:46.3575662Z             },
2026-08-28T09:54:46.3575970Z             {
2026-08-28T09:54:46.3576636Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3577408Z               "line": 377
2026-08-28T09:54:46.3577770Z             },
2026-08-28T09:54:46.3578089Z             {
2026-08-28T09:54:46.3578443Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3578894Z               "line": 454
2026-08-28T09:54:46.3579340Z             },
2026-08-28T09:54:46.3579654Z             {
2026-08-28T09:54:46.3580022Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3580462Z               "line": 477
2026-08-28T09:54:46.3580810Z             },
2026-08-28T09:54:46.3581110Z             {
2026-08-28T09:54:46.3581451Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3581892Z               "line": 491
2026-08-28T09:54:46.3582245Z             }
2026-08-28T09:54:46.3582545Z           ]
2026-08-28T09:54:46.3582850Z         }
2026-08-28T09:54:46.3583147Z       }
2026-08-28T09:54:46.3583457Z     },
2026-08-28T09:54:46.3583761Z     {
2026-08-28T09:54:46.3584090Z       "id": "REQ-CLI-STACK-HEADROOM",
2026-08-28T09:54:46.3593983Z       "title": "THE CLI MUST HAVE ROOM TO BUILD ITS OWN ARGUMENT TREE, WITH MEASURED HEADROOM. clap's derive-built `Command` tree is constructed recursively at the top of every invocation and its cost scales with the argument population; `main` ran `cli::run()` on the MAIN thread, whose stack on Windows is the PE-header default (1 MiB, not settable at runtime), while a Rust-spawned thread's is explicit. IR-33 measured the tree within roughly SIX net new arguments of exhausting it: U1's eight hidden bool args made EVERY invocation die with 'thread main has overflowed its stack', exit -1073741571 (0xC00000FD), INCLUDING `--version` — before any of our own code ran. The failure face is why this is a requirement and not a tuning note: it presents as a totally broken binary that names no stack, and through REQ-DOCS-5's generator (which enumerates the tree by PARSING the binary's own root help) it presents instead as a silently gutted docs page that the drift check then compares to itself and blesses. FIX: run the CLI on an explicitly-sized thread, so the argument population stops being a budget the next verb-surface lane has to fit under. THE WRAPPER MUST BE FAITHFUL, WHICH IS THE WHOLE RISK OF THE CHANGE: a panic inside the CLI must still leave the process with the SAME face it had when the panic unwound out of main — the same message through the same hook, and the same nonzero exit code (101) — and an ordinary return must exit with the INNER run's code, not the join's. A spawn failure falls back to running inline and SAYS SO, because a resource blip must not turn into a dead CLI, and a silent fallback would restore the old ceiling invisibly. Gate: impl — the sized-thread wrapper in main.rs with its fidelity mapping and its loud fallback; unit — the wrapper driven with a returning closure and a PANICKING one, asserting the code passes through and the panic maps to 101 (the prod call site passes `cli::run` to the same function, so this is the real wrapper and not a parallel spelling); int — a smoke that the DEBUG-built binary answers `--help` with non-empty stdout at exit 0, which is the only assertion that would have caught IR-33 in its own build profile and also backstops the empty-emit generator above.",
2026-08-28T09:54:46.3603252Z       "requiredStages": [
2026-08-28T09:54:46.3603614Z         "impl",
2026-08-28T09:54:46.3603929Z         "unit",
2026-08-28T09:54:46.3604387Z         "int"
2026-08-28T09:54:46.3604707Z       ],
2026-08-28T09:54:46.3605012Z       "stages": {
2026-08-28T09:54:46.3605348Z         "doc": {
2026-08-28T09:54:46.3605678Z           "complete": false,
2026-08-28T09:54:46.3606050Z           "evidence": []
2026-08-28T09:54:46.3606403Z         },
2026-08-28T09:54:46.3606713Z         "impl": {
2026-08-28T09:54:46.3607042Z           "complete": true,
2026-08-28T09:54:46.3607417Z           "evidence": [
2026-08-28T09:54:46.3607758Z             {
2026-08-28T09:54:46.3608106Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3608545Z               "line": 80
2026-08-28T09:54:46.3608889Z             },
2026-08-28T09:54:46.3609288Z             {
2026-08-28T09:54:46.3609646Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3610075Z               "line": 121
2026-08-28T09:54:46.3610422Z             },
2026-08-28T09:54:46.3610739Z             {
2026-08-28T09:54:46.3611073Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3611508Z               "line": 200
2026-08-28T09:54:46.3611865Z             }
2026-08-28T09:54:46.3612175Z           ]
2026-08-28T09:54:46.3612481Z         },
2026-08-28T09:54:46.3612790Z         "int": {
2026-08-28T09:54:46.3613122Z           "complete": true,
2026-08-28T09:54:46.3613488Z           "evidence": [
2026-08-28T09:54:46.3613831Z             {
2026-08-28T09:54:46.3614198Z               "path": "crates/spt/tests/cli_stack_smoke.rs",
2026-08-28T09:54:46.3614647Z               "line": 24
2026-08-28T09:54:46.3614995Z             },
2026-08-28T09:54:46.3615315Z             {
2026-08-28T09:54:46.3615691Z               "path": "crates/spt/tests/cli_stack_smoke.rs",
2026-08-28T09:54:46.3616151Z               "line": 34
2026-08-28T09:54:46.3616495Z             },
2026-08-28T09:54:46.3616809Z             {
2026-08-28T09:54:46.3617177Z               "path": "crates/spt/tests/cli_stack_smoke.rs",
2026-08-28T09:54:46.3617630Z               "line": 74
2026-08-28T09:54:46.3617978Z             },
2026-08-28T09:54:46.3618290Z             {
2026-08-28T09:54:46.3618790Z               "path": "crates/spt/tests/cli_stack_smoke.rs",
2026-08-28T09:54:46.3619338Z               "line": 107
2026-08-28T09:54:46.3619681Z             }
2026-08-28T09:54:46.3620001Z           ]
2026-08-28T09:54:46.3620311Z         },
2026-08-28T09:54:46.3620621Z         "unit": {
2026-08-28T09:54:46.3620949Z           "complete": true,
2026-08-28T09:54:46.3621318Z           "evidence": [
2026-08-28T09:54:46.3621657Z             {
2026-08-28T09:54:46.3622001Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.3622434Z               "line": 234
2026-08-28T09:54:46.3622787Z             }
2026-08-28T09:54:46.3623097Z           ]
2026-08-28T09:54:46.3623402Z         }
2026-08-28T09:54:46.3623701Z       }
2026-08-28T09:54:46.3623996Z     },
2026-08-28T09:54:46.3624291Z     {
2026-08-28T09:54:46.3624634Z       "id": "REQ-CLI-SURFACE-SECTION-SITED",
2026-08-28T09:54:46.3634693Z       "title": "The composed `Control surfaces:` section rides the --help of exactly the verbs whose invocation NAMES A SURFACE, and of no others, so the vocabulary meets the operator at the moment of choosing rather than in a manual: `knock` bare, `knock send`, `knock approve`, `knock new-code`, `knock list`; `endpoint access allow` / `deny` / `remove` and the FLAGLESS `endpoint access` listing (which is an EndpointCmd variant, not an AccessCmd one — a distinct site that a subcommand-only sweep silently misses); `daemon access` and its `allow` / `deny` / `remove`; and `subnet create`. DELIBERATELY EXCLUDED and recorded as decided, not overlooked: `knock redeem` and `knock deny` (the surfaces are already fixed by the code or the knock — printing the table there invites the reader to believe they have a choice), and `endpoint fork`, which keeps its existing INLINE FORK+DISCOVER prose because a two-surface verb is better served by a sentence than by a table. The section is appended through clap's after-help placeholder, which the tree uses nowhere today — a NEW PATTERN, so the root help template's existing but unused placeholder is what carries it, and the section text itself comes from the surface table's composer rather than from any per-verb literal. Public help stays free of internal codes at all depths, including the three-deep sites the docs-site drift gate cannot reach. Gate: doc — the public CLI reference; impl — the after-help wiring at each named site, fed by the single composer; unit — every named verb's rendered help carries the section and every excluded verb's does not, the flagless listing site is covered distinctly from its subcommands, the rendered text matches what the composer produced for the same table, and A WALK OVER EVERY NAMED SITE'S RENDERED HELP ASSERTS NO INTERNAL CODE (REQ-, ADR-, F-) APPEARS AT ANY DEPTH — the row that closes the three-deep gap the docs-site drift gate cannot reach, and which earns its green two ways rather than by default: the walk's site set is PINNED (it asserts it visited exactly the named sites, so an empty or truncated enumeration fails loudly rather than passing vacuously) and the same predicate is proven ABLE TO FAIL against a fixture help text carrying a code.",
2026-08-28T09:54:46.3644076Z       "requiredStages": [
2026-08-28T09:54:46.3644429Z         "doc",
2026-08-28T09:54:46.3644750Z         "impl",
2026-08-28T09:54:46.3645073Z         "unit"
2026-08-28T09:54:46.3645388Z       ],
2026-08-28T09:54:46.3645688Z       "stages": {
2026-08-28T09:54:46.3646008Z         "doc": {
2026-08-28T09:54:46.3646337Z           "complete": true,
2026-08-28T09:54:46.3646704Z           "evidence": [
2026-08-28T09:54:46.3647056Z             {
2026-08-28T09:54:46.3647436Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:46.3647952Z               "line": 3
2026-08-28T09:54:46.3648295Z             }
2026-08-28T09:54:46.3648601Z           ]
2026-08-28T09:54:46.3648906Z         },
2026-08-28T09:54:46.3649297Z         "impl": {
2026-08-28T09:54:46.3649634Z           "complete": true,
2026-08-28T09:54:46.3650013Z           "evidence": [
2026-08-28T09:54:46.3650567Z             {
2026-08-28T09:54:46.3651090Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3651667Z               "line": 2095
2026-08-28T09:54:46.3652025Z             },
2026-08-28T09:54:46.3652335Z             {
2026-08-28T09:54:46.3652667Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3653100Z               "line": 2126
2026-08-28T09:54:46.3653453Z             },
2026-08-28T09:54:46.3653758Z             {
2026-08-28T09:54:46.3654101Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3654520Z               "line": 2139
2026-08-28T09:54:46.3654868Z             },
2026-08-28T09:54:46.3655182Z             {
2026-08-28T09:54:46.3655518Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3655943Z               "line": 2234
2026-08-28T09:54:46.3656292Z             }
2026-08-28T09:54:46.3656611Z           ]
2026-08-28T09:54:46.3656912Z         },
2026-08-28T09:54:46.3657231Z         "int": {
2026-08-28T09:54:46.3657570Z           "complete": false,
2026-08-28T09:54:46.3657978Z           "evidence": []
2026-08-28T09:54:46.3658330Z         },
2026-08-28T09:54:46.3658636Z         "unit": {
2026-08-28T09:54:46.3659074Z           "complete": true,
2026-08-28T09:54:46.3659467Z           "evidence": [
2026-08-28T09:54:46.3659805Z             {
2026-08-28T09:54:46.3660148Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3660578Z               "line": 35170
2026-08-28T09:54:46.3660935Z             },
2026-08-28T09:54:46.3661255Z             {
2026-08-28T09:54:46.3661598Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3662028Z               "line": 35309
2026-08-28T09:54:46.3662386Z             },
2026-08-28T09:54:46.3662705Z             {
2026-08-28T09:54:46.3663199Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3663907Z               "line": 36350
2026-08-28T09:54:46.3664408Z             },
2026-08-28T09:54:46.3665137Z             {
2026-08-28T09:54:46.3665676Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3666364Z               "line": 36865
2026-08-28T09:54:46.3666721Z             },
2026-08-28T09:54:46.3667041Z             {
2026-08-28T09:54:46.3667380Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3667810Z               "line": 36917
2026-08-28T09:54:46.3668172Z             }
2026-08-28T09:54:46.3668483Z           ]
2026-08-28T09:54:46.3668791Z         }
2026-08-28T09:54:46.3669649Z       }
2026-08-28T09:54:46.3669958Z     },
2026-08-28T09:54:46.3670254Z     {
2026-08-28T09:54:46.3670583Z       "id": "REQ-CLI-WIN-VT-ENABLE",
2026-08-28T09:54:46.3675063Z       "title": "A7 (F028, operator, Win10 conhost): ANSI emitted without VT enable → garbled console. Evidence (raw PowerShell 7, Win10 conhost): literal `←[36m` in `endpoint list` + `--help`. ROOT: ENABLE_VIRTUAL_TERMINAL_PROCESSING is enabled ONLY on the rc attach path (rc.rs:746, REQ-RC-WIN-VT-OUTPUT) — plain CLI stdout never enables it, and the color decision doesn't fall back when the console can't render VT. FIX: lift the rc.rs VT-enable into a SHARED startup helper for every colored-output path; if SetConsoleMode fails (or stdout isn't a console), STRIP colors (the ansi_wrap/helpfmt color=false path already exists — plumb the decision, not new rendering). Windows Terminal masks this (VT always on) — TEST on raw conhost. See triage A7.",
2026-08-28T09:54:46.3679245Z       "requiredStages": [
2026-08-28T09:54:46.3679647Z         "impl",
2026-08-28T09:54:46.3680004Z         "unit"
2026-08-28T09:54:46.3680343Z       ],
2026-08-28T09:54:46.3680671Z       "stages": {
2026-08-28T09:54:46.3681019Z         "doc": {
2026-08-28T09:54:46.3681376Z           "complete": false,
2026-08-28T09:54:46.3681783Z           "evidence": []
2026-08-28T09:54:46.3682165Z         },
2026-08-28T09:54:46.3682495Z         "impl": {
2026-08-28T09:54:46.3682858Z           "complete": true,
2026-08-28T09:54:46.3683257Z           "evidence": [
2026-08-28T09:54:46.3683639Z             {
2026-08-28T09:54:46.3684030Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3684732Z               "line": 61
2026-08-28T09:54:46.3685109Z             }
2026-08-28T09:54:46.3685452Z           ]
2026-08-28T09:54:46.3685781Z         },
2026-08-28T09:54:46.3686110Z         "int": {
2026-08-28T09:54:46.3686467Z           "complete": false,
2026-08-28T09:54:46.3686872Z           "evidence": []
2026-08-28T09:54:46.3687246Z         },
2026-08-28T09:54:46.3687566Z         "unit": {
2026-08-28T09:54:46.3687895Z           "complete": true,
2026-08-28T09:54:46.3688258Z           "evidence": [
2026-08-28T09:54:46.3688587Z             {
2026-08-28T09:54:46.3689053Z               "path": "crates/spt/src/helpfmt.rs",
2026-08-28T09:54:46.3689508Z               "line": 329
2026-08-28T09:54:46.3689849Z             }
2026-08-28T09:54:46.3690154Z           ]
2026-08-28T09:54:46.3690449Z         }
2026-08-28T09:54:46.3690745Z       }
2026-08-28T09:54:46.3691040Z     },
2026-08-28T09:54:46.3691336Z     {
2026-08-28T09:54:46.3691684Z       "id": "REQ-CONN-BLACKHOLE-LIFECYCLE-HARNESS",
2026-08-28T09:54:46.3697147Z       "title": "MSG-IDENTITY W6 / F-039 leg e (doyle W6 LOCK 2026-07-10, minted per amendment 3 — hertz's five invariants VERBATIM from his RCA fix-shape item 5): 'Build a deterministic black-holed-controller harness against current v0.30.6 semantics and assert: unrelated sessions continue; the bad physical connection is canceled/closed within the bound; its writer exits; a fresh viewer can attach; no lock or task remains owned by the retired connection.' The harness is the standing conformance rig for the r4 SHAREDSEND fix-class — hertz's RCA discipline: only after a timestamped incident maps to a FAILING lifecycle invariant does an ownership/cancellation defect get fixed (the likely shape being complete physical-connection cancellation and writer-task join/retirement, never a broader timeout increase). Consumes REQ-CONN-POISON-ATTRIBUTION's records (conn id + lifecycle events are what make the five assertions checkable deterministically). Kin REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK (the invariant class under test — its brain_decouple int stays the Windows-mandatory gate leg), REQ-CONN-POISON-DIAL-SCOPE.",
2026-08-28T09:54:46.3702520Z       "requiredStages": [
2026-08-28T09:54:46.3702875Z         "int"
2026-08-28T09:54:46.3703180Z       ],
2026-08-28T09:54:46.3703476Z       "stages": {
2026-08-28T09:54:46.3703796Z         "doc": {
2026-08-28T09:54:46.3704129Z           "complete": false,
2026-08-28T09:54:46.3704501Z           "evidence": []
2026-08-28T09:54:46.3704821Z         },
2026-08-28T09:54:46.3705121Z         "impl": {
2026-08-28T09:54:46.3705449Z           "complete": false,
2026-08-28T09:54:46.3705804Z           "evidence": []
2026-08-28T09:54:46.3706138Z         },
2026-08-28T09:54:46.3706433Z         "int": {
2026-08-28T09:54:46.3706758Z           "complete": true,
2026-08-28T09:54:46.3707121Z           "evidence": [
2026-08-28T09:54:46.3707470Z             {
2026-08-28T09:54:46.3707907Z               "path": "crates/spt-daemon/tests/conn_blackhole_lifecycle.rs",
2026-08-28T09:54:46.3708429Z               "line": 245
2026-08-28T09:54:46.3708773Z             }
2026-08-28T09:54:46.3709173Z           ]
2026-08-28T09:54:46.3709473Z         },
2026-08-28T09:54:46.3709768Z         "unit": {
2026-08-28T09:54:46.3710093Z           "complete": false,
2026-08-28T09:54:46.3710454Z           "evidence": []
2026-08-28T09:54:46.3710793Z         }
2026-08-28T09:54:46.3711084Z       }
2026-08-28T09:54:46.3711380Z     },
2026-08-28T09:54:46.3711680Z     {
2026-08-28T09:54:46.3712023Z       "id": "REQ-CONN-POISON-ATTRIBUTION",
2026-08-28T09:54:46.3721010Z       "title": "MSG-IDENTITY W6 / F-039 legs b-d (doyle W6 LOCK 2026-07-10, minted per amendment 3): every broker-conn lifecycle record is ATTRIBUTABLE — the W6 RCA's terminal undecidability (per-line 1:1 CONN_WRITE_POISONED churn = fresh-carrier churn OR stderr interleave artifact) exists because records carry no stable conn identity, no role/endpoint/session context, and no timestamps, and the once-per-conn poison latch hides multiplicity. THREE LEGS. (b) IDENTITY: mint a stable per-physical-conn id (monotonic u64 at conn construction — Arc::ptr_eq is the only identity today and it does not survive a log line) plus subscriber role and endpoint/session where known, stamped on CONN_WRITE_POISONED, CONN_WRITE_RETIRED, logical stall-evict, attach/resume/detach, and write-retirement records (RCA attach sites: presence nethost.rs:379, stream nethost.rs:258, controller broker.rs:891, viewer broker.rs:1073). (c) TIME: daemon stderr correlation records carry wall-clock AND monotonic timestamps (stderrlog has neither; broker+brain share one file — interleave is unresolvable without them). (d) LIFECYCLE (doyle-confirmed UNCONDITIONAL, not debug-gated): one BOUNDED set of per-conn lifecycle events — write start/timeout-cancel/transport close/writer exit/replacement-reattach (hertz RCA fix-shape items 1-3). Constraint (doyle LOCK): the split/attribution must not REDUCE total information, only correct its attribution; NO timeout-value changes; NO suppression-as-fix. Gate: unit — lifecycle records carry conn id + role + timestamps; the id is unique per physical conn and stable across that conn's records. Kin REQ-CONN-POISON-DIAL-SCOPE (leg a, the token split these fields ride on), REQ-CONN-BLACKHOLE-LIFECYCLE-HARNESS (leg e, consumes these records), REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK (behavior invariant preserved).",
2026-08-28T09:54:46.3729136Z       "requiredStages": [
2026-08-28T09:54:46.3729506Z         "impl",
2026-08-28T09:54:46.3729830Z         "unit"
2026-08-28T09:54:46.3730150Z       ],
2026-08-28T09:54:46.3730460Z       "stages": {
2026-08-28T09:54:46.3730779Z         "doc": {
2026-08-28T09:54:46.3731119Z           "complete": false,
2026-08-28T09:54:46.3731496Z           "evidence": []
2026-08-28T09:54:46.3731848Z         },
2026-08-28T09:54:46.3732152Z         "impl": {
2026-08-28T09:54:46.3732486Z           "complete": true,
2026-08-28T09:54:46.3732971Z           "evidence": [
2026-08-28T09:54:46.3733334Z             {
2026-08-28T09:54:46.3733707Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3734158Z               "line": 2433
2026-08-28T09:54:46.3734513Z             },
2026-08-28T09:54:46.3734833Z             {
2026-08-28T09:54:46.3735190Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3735644Z               "line": 2673
2026-08-28T09:54:46.3736001Z             },
2026-08-28T09:54:46.3736311Z             {
2026-08-28T09:54:46.3736692Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3737196Z               "line": 2703
2026-08-28T09:54:46.3737538Z             },
2026-08-28T09:54:46.3737848Z             {
2026-08-28T09:54:46.3738206Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3738644Z               "line": 3361
2026-08-28T09:54:46.3739078Z             },
2026-08-28T09:54:46.3739388Z             {
2026-08-28T09:54:46.3739763Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3740210Z               "line": 3515
2026-08-28T09:54:46.3740558Z             },
2026-08-28T09:54:46.3740868Z             {
2026-08-28T09:54:46.3741230Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3741669Z               "line": 3577
2026-08-28T09:54:46.3742022Z             },
2026-08-28T09:54:46.3747028Z             {
2026-08-28T09:54:46.3747473Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3747940Z               "line": 3784
2026-08-28T09:54:46.3748293Z             },
2026-08-28T09:54:46.3748603Z             {
2026-08-28T09:54:46.3749071Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3749528Z               "line": 3834
2026-08-28T09:54:46.3749881Z             },
2026-08-28T09:54:46.3750190Z             {
2026-08-28T09:54:46.3750549Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3751018Z               "line": 3869
2026-08-28T09:54:46.3751366Z             },
2026-08-28T09:54:46.3751871Z             {
2026-08-28T09:54:46.3752254Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3752714Z               "line": 5704
2026-08-28T09:54:46.3753066Z             },
2026-08-28T09:54:46.3753381Z             {
2026-08-28T09:54:46.3753733Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3754173Z               "line": 78
2026-08-28T09:54:46.3754527Z             },
2026-08-28T09:54:46.3754827Z             {
2026-08-28T09:54:46.3755180Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3755614Z               "line": 90
2026-08-28T09:54:46.3755938Z             },
2026-08-28T09:54:46.3756230Z             {
2026-08-28T09:54:46.3756577Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3757016Z               "line": 100
2026-08-28T09:54:46.3757360Z             },
2026-08-28T09:54:46.3757680Z             {
2026-08-28T09:54:46.3758043Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3758491Z               "line": 222
2026-08-28T09:54:46.3758834Z             },
2026-08-28T09:54:46.3759239Z             {
2026-08-28T09:54:46.3759602Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3760045Z               "line": 269
2026-08-28T09:54:46.3760388Z             },
2026-08-28T09:54:46.3760694Z             {
2026-08-28T09:54:46.3761039Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3761482Z               "line": 457
2026-08-28T09:54:46.3761825Z             },
2026-08-28T09:54:46.3762135Z             {
2026-08-28T09:54:46.3762494Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3762941Z               "line": 467
2026-08-28T09:54:46.3763279Z             },
2026-08-28T09:54:46.3763594Z             {
2026-08-28T09:54:46.3763942Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3764490Z               "line": 486
2026-08-28T09:54:46.3764829Z             },
2026-08-28T09:54:46.3765158Z             {
2026-08-28T09:54:46.3765505Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.3765952Z               "line": 57
2026-08-28T09:54:46.3766293Z             },
2026-08-28T09:54:46.3766589Z             {
2026-08-28T09:54:46.3766937Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.3767414Z               "line": 460
2026-08-28T09:54:46.3767772Z             },
2026-08-28T09:54:46.3768076Z             {
2026-08-28T09:54:46.3768430Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.3768877Z               "line": 566
2026-08-28T09:54:46.3769324Z             },
2026-08-28T09:54:46.3769628Z             {
2026-08-28T09:54:46.3769982Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.3770419Z               "line": 759
2026-08-28T09:54:46.3770758Z             }
2026-08-28T09:54:46.3771063Z           ]
2026-08-28T09:54:46.3771381Z         },
2026-08-28T09:54:46.3771679Z         "int": {
2026-08-28T09:54:46.3772022Z           "complete": false,
2026-08-28T09:54:46.3772386Z           "evidence": []
2026-08-28T09:54:46.3772730Z         },
2026-08-28T09:54:46.3773029Z         "unit": {
2026-08-28T09:54:46.3773364Z           "complete": true,
2026-08-28T09:54:46.3773722Z           "evidence": [
2026-08-28T09:54:46.3774051Z             {
2026-08-28T09:54:46.3774398Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3774845Z               "line": 713
2026-08-28T09:54:46.3775179Z             },
2026-08-28T09:54:46.3775488Z             {
2026-08-28T09:54:46.3775841Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3776276Z               "line": 785
2026-08-28T09:54:46.3776622Z             }
2026-08-28T09:54:46.3776935Z           ]
2026-08-28T09:54:46.3777235Z         }
2026-08-28T09:54:46.3777527Z       }
2026-08-28T09:54:46.3777822Z     },
2026-08-28T09:54:46.3778122Z     {
2026-08-28T09:54:46.3778446Z       "id": "REQ-CONN-POISON-DIAL-SCOPE",
2026-08-28T09:54:46.3787394Z       "title": "MSG-IDENTITY W6 / F-039 (deployah field-acceptance follow-up 2026-07-10, RCA-FIRST — mint per the v0.30.6 PASS handoff): ambient CONN_WRITE_POISONED log-churn correlates 1:1 with PUMP_PEER_FAIL submit-dials to OFFLINE peers (enlyzeam/kitsubito/gravity) with NO wedge and NO freeze — pre-existed the blackhole rig = log-noise/mislabel, not a defect in the r4 fix. CODE CONTEXT: conn.rs poison_and_cancel emits the loud CONN_WRITE_POISONED line for a write that 'exceeded its bound (OR FAILED)' (conn.rs:181) — the fast-FAIL branch (broken pipe / conn refused on an already-dead counterpart) shares the log tag with the TIMEOUT branch that is the field-acceptance wedge observable, so routine conn teardown under offline-peer dial churn reads like poison events. RCA-FIRST: pin the exact write site that fails per PUMP_PEER_FAIL cycle (BrokerConn is broker-side — which broker conn write rides each pump dial failure? status/event fan-out to a departed subscriber? brain-side notification?) BEFORE changing anything — the correlation mechanism is unpinned. FIX SHAPE (post-RCA, doyle rules at lock): reserve the loud CONN_WRITE_POISONED token for the DEADLINE-EXCEEDED class (the wedge observable blackhole-controller.ps1 watches); a plain write-FAIL on an already-dead conn retires quietly (debug-level or a distinct low-noise token). MUST NOT weaken the r4 invariant: every failure path still poisons + retires the conn (REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK behavior unchanged — only the log LOUDNESS is scoped). Gate: unit — deadline-exceeded emits the loud token, fast-fail does not (both still poison); field — offline-peer churn no longer floods daemon.stderr.log with CONN_WRITE_POISONED. Kin REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK (the invariant this must preserve), REQ-PUMP-PEER-ISOLATION (the offline-peer dial neighborhood), [[v0306-published]].",
2026-08-28T09:54:46.3795532Z       "requiredStages": [
2026-08-28T09:54:46.3796003Z         "impl",
2026-08-28T09:54:46.3796332Z         "unit"
2026-08-28T09:54:46.3796642Z       ],
2026-08-28T09:54:46.3796952Z       "stages": {
2026-08-28T09:54:46.3797267Z         "doc": {
2026-08-28T09:54:46.3797599Z           "complete": false,
2026-08-28T09:54:46.3797969Z           "evidence": []
2026-08-28T09:54:46.3798312Z         },
2026-08-28T09:54:46.3798613Z         "impl": {
2026-08-28T09:54:46.3799042Z           "complete": true,
2026-08-28T09:54:46.3799409Z           "evidence": [
2026-08-28T09:54:46.3799748Z             {
2026-08-28T09:54:46.3800105Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3800538Z               "line": 239
2026-08-28T09:54:46.3800884Z             }
2026-08-28T09:54:46.3801194Z           ]
2026-08-28T09:54:46.3801494Z         },
2026-08-28T09:54:46.3801848Z         "int": {
2026-08-28T09:54:46.3802182Z           "complete": false,
2026-08-28T09:54:46.3802554Z           "evidence": []
2026-08-28T09:54:46.3802907Z         },
2026-08-28T09:54:46.3803210Z         "unit": {
2026-08-28T09:54:46.3803547Z           "complete": true,
2026-08-28T09:54:46.3803910Z           "evidence": [
2026-08-28T09:54:46.3804248Z             {
2026-08-28T09:54:46.3804595Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3805040Z               "line": 707
2026-08-28T09:54:46.3805378Z             },
2026-08-28T09:54:46.3805688Z             {
2026-08-28T09:54:46.3806049Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.3806478Z               "line": 753
2026-08-28T09:54:46.3806816Z             }
2026-08-28T09:54:46.3807126Z           ]
2026-08-28T09:54:46.3807431Z         }
2026-08-28T09:54:46.3807736Z       }
2026-08-28T09:54:46.3808032Z     },
2026-08-28T09:54:46.3808326Z     {
2026-08-28T09:54:46.3808635Z       "id": "REQ-CONSENT-1",
2026-08-28T09:54:46.3810408Z       "title": "Consent grant store: capability x subject-agent x target-node rows, enforced at the target node, subnet-settable (replicates as security material near the trust store), revocable; gated-capability ids (remote-exec, instantiate-anywhere) reserved-but-refusing; v1 consumers are the shell spawn gates (CONTEXT Consent & security gates)",
2026-08-28T09:54:46.3812203Z       "requiredStages": [
2026-08-28T09:54:46.3812560Z         "impl",
2026-08-28T09:54:46.3812879Z         "unit"
2026-08-28T09:54:46.3813203Z       ],
2026-08-28T09:54:46.3813504Z       "stages": {
2026-08-28T09:54:46.3813821Z         "doc": {
2026-08-28T09:54:46.3814155Z           "complete": false,
2026-08-28T09:54:46.3814526Z           "evidence": []
2026-08-28T09:54:46.3814873Z         },
2026-08-28T09:54:46.3815183Z         "impl": {
2026-08-28T09:54:46.3815512Z           "complete": true,
2026-08-28T09:54:46.3815871Z           "evidence": [
2026-08-28T09:54:46.3816205Z             {
2026-08-28T09:54:46.3816575Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3817010Z               "line": 27
2026-08-28T09:54:46.3817349Z             },
2026-08-28T09:54:46.3817653Z             {
2026-08-28T09:54:46.3818016Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3818454Z               "line": 75
2026-08-28T09:54:46.3818796Z             },
2026-08-28T09:54:46.3819190Z             {
2026-08-28T09:54:46.3819552Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3819990Z               "line": 98
2026-08-28T09:54:46.3820319Z             },
2026-08-28T09:54:46.3820620Z             {
2026-08-28T09:54:46.3820978Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3821413Z               "line": 82
2026-08-28T09:54:46.3821740Z             },
2026-08-28T09:54:46.3822052Z             {
2026-08-28T09:54:46.3822401Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3822838Z               "line": 109
2026-08-28T09:54:46.3823177Z             },
2026-08-28T09:54:46.3823478Z             {
2026-08-28T09:54:46.3823831Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3824386Z               "line": 127
2026-08-28T09:54:46.3824729Z             },
2026-08-28T09:54:46.3825048Z             {
2026-08-28T09:54:46.3825405Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3825845Z               "line": 142
2026-08-28T09:54:46.3826189Z             },
2026-08-28T09:54:46.3826499Z             {
2026-08-28T09:54:46.3826842Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3827270Z               "line": 23444
2026-08-28T09:54:46.3827636Z             }
2026-08-28T09:54:46.3827946Z           ]
2026-08-28T09:54:46.3828252Z         },
2026-08-28T09:54:46.3828561Z         "int": {
2026-08-28T09:54:46.3828894Z           "complete": false,
2026-08-28T09:54:46.3829352Z           "evidence": []
2026-08-28T09:54:46.3829702Z         },
2026-08-28T09:54:46.3830012Z         "unit": {
2026-08-28T09:54:46.3830347Z           "complete": true,
2026-08-28T09:54:46.3830714Z           "evidence": [
2026-08-28T09:54:46.3831052Z             {
2026-08-28T09:54:46.3831414Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3831858Z               "line": 334
2026-08-28T09:54:46.3832209Z             },
2026-08-28T09:54:46.3832521Z             {
2026-08-28T09:54:46.3832914Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3833366Z               "line": 380
2026-08-28T09:54:46.3833713Z             },
2026-08-28T09:54:46.3834019Z             {
2026-08-28T09:54:46.3834381Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3834829Z               "line": 391
2026-08-28T09:54:46.3835184Z             },
2026-08-28T09:54:46.3835485Z             {
2026-08-28T09:54:46.3835842Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3836294Z               "line": 165
2026-08-28T09:54:46.3836643Z             },
2026-08-28T09:54:46.3836953Z             {
2026-08-28T09:54:46.3837384Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3837844Z               "line": 184
2026-08-28T09:54:46.3838316Z             },
2026-08-28T09:54:46.3838630Z             {
2026-08-28T09:54:46.3839083Z               "path": "crates/spt-store/src/grants.rs",
2026-08-28T09:54:46.3839526Z               "line": 204
2026-08-28T09:54:46.3839873Z             },
2026-08-28T09:54:46.3840186Z             {
2026-08-28T09:54:46.3840524Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3840950Z               "line": 31153
2026-08-28T09:54:46.3841335Z             }
2026-08-28T09:54:46.3841650Z           ]
2026-08-28T09:54:46.3841802Z         }
2026-08-28T09:54:46.3841951Z       }
2026-08-28T09:54:46.3842103Z     },
2026-08-28T09:54:46.3842252Z     {
2026-08-28T09:54:46.3842418Z       "id": "REQ-CONSENT-2",
2026-08-28T09:54:46.3843793Z       "title": "Interactive consent escalation: an ungated high-risk action routes a consent prompt to the user's most-recently-active session; allow-once / allow-always (writes a grant) / deny; pre-consent flags (can_shutdown, shell_wake_spawn_anywhere) author grants via manifest/settings (CONTEXT Consent & security gates)",
2026-08-28T09:54:46.3843968Z       "requiredStages": [
2026-08-28T09:54:46.3844122Z         "impl",
2026-08-28T09:54:46.3844273Z         "unit"
2026-08-28T09:54:46.3844428Z       ],
2026-08-28T09:54:46.3844584Z       "stages": {
2026-08-28T09:54:46.3844733Z         "doc": {
2026-08-28T09:54:46.3844898Z           "complete": false,
2026-08-28T09:54:46.3845047Z           "evidence": []
2026-08-28T09:54:46.3845203Z         },
2026-08-28T09:54:46.3845341Z         "impl": {
2026-08-28T09:54:46.3845510Z           "complete": true,
2026-08-28T09:54:46.3845658Z           "evidence": [
2026-08-28T09:54:46.3845816Z             {
2026-08-28T09:54:46.3846036Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3846187Z               "line": 140
2026-08-28T09:54:46.3846346Z             },
2026-08-28T09:54:46.3846497Z             {
2026-08-28T09:54:46.3846698Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3846999Z               "line": 165
2026-08-28T09:54:46.3847155Z             },
2026-08-28T09:54:46.3847309Z             {
2026-08-28T09:54:46.3847508Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3847662Z               "line": 199
2026-08-28T09:54:46.3847809Z             },
2026-08-28T09:54:46.3847963Z             {
2026-08-28T09:54:46.3848160Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3848314Z               "line": 241
2026-08-28T09:54:46.3848461Z             },
2026-08-28T09:54:46.3848619Z             {
2026-08-28T09:54:46.3848818Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3849052Z               "line": 269
2026-08-28T09:54:46.3849210Z             },
2026-08-28T09:54:46.3849362Z             {
2026-08-28T09:54:46.3849563Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3849720Z               "line": 300
2026-08-28T09:54:46.3849878Z             },
2026-08-28T09:54:46.3850029Z             {
2026-08-28T09:54:46.3850221Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3850381Z               "line": 23235
2026-08-28T09:54:46.3850529Z             },
2026-08-28T09:54:46.3850684Z             {
2026-08-28T09:54:46.3850866Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3851022Z               "line": 23293
2026-08-28T09:54:46.3851171Z             }
2026-08-28T09:54:46.3851328Z           ]
2026-08-28T09:54:46.3851476Z         },
2026-08-28T09:54:46.3851633Z         "int": {
2026-08-28T09:54:46.3851796Z           "complete": false,
2026-08-28T09:54:46.3851953Z           "evidence": []
2026-08-28T09:54:46.3852106Z         },
2026-08-28T09:54:46.3852253Z         "unit": {
2026-08-28T09:54:46.3852416Z           "complete": true,
2026-08-28T09:54:46.3852572Z           "evidence": [
2026-08-28T09:54:46.3852722Z             {
2026-08-28T09:54:46.3852921Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3853089Z               "line": 419
2026-08-28T09:54:46.3853363Z             },
2026-08-28T09:54:46.3853514Z             {
2026-08-28T09:54:46.3853713Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3853871Z               "line": 436
2026-08-28T09:54:46.3854034Z             },
2026-08-28T09:54:46.3854181Z             {
2026-08-28T09:54:46.3854382Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3854538Z               "line": 472
2026-08-28T09:54:46.3854687Z             },
2026-08-28T09:54:46.3854843Z             {
2026-08-28T09:54:46.3855040Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:46.3855206Z               "line": 516
2026-08-28T09:54:46.3855350Z             },
2026-08-28T09:54:46.3855506Z             {
2026-08-28T09:54:46.3855674Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3855830Z               "line": 32814
2026-08-28T09:54:46.3855982Z             },
2026-08-28T09:54:46.3856142Z             {
2026-08-28T09:54:46.3856328Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3856485Z               "line": 32896
2026-08-28T09:54:46.3856638Z             }
2026-08-28T09:54:46.3856785Z           ]
2026-08-28T09:54:46.3856939Z         }
2026-08-28T09:54:46.3857090Z       }
2026-08-28T09:54:46.3857235Z     },
2026-08-28T09:54:46.3857382Z     {
2026-08-28T09:54:46.3857550Z       "id": "REQ-CONSENT-3",
2026-08-28T09:54:46.3860495Z       "title": "Per-capability approval gates (class-keyed): the require_approval enum may ride INDIVIDUAL [shell.capabilities] entries — gating the dangerous ACT, not just the spawn — with an optional class_key scoping the grant qualifier finer than the capability id ((owner endpoint x device class x node); a remembered HID-class attach grant never authorizes a storage-class attach). Reuses the grant store + interactive escalation + tighten-only floor (REQ-CONSENT-1/2 plumbing). Spawn gates govern EXISTENCE; capability gates govern ACTS — an explicitly distinct invariant (CONTEXT:283, ratified 2026-06-11 Gateway grill).",
2026-08-28T09:54:46.3860791Z       "requiredStages": [
2026-08-28T09:54:46.3860941Z         "doc",
2026-08-28T09:54:46.3861094Z         "impl",
2026-08-28T09:54:46.3861244Z         "unit",
2026-08-28T09:54:46.3861393Z         "int"
2026-08-28T09:54:46.3861545Z       ],
2026-08-28T09:54:46.3861698Z       "stages": {
2026-08-28T09:54:46.3861840Z         "doc": {
2026-08-28T09:54:46.3862013Z           "complete": true,
2026-08-28T09:54:46.3862169Z           "evidence": [
2026-08-28T09:54:46.3862328Z             {
2026-08-28T09:54:46.3862498Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.3862657Z               "line": 365
2026-08-28T09:54:46.3862809Z             }
2026-08-28T09:54:46.3862952Z           ]
2026-08-28T09:54:46.3863104Z         },
2026-08-28T09:54:46.3863252Z         "impl": {
2026-08-28T09:54:46.3863423Z           "complete": true,
2026-08-28T09:54:46.3863572Z           "evidence": [
2026-08-28T09:54:46.3863733Z             {
2026-08-28T09:54:46.3863942Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.3864102Z               "line": 193
2026-08-28T09:54:46.3864255Z             },
2026-08-28T09:54:46.3864407Z             {
2026-08-28T09:54:46.3864608Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.3864755Z               "line": 232
2026-08-28T09:54:46.3864913Z             },
2026-08-28T09:54:46.3865061Z             {
2026-08-28T09:54:46.3865261Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.3865422Z               "line": 361
2026-08-28T09:54:46.3865567Z             },
2026-08-28T09:54:46.3865728Z             {
2026-08-28T09:54:46.3865934Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.3866090Z               "line": 899
2026-08-28T09:54:46.3866239Z             },
2026-08-28T09:54:46.3866395Z             {
2026-08-28T09:54:46.3866603Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.3866773Z               "line": 1189
2026-08-28T09:54:46.3867040Z             },
2026-08-28T09:54:46.3867189Z             {
2026-08-28T09:54:46.3867379Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3867537Z               "line": 23361
2026-08-28T09:54:46.3867694Z             }
2026-08-28T09:54:46.3867838Z           ]
2026-08-28T09:54:46.3867994Z         },
2026-08-28T09:54:46.3868139Z         "int": {
2026-08-28T09:54:46.3868309Z           "complete": true,
2026-08-28T09:54:46.3868468Z           "evidence": [
2026-08-28T09:54:46.3868614Z             {
2026-08-28T09:54:46.3868829Z               "path": "crates/spt/tests/shell_actgate_e2e.rs",
2026-08-28T09:54:46.3869078Z               "line": 16
2026-08-28T09:54:46.3869233Z             }
2026-08-28T09:54:46.3869381Z           ]
2026-08-28T09:54:46.3869533Z         },
2026-08-28T09:54:46.3869681Z         "unit": {
2026-08-28T09:54:46.3869848Z           "complete": true,
2026-08-28T09:54:46.3870006Z           "evidence": [
2026-08-28T09:54:46.3870163Z             {
2026-08-28T09:54:46.3870374Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.3870529Z               "line": 1659
2026-08-28T09:54:46.3870684Z             },
2026-08-28T09:54:46.3870830Z             {
2026-08-28T09:54:46.3871036Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.3871197Z               "line": 1706
2026-08-28T09:54:46.3871342Z             },
2026-08-28T09:54:46.3871497Z             {
2026-08-28T09:54:46.3871706Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.3871871Z               "line": 2081
2026-08-28T09:54:46.3872015Z             }
2026-08-28T09:54:46.3872171Z           ]
2026-08-28T09:54:46.3872315Z         }
2026-08-28T09:54:46.3872476Z       }
2026-08-28T09:54:46.3872635Z     },
2026-08-28T09:54:46.3872782Z     {
2026-08-28T09:54:46.3872973Z       "id": "REQ-CONTROL-STAMP-CONVERGENCE",
2026-08-28T09:54:46.3875940Z       "title": "REGISTRY-LIFECYCLE W2 (ADR-0041 decision 4, emphasys C3 P1): control-stamp writes are session/generation-VALIDATED (or per-endpoint stamp transitions serialized) so a pre-reap KIND_SESSIONS snapshot can never relatch controlled=true after the exit-waiter reap; no fs I/O under global locks (KH 7.12); every no-session path clears all three control fields (controlled/driven_by/viewer_count). Gate: impl — validated/serialized stamp transitions; unit — stale-snapshot write refused after a newer no-session truth, no-session paths clear all three; int — poll-vs-reap interleave converges to cleared stamps (the relatch regression); doc — ADR-0041.",
2026-08-28T09:54:46.3876312Z       "requiredStages": [
2026-08-28T09:54:46.3876465Z         "doc",
2026-08-28T09:54:46.3876622Z         "impl",
2026-08-28T09:54:46.3876766Z         "unit",
2026-08-28T09:54:46.3876916Z         "int"
2026-08-28T09:54:46.3877069Z       ],
2026-08-28T09:54:46.3877215Z       "stages": {
2026-08-28T09:54:46.3877363Z         "doc": {
2026-08-28T09:54:46.3877525Z           "complete": true,
2026-08-28T09:54:46.3877682Z           "evidence": [
2026-08-28T09:54:46.3877845Z             {
2026-08-28T09:54:46.3878073Z               "path": "docs/adr/0041-endpoint-lifecycle-truth.md",
2026-08-28T09:54:46.3878234Z               "line": 61
2026-08-28T09:54:46.3878384Z             }
2026-08-28T09:54:46.3878530Z           ]
2026-08-28T09:54:46.3878675Z         },
2026-08-28T09:54:46.3878836Z         "impl": {
2026-08-28T09:54:46.3879074Z           "complete": true,
2026-08-28T09:54:46.3879237Z           "evidence": [
2026-08-28T09:54:46.3879394Z             {
2026-08-28T09:54:46.3879595Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3879760Z               "line": 998
2026-08-28T09:54:46.3879908Z             },
2026-08-28T09:54:46.3880056Z             {
2026-08-28T09:54:46.3880256Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3880418Z               "line": 1035
2026-08-28T09:54:46.3880571Z             },
2026-08-28T09:54:46.3880719Z             {
2026-08-28T09:54:46.3881038Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3881191Z               "line": 3434
2026-08-28T09:54:46.3881343Z             },
2026-08-28T09:54:46.3881491Z             {
2026-08-28T09:54:46.3881695Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3881849Z               "line": 5977
2026-08-28T09:54:46.3882005Z             },
2026-08-28T09:54:46.3882162Z             {
2026-08-28T09:54:46.3882355Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3882513Z               "line": 8161
2026-08-28T09:54:46.3882665Z             },
2026-08-28T09:54:46.3882818Z             {
2026-08-28T09:54:46.3883018Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.3883181Z               "line": 816
2026-08-28T09:54:46.3883327Z             }
2026-08-28T09:54:46.3883477Z           ]
2026-08-28T09:54:46.3883633Z         },
2026-08-28T09:54:46.3883787Z         "int": {
2026-08-28T09:54:46.3883952Z           "complete": true,
2026-08-28T09:54:46.3884116Z           "evidence": [
2026-08-28T09:54:46.3884267Z             {
2026-08-28T09:54:46.3884506Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.3884668Z               "line": 826
2026-08-28T09:54:46.3884811Z             }
2026-08-28T09:54:46.3884962Z           ]
2026-08-28T09:54:46.3885114Z         },
2026-08-28T09:54:46.3885265Z         "unit": {
2026-08-28T09:54:46.3885428Z           "complete": true,
2026-08-28T09:54:46.3885584Z           "evidence": [
2026-08-28T09:54:46.3886034Z             {
2026-08-28T09:54:46.3886300Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3886471Z               "line": 9827
2026-08-28T09:54:46.3886615Z             },
2026-08-28T09:54:46.3886772Z             {
2026-08-28T09:54:46.3886983Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.3887138Z               "line": 1588
2026-08-28T09:54:46.3887397Z             }
2026-08-28T09:54:46.3887553Z           ]
2026-08-28T09:54:46.3887709Z         }
2026-08-28T09:54:46.3887860Z       }
2026-08-28T09:54:46.3891664Z     },
2026-08-28T09:54:46.3891842Z     {
2026-08-28T09:54:46.3892056Z       "id": "REQ-CONTROLLER-LEASE-IDENTITY",
2026-08-28T09:54:46.3904677Z       "title": "RC-RENDER-TRUTH W2 (ADR-0044 decisions 1+2, hertz same-machine --take split-brain RCA P0-A/B, doyle seam-verified broker.rs resolve_subscribe 1296-1318 + 1334-1347): each rc invocation/attach stream mints a UNIQUE controller lease id carried through SubscribeReq, the controller slot, and Input/Resize; node identity stays separate as attribution/access policy only. The ONLY silent successor/replay case is same-lease + equal-or-newer generation (ADR-0038 fix-6 dispatcher-recovery contract preserved exactly); same node + different lease = DISTINCT controller. Explicit Take on a distinct incumbent lease ALWAYS revokes loudly AND authoritatively — atomically revoke/fence the old lease and FORCE its attach stream closed, then install the taker, regardless of whether by-node strings match; the Displaced notice is best-effort (today old.tx.try_send at broker.rs:1342-1345 can DROP the notice on a Full queue while become_controller still replaces — the revoke/close must land even when notice enqueue fails; the closed stream is itself the terminal signal rc's PumpEnd::Displaced/EOF path handles). Today same_identity keys on controller_by()==by alone, intent never consulted; two same-machine windows collapse to one identity and --take silently swaps the sink leaving the incumbent input-capable but blind. Acceptable identity seam: (by, nonzero attach generation) as the logical lease. GENERATION LADDER (doyle ruling 2026-07-18, resolves fix-6/Busy conflict at T6): within the SAME by — equal gen = silent successor (dispatcher recovery, unchanged); STRICTLY NEWER gen (Control or Take) = loud+fenced supersession (full W2 revoke — without it a live replacement viewport bounces Busy off a stale-replay worker serving a zombie stream forever = post-restart lockout, fix-6 order-independence regression); OLDER gen = refused Busy (unchanged). Across DIFFERENT by: Control = Busy, Take = loud revoke. Deliberate UX: a second same-node window's plain rc loudly displaces the first (pre-W2 did the same replacement SILENTLY with the loser blind-but-interactive; loud+fenced strictly better; --view = coexistence). redispatch_stall T6 must stay green UNMODIFIED. N-1: lease field additive; absent lease (older client) degrades to legacy node-identity semantics for that subscriber. Gate: impl — lease mint + carry + loud distinct-lease Take; unit — same-lease equal/newer gen stays silent, same-node different-lease Take displaces loudly, older-gen replay still refused busy; int — hertz regression steps 1-4 + 7-8 (A gets Displaced{by} + terminal stream completion, output reaches B only, metadata identifies B, one controller slot; separate equal-lease replay test proves dispatcher recovery stays silent); doc — ADR-0044.",
2026-08-28T09:54:46.3905082Z       "requiredStages": [
2026-08-28T09:54:46.3905246Z         "doc",
2026-08-28T09:54:46.3905397Z         "impl",
2026-08-28T09:54:46.3905551Z         "unit",
2026-08-28T09:54:46.3905697Z         "int"
2026-08-28T09:54:46.3905846Z       ],
2026-08-28T09:54:46.3905997Z       "stages": {
2026-08-28T09:54:46.3906154Z         "doc": {
2026-08-28T09:54:46.3906314Z           "complete": true,
2026-08-28T09:54:46.3906472Z           "evidence": [
2026-08-28T09:54:46.3906643Z             {
2026-08-28T09:54:46.3906868Z               "path": "docs/adr/0044-controller-lease-truth.md",
2026-08-28T09:54:46.3907029Z               "line": 40
2026-08-28T09:54:46.3907178Z             }
2026-08-28T09:54:46.3907324Z           ]
2026-08-28T09:54:46.3907469Z         },
2026-08-28T09:54:46.3907620Z         "impl": {
2026-08-28T09:54:46.3907784Z           "complete": true,
2026-08-28T09:54:46.3907935Z           "evidence": [
2026-08-28T09:54:46.3908089Z             {
2026-08-28T09:54:46.3908428Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3908597Z               "line": 2542
2026-08-28T09:54:46.3908745Z             },
2026-08-28T09:54:46.3908895Z             {
2026-08-28T09:54:46.3909191Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3909353Z               "line": 2977
2026-08-28T09:54:46.3909506Z             },
2026-08-28T09:54:46.3909653Z             {
2026-08-28T09:54:46.3909854Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3910012Z               "line": 3067
2026-08-28T09:54:46.3910163Z             },
2026-08-28T09:54:46.3910311Z             {
2026-08-28T09:54:46.3910507Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3910661Z               "line": 3779
2026-08-28T09:54:46.3910807Z             },
2026-08-28T09:54:46.3910961Z             {
2026-08-28T09:54:46.3911165Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3911328Z               "line": 3864
2026-08-28T09:54:46.3911483Z             },
2026-08-28T09:54:46.3911636Z             {
2026-08-28T09:54:46.3911817Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.3911980Z               "line": 1215
2026-08-28T09:54:46.3912127Z             }
2026-08-28T09:54:46.3912275Z           ]
2026-08-28T09:54:46.3912423Z         },
2026-08-28T09:54:46.3912571Z         "int": {
2026-08-28T09:54:46.3912728Z           "complete": true,
2026-08-28T09:54:46.3912886Z           "evidence": [
2026-08-28T09:54:46.3913033Z             {
2026-08-28T09:54:46.3913272Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.3913433Z               "line": 261
2026-08-28T09:54:46.3913578Z             },
2026-08-28T09:54:46.3913728Z             {
2026-08-28T09:54:46.3913956Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.3914112Z               "line": 370
2026-08-28T09:54:46.3914255Z             },
2026-08-28T09:54:46.3914402Z             {
2026-08-28T09:54:46.3914632Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.3914899Z               "line": 547
2026-08-28T09:54:46.3915051Z             }
2026-08-28T09:54:46.3915200Z           ]
2026-08-28T09:54:46.3915351Z         },
2026-08-28T09:54:46.3915500Z         "unit": {
2026-08-28T09:54:46.3915661Z           "complete": true,
2026-08-28T09:54:46.3915820Z           "evidence": [
2026-08-28T09:54:46.3915967Z             {
2026-08-28T09:54:46.3916173Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3916319Z               "line": 10225
2026-08-28T09:54:46.3916474Z             },
2026-08-28T09:54:46.3916624Z             {
2026-08-28T09:54:46.3916819Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3916974Z               "line": 10276
2026-08-28T09:54:46.3917122Z             },
2026-08-28T09:54:46.3917269Z             {
2026-08-28T09:54:46.3917447Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.3917608Z               "line": 3805
2026-08-28T09:54:46.3917757Z             }
2026-08-28T09:54:46.3917908Z           ]
2026-08-28T09:54:46.3918058Z         }
2026-08-28T09:54:46.3918204Z       }
2026-08-28T09:54:46.3918353Z     },
2026-08-28T09:54:46.3918495Z     {
2026-08-28T09:54:46.3918692Z       "id": "REQ-CONTROLLER-LIVENESS-REAP",
2026-08-28T09:54:46.3931030Z       "title": "B-2 (REMOTE-TRUTH triage §B-2, REDUCED @bdc1242): a stale ONLINE+CONTROLLED stamp on a live-session perch self-heals — the info.json driven_by/controlled RECORD is made to match the broker's SINK-TABLE TRUTH. ROOT (persisted-stale-stamp class, doyle Q1): the livehost control reap gates on !has_session (reconcile_hosted_liveness), and a brain-only update KEEPS the session (REQ-UPD-3), so a controller stamp that went stale WHILE the session lived was never re-derived from broker truth. NOT a transport bug: (a) a persisted conn is the REQ-UPD-3 feature; (b) an idle-severed conn eventually EOFs via QUIC keepalive → handle_conn detach (path 1) — and the reason paths 1-3 previously failed to clean up was the B-1 broker floor-lock POISON WEDGE (cleanup panicked under the poisoned lock), now fixed. REDUCTION (doyle, my ground-truth): the prescription was 80% pre-built — converge_perch_stamps (broker.rs, REQ-HAZARD-CONTROL-STAMP-CONVERGENCE) ALREADY converges info.json driven_by/controlled to the broker's controller_by/has_controller on EVERY KIND_SESSIONS poll, and the livehost reconcile already TRIGGERS that poll per tick (query_live_session_endpoints). So NO new IPC query, NO new livehost arm, NO 5th detach path — the ONLY gap is that a controller whose WRITER THREAD died (severed conn: the writer failed a socket write, or a detach dropped by the prior B-1 wedge) still reports controller_by=Some/has_controller=true, so converge keeps the stale stamp. FIX: a broker-side lazy-reap in the KIND_SESSIONS snapshot closure — OutputLog::reap_dead_controller() drops a controller whose _writer.is_finished() BEFORE controller_by/has_controller are read, so the reply + the off-lock converge both see the honest (cleared) state and the stamp clears. LOCK-SAFE: the reap drops the sink in-memory ONLY (no stamp_driven_by → no info.json I/O under the log lock, the KH 7.12/5.16 lock-across-effect discipline); the OFF-lock converge_perch_stamps writes the honest stamp. KH 7.15 held by construction: the reap only ever CLEARS, never latches driven_by; a LIVE (idle, parked-on-rx.recv) controller is is_finished()==false so it is NEVER false-reaped. RESIDUAL (doyle Q2 accepted): a TRULY IDLE severed controller (writer parked on recv, no output, conn not yet EOF'd) stays is_finished()==false and converges only on output-resume / conn-EOF — that harder active-probe case is the RESERVED REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT (SessionInfo.controller_by doc), deliberately NOT built here so the reserved seed keeps its scope. Red-first: a dead-writer sink → reap clears it (controller_by honest None → converge clears the stamp); a live-writer sink → UNTOUCHED (no-false-reap control).",
2026-08-28T09:54:46.3931355Z       "requiredStages": [
2026-08-28T09:54:46.3931613Z         "impl",
2026-08-28T09:54:46.3931766Z         "unit",
2026-08-28T09:54:46.3931912Z         "int"
2026-08-28T09:54:46.3932062Z       ],
2026-08-28T09:54:46.3932217Z       "stages": {
2026-08-28T09:54:46.3932367Z         "doc": {
2026-08-28T09:54:46.3932532Z           "complete": false,
2026-08-28T09:54:46.3932689Z           "evidence": []
2026-08-28T09:54:46.3932838Z         },
2026-08-28T09:54:46.3932989Z         "impl": {
2026-08-28T09:54:46.3933147Z           "complete": true,
2026-08-28T09:54:46.3933304Z           "evidence": [
2026-08-28T09:54:46.3933448Z             {
2026-08-28T09:54:46.3933658Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3933810Z               "line": 2594
2026-08-28T09:54:46.3933962Z             }
2026-08-28T09:54:46.3934106Z           ]
2026-08-28T09:54:46.3934258Z         },
2026-08-28T09:54:46.3934411Z         "int": {
2026-08-28T09:54:46.3934582Z           "complete": true,
2026-08-28T09:54:46.3934740Z           "evidence": [
2026-08-28T09:54:46.3934896Z             {
2026-08-28T09:54:46.3935109Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.3935270Z               "line": 1381
2026-08-28T09:54:46.3935414Z             }
2026-08-28T09:54:46.3935566Z           ]
2026-08-28T09:54:46.3935719Z         },
2026-08-28T09:54:46.3935861Z         "unit": {
2026-08-28T09:54:46.3936029Z           "complete": true,
2026-08-28T09:54:46.3936180Z           "evidence": [
2026-08-28T09:54:46.3936329Z             {
2026-08-28T09:54:46.3936539Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3936696Z               "line": 12180
2026-08-28T09:54:46.3936854Z             },
2026-08-28T09:54:46.3937020Z             {
2026-08-28T09:54:46.3937250Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.3937407Z               "line": 12276
2026-08-28T09:54:46.3937556Z             }
2026-08-28T09:54:46.3937791Z           ]
2026-08-28T09:54:46.3937939Z         }
2026-08-28T09:54:46.3938089Z       }
2026-08-28T09:54:46.3938239Z     },
2026-08-28T09:54:46.3938389Z     {
2026-08-28T09:54:46.3938553Z       "id": "REQ-CONV-1",
2026-08-28T09:54:46.3940995Z       "title": "Peer address seeding, both cold starts: durable peer-addrs.json (identity dir) maps peer pubkey → last-known dialable address; the pump's resolver consults it FIRST with id-only discovery fallback on miss or dial failure (a stale addr never strands a peer); written by the pairing ceremony (both sides, from the live connection) and by the pump on successful connect; post-join first sync and post-restart resync converge in seconds, not ~1 min (M8 decisions 14, 20)",
2026-08-28T09:54:46.3941172Z       "requiredStages": [
2026-08-28T09:54:46.3941319Z         "impl",
2026-08-28T09:54:46.3941463Z         "unit"
2026-08-28T09:54:46.3941610Z       ],
2026-08-28T09:54:46.3941763Z       "stages": {
2026-08-28T09:54:46.3941915Z         "doc": {
2026-08-28T09:54:46.3942088Z           "complete": false,
2026-08-28T09:54:46.3942249Z           "evidence": []
2026-08-28T09:54:46.3942403Z         },
2026-08-28T09:54:46.3942554Z         "impl": {
2026-08-28T09:54:46.3942718Z           "complete": true,
2026-08-28T09:54:46.3942878Z           "evidence": [
2026-08-28T09:54:46.3943023Z             {
2026-08-28T09:54:46.3943220Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.3943384Z               "line": 1695
2026-08-28T09:54:46.3943540Z             },
2026-08-28T09:54:46.3943689Z             {
2026-08-28T09:54:46.3943903Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.3944066Z               "line": 676
2026-08-28T09:54:46.3944213Z             },
2026-08-28T09:54:46.3944370Z             {
2026-08-28T09:54:46.3944571Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.3944728Z               "line": 907
2026-08-28T09:54:46.3944876Z             },
2026-08-28T09:54:46.3945027Z             {
2026-08-28T09:54:46.3945225Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.3945518Z               "line": 1717
2026-08-28T09:54:46.3945678Z             },
2026-08-28T09:54:46.3945826Z             {
2026-08-28T09:54:46.3946036Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.3946188Z               "line": 94
2026-08-28T09:54:46.3946336Z             },
2026-08-28T09:54:46.3946479Z             {
2026-08-28T09:54:46.3946688Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.3946842Z               "line": 347
2026-08-28T09:54:46.3946994Z             },
2026-08-28T09:54:46.3947143Z             {
2026-08-28T09:54:46.3947342Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.3947495Z               "line": 390
2026-08-28T09:54:46.3947643Z             },
2026-08-28T09:54:46.3947792Z             {
2026-08-28T09:54:46.3948000Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.3948163Z               "line": 639
2026-08-28T09:54:46.3948313Z             },
2026-08-28T09:54:46.3948461Z             {
2026-08-28T09:54:46.3948664Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.3948818Z               "line": 1222
2026-08-28T09:54:46.3949061Z             },
2026-08-28T09:54:46.3949213Z             {
2026-08-28T09:54:46.3949423Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:46.3949584Z               "line": 568
2026-08-28T09:54:46.3949738Z             },
2026-08-28T09:54:46.3949890Z             {
2026-08-28T09:54:46.3950100Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:46.3950252Z               "line": 33
2026-08-28T09:54:46.3950396Z             }
2026-08-28T09:54:46.3950548Z           ]
2026-08-28T09:54:46.3950692Z         },
2026-08-28T09:54:46.3950842Z         "int": {
2026-08-28T09:54:46.3951004Z           "complete": false,
2026-08-28T09:54:46.3951173Z           "evidence": []
2026-08-28T09:54:46.3951437Z         },
2026-08-28T09:54:46.3951593Z         "unit": {
2026-08-28T09:54:46.3951761Z           "complete": true,
2026-08-28T09:54:46.3951923Z           "evidence": [
2026-08-28T09:54:46.3952071Z             {
2026-08-28T09:54:46.3952276Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.3952433Z               "line": 2304
2026-08-28T09:54:46.3952581Z             },
2026-08-28T09:54:46.3952733Z             {
2026-08-28T09:54:46.3952934Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:46.3953086Z               "line": 208
2026-08-28T09:54:46.3953235Z             },
2026-08-28T09:54:46.3953381Z             {
2026-08-28T09:54:46.3953583Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:46.3953733Z               "line": 234
2026-08-28T09:54:46.3953886Z             },
2026-08-28T09:54:46.3954033Z             {
2026-08-28T09:54:46.3954230Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:46.3954396Z               "line": 244
2026-08-28T09:54:46.3954540Z             }
2026-08-28T09:54:46.3954691Z           ]
2026-08-28T09:54:46.3954840Z         }
2026-08-28T09:54:46.3954992Z       }
2026-08-28T09:54:46.3955136Z     },
2026-08-28T09:54:46.3955283Z     {
2026-08-28T09:54:46.3955437Z       "id": "REQ-CONV-2",
2026-08-28T09:54:46.3957106Z       "title": "Event-driven advertisement: endpoint online/offline transitions (ready-listener start/stop, rest-state transition, perch death) trigger an immediate advertise_local + peer push as a WAKE of the existing pump loop (no second advertisement path — epoch lease + visibility gates ride unchanged); the cadence stays the steady-state floor (M8 decision 15)",
2026-08-28T09:54:46.3957263Z       "requiredStages": [
2026-08-28T09:54:46.3957412Z         "impl",
2026-08-28T09:54:46.3957563Z         "unit"
2026-08-28T09:54:46.3957717Z       ],
2026-08-28T09:54:46.3957902Z       "stages": {
2026-08-28T09:54:46.3958056Z         "doc": {
2026-08-28T09:54:46.3958221Z           "complete": false,
2026-08-28T09:54:46.3958623Z           "evidence": []
2026-08-28T09:54:46.3958774Z         },
2026-08-28T09:54:46.3958936Z         "impl": {
2026-08-28T09:54:46.3959177Z           "complete": true,
2026-08-28T09:54:46.3959334Z           "evidence": [
2026-08-28T09:54:46.3959486Z             {
2026-08-28T09:54:46.3959697Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.3959858Z               "line": 1191
2026-08-28T09:54:46.3960011Z             },
2026-08-28T09:54:46.3960154Z             {
2026-08-28T09:54:46.3960354Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.3960507Z               "line": 783
2026-08-28T09:54:46.3960660Z             },
2026-08-28T09:54:46.3960812Z             {
2026-08-28T09:54:46.3961026Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.3961190Z               "line": 224
2026-08-28T09:54:46.3961341Z             },
2026-08-28T09:54:46.3961488Z             {
2026-08-28T09:54:46.3961706Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.3961863Z               "line": 1232
2026-08-28T09:54:46.3962011Z             },
2026-08-28T09:54:46.3962163Z             {
2026-08-28T09:54:46.3962373Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.3962531Z               "line": 1243
2026-08-28T09:54:46.3962678Z             },
2026-08-28T09:54:46.3962845Z             {
2026-08-28T09:54:46.3963069Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.3963227Z               "line": 440
2026-08-28T09:54:46.3963374Z             },
2026-08-28T09:54:46.3963527Z             {
2026-08-28T09:54:46.3963708Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3963866Z               "line": 11791
2026-08-28T09:54:46.3964013Z             },
2026-08-28T09:54:46.3964162Z             {
2026-08-28T09:54:46.3964341Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3964603Z               "line": 11807
2026-08-28T09:54:46.3964751Z             },
2026-08-28T09:54:46.3964904Z             {
2026-08-28T09:54:46.3965091Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.3965247Z               "line": 12099
2026-08-28T09:54:46.3965396Z             }
2026-08-28T09:54:46.3965548Z           ]
2026-08-28T09:54:46.3965682Z         },
2026-08-28T09:54:46.3965824Z         "int": {
2026-08-28T09:54:46.3965982Z           "complete": false,
2026-08-28T09:54:46.3966138Z           "evidence": []
2026-08-28T09:54:46.3966287Z         },
2026-08-28T09:54:46.3966444Z         "unit": {
2026-08-28T09:54:46.3966599Z           "complete": true,
2026-08-28T09:54:46.3966761Z           "evidence": [
2026-08-28T09:54:46.3966907Z             {
2026-08-28T09:54:46.3967104Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.3967256Z               "line": 1737
2026-08-28T09:54:46.3967399Z             },
2026-08-28T09:54:46.3967546Z             {
2026-08-28T09:54:46.3967748Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.3967910Z               "line": 1862
2026-08-28T09:54:46.3968052Z             },
2026-08-28T09:54:46.3968209Z             {
2026-08-28T09:54:46.3968424Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.3968573Z               "line": 544
2026-08-28T09:54:46.3968719Z             }
2026-08-28T09:54:46.3968864Z           ]
2026-08-28T09:54:46.3969144Z         }
2026-08-28T09:54:46.3969297Z       }
2026-08-28T09:54:46.3969448Z     },
2026-08-28T09:54:46.3969587Z     {
2026-08-28T09:54:46.3969770Z       "id": "REQ-CRC-SWAP-OLD-DISPLACE",
2026-08-28T09:54:46.3973868Z       "title": "C1 (F028, infra; memory crc-swap-old-litter-brick, RCA'd ENLYZEAM + confirmed systemic): crc_swap `.old`-litter bricks every subsequent adapter update. apply_crc_swap Phase-3 `let _ = remove_file(.old)` (spt-daemon/src/crc_swap.rs:129-133) silently fails whenever ANY pre-update process still image-maps the old binary (NORMAL on a live box — endpoint launch children survive updates). The NEXT update's first commit-op rename(exe->exe.old) = MoveFileExW(REPLACE_EXISTING) must delete the mapped .old -> win32 err 5 -> whole apply fails + rolls back FOREVER, context-free. FIX: (i) DISPLACE not replace — when <target>.old exists, rename it aside to a unique suffix (rename succeeds on mapped files; spt's own updater already does spt.exe.old-<counter>); GC stale .old.* opportunistically. (ii) Wrap swap io errors with op + path (`rename claude-spt.exe -> claude-spt.exe.old: …`). Unit seam exists (crc_swap tests). See triage C1.",
2026-08-28T09:54:46.3974163Z       "requiredStages": [
2026-08-28T09:54:46.3974317Z         "impl",
2026-08-28T09:54:46.3974468Z         "unit"
2026-08-28T09:54:46.3974612Z       ],
2026-08-28T09:54:46.3974764Z       "stages": {
2026-08-28T09:54:46.3974910Z         "doc": {
2026-08-28T09:54:46.3975074Z           "complete": false,
2026-08-28T09:54:46.3975230Z           "evidence": []
2026-08-28T09:54:46.3975388Z         },
2026-08-28T09:54:46.3975535Z         "impl": {
2026-08-28T09:54:46.3975703Z           "complete": true,
2026-08-28T09:54:46.3975859Z           "evidence": [
2026-08-28T09:54:46.3976003Z             {
2026-08-28T09:54:46.3976213Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3976370Z               "line": 107
2026-08-28T09:54:46.3976523Z             },
2026-08-28T09:54:46.3976666Z             {
2026-08-28T09:54:46.3976871Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3977028Z               "line": 117
2026-08-28T09:54:46.3977174Z             },
2026-08-28T09:54:46.3977322Z             {
2026-08-28T09:54:46.3977521Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3977673Z               "line": 131
2026-08-28T09:54:46.3977816Z             },
2026-08-28T09:54:46.3977969Z             {
2026-08-28T09:54:46.3978170Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3978436Z               "line": 200
2026-08-28T09:54:46.3978593Z             },
2026-08-28T09:54:46.3978746Z             {
2026-08-28T09:54:46.3979036Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3979186Z               "line": 219
2026-08-28T09:54:46.3979341Z             },
2026-08-28T09:54:46.3979486Z             {
2026-08-28T09:54:46.3979690Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3979849Z               "line": 248
2026-08-28T09:54:46.3979994Z             }
2026-08-28T09:54:46.3980142Z           ]
2026-08-28T09:54:46.3980287Z         },
2026-08-28T09:54:46.3980445Z         "int": {
2026-08-28T09:54:46.3980606Z           "complete": false,
2026-08-28T09:54:46.3980765Z           "evidence": []
2026-08-28T09:54:46.3980916Z         },
2026-08-28T09:54:46.3981070Z         "unit": {
2026-08-28T09:54:46.3981236Z           "complete": true,
2026-08-28T09:54:46.3981390Z           "evidence": [
2026-08-28T09:54:46.3981537Z             {
2026-08-28T09:54:46.3981748Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3981904Z               "line": 432
2026-08-28T09:54:46.3982053Z             },
2026-08-28T09:54:46.3982204Z             {
2026-08-28T09:54:46.3982401Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3982565Z               "line": 539
2026-08-28T09:54:46.3982723Z             },
2026-08-28T09:54:46.3982868Z             {
2026-08-28T09:54:46.3983070Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3983225Z               "line": 589
2026-08-28T09:54:46.3983375Z             },
2026-08-28T09:54:46.3983522Z             {
2026-08-28T09:54:46.3983732Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3983889Z               "line": 638
2026-08-28T09:54:46.3984041Z             },
2026-08-28T09:54:46.3984203Z             {
2026-08-28T09:54:46.3984399Z               "path": "crates/spt-daemon/src/crc_swap.rs",
2026-08-28T09:54:46.3984562Z               "line": 669
2026-08-28T09:54:46.3984709Z             }
2026-08-28T09:54:46.3984976Z           ]
2026-08-28T09:54:46.3985124Z         }
2026-08-28T09:54:46.3985287Z       }
2026-08-28T09:54:46.3985428Z     },
2026-08-28T09:54:46.3985576Z     {
2026-08-28T09:54:46.3985766Z       "id": "REQ-CREATE-BIND-REST-ACTIVE",
2026-08-28T09:54:46.3993466Z       "title": "A successful fresh `endpoint run --create` bind MUST normalize rest intent to active IN THE SAME lifecycle transition — it must not leave `rest_state=suspended` from the prior life, and must never require a separate explicit `endpoint wake` to make a freshly-bound-online endpoint's rest vocabulary truthful. RE-PROVEN PRESENT on 0.44.0 (hertz W0 item 3, 2026-07-27, isolated build): `endpoint stop` -> raw status=offline rest_state=suspended session_id=5c93...; successful `run --create --start` minted session 714260b31d440df3 status=online — rest_state STILL suspended; independent repeat matched (new session 595f..., same sticky suspended). Sibling probes: fresh create with no prior perch carries NO rest_state field (the field itself is inherited residue, not a fresh stamp); explicit `endpoint wake` on the reproduced row flips suspended->active (the transition exists and works — it is simply never taken by the create/bind path). Downstream symptom from the original F-034 filing: `endpoint suspend` NO_EDGEs on a visibly ONLINE endpoint because the recorded rest state already claims suspended. FIX SHAPE: the create/bind success path stamps rest intent active atomically with the online transition (terminal-normalize family — same transition, never a follow-up repair step); deliberate suspend-while-online semantics (ADR'd rest vocabulary) must be preserved — the normalization applies to FRESH binds inheriting a dead life's rest state, not to a live session an operator suspended. Kin: KH 7.49 (a verb never stamps a state it did not cause — this is the inverse: a transition failing to stamp the state it DID cause), terminal-normalize work 0.41-0.43 (which closed the adjacent shapes but never reached this seam).",
2026-08-28T09:54:46.3993786Z       "requiredStages": [
2026-08-28T09:54:46.3993939Z         "impl",
2026-08-28T09:54:46.3994091Z         "unit",
2026-08-28T09:54:46.3994240Z         "int"
2026-08-28T09:54:46.3994396Z       ],
2026-08-28T09:54:46.3994550Z       "stages": {
2026-08-28T09:54:46.3994701Z         "doc": {
2026-08-28T09:54:46.3994865Z           "complete": false,
2026-08-28T09:54:46.3995026Z           "evidence": []
2026-08-28T09:54:46.3995175Z         },
2026-08-28T09:54:46.3995331Z         "impl": {
2026-08-28T09:54:46.3995495Z           "complete": true,
2026-08-28T09:54:46.3995651Z           "evidence": [
2026-08-28T09:54:46.3995810Z             {
2026-08-28T09:54:46.3996007Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.3996165Z               "line": 368
2026-08-28T09:54:46.3996317Z             },
2026-08-28T09:54:46.3996470Z             {
2026-08-28T09:54:46.3996664Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.3996833Z               "line": 756
2026-08-28T09:54:46.3996989Z             }
2026-08-28T09:54:46.3997138Z           ]
2026-08-28T09:54:46.3997290Z         },
2026-08-28T09:54:46.3997438Z         "int": {
2026-08-28T09:54:46.3997595Z           "complete": true,
2026-08-28T09:54:46.3997753Z           "evidence": [
2026-08-28T09:54:46.3997910Z             {
2026-08-28T09:54:46.3998162Z               "path": "crates/spt/tests/create_bind_rest_active_e2e.rs",
2026-08-28T09:54:46.3998309Z               "line": 78
2026-08-28T09:54:46.3998474Z             }
2026-08-28T09:54:46.3998660Z           ]
2026-08-28T09:54:46.3998808Z         },
2026-08-28T09:54:46.3999033Z         "unit": {
2026-08-28T09:54:46.3999203Z           "complete": true,
2026-08-28T09:54:46.3999362Z           "evidence": [
2026-08-28T09:54:46.3999513Z             {
2026-08-28T09:54:46.3999709Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.3999871Z               "line": 2155
2026-08-28T09:54:46.4000033Z             },
2026-08-28T09:54:46.4000301Z             {
2026-08-28T09:54:46.4000500Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4000663Z               "line": 2181
2026-08-28T09:54:46.4000820Z             },
2026-08-28T09:54:46.4000964Z             {
2026-08-28T09:54:46.4001162Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4001328Z               "line": 2227
2026-08-28T09:54:46.4001474Z             }
2026-08-28T09:54:46.4001627Z           ]
2026-08-28T09:54:46.4001784Z         }
2026-08-28T09:54:46.4001933Z       }
2026-08-28T09:54:46.4002079Z     },
2026-08-28T09:54:46.4002234Z     {
2026-08-28T09:54:46.4002394Z       "id": "REQ-DAEMON-1",
2026-08-28T09:54:46.4002672Z       "title": "One per-machine spt-daemon owning all per-machine state",
2026-08-28T09:54:46.4002839Z       "requiredStages": [
2026-08-28T09:54:46.4003033Z         "impl",
2026-08-28T09:54:46.4003197Z         "unit",
2026-08-28T09:54:46.4003343Z         "int"
2026-08-28T09:54:46.4003502Z       ],
2026-08-28T09:54:46.4003653Z       "stages": {
2026-08-28T09:54:46.4003805Z         "doc": {
2026-08-28T09:54:46.4003965Z           "complete": false,
2026-08-28T09:54:46.4004127Z           "evidence": []
2026-08-28T09:54:46.4004275Z         },
2026-08-28T09:54:46.4004428Z         "impl": {
2026-08-28T09:54:46.4004585Z           "complete": true,
2026-08-28T09:54:46.4004738Z           "evidence": [
2026-08-28T09:54:46.4004886Z             {
2026-08-28T09:54:46.4005091Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.4005252Z               "line": 311
2026-08-28T09:54:46.4005397Z             },
2026-08-28T09:54:46.4005548Z             {
2026-08-28T09:54:46.4005754Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4005910Z               "line": 12
2026-08-28T09:54:46.4006060Z             },
2026-08-28T09:54:46.4006206Z             {
2026-08-28T09:54:46.4006417Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4006682Z               "line": 18
2026-08-28T09:54:46.4006839Z             },
2026-08-28T09:54:46.4006973Z             {
2026-08-28T09:54:46.4007182Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4007341Z               "line": 1052
2026-08-28T09:54:46.4007497Z             },
2026-08-28T09:54:46.4007951Z             {
2026-08-28T09:54:46.4008170Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4008327Z               "line": 24
2026-08-28T09:54:46.4008479Z             },
2026-08-28T09:54:46.4008619Z             {
2026-08-28T09:54:46.4008817Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4009030Z               "line": 144
2026-08-28T09:54:46.4009172Z             },
2026-08-28T09:54:46.4009316Z             {
2026-08-28T09:54:46.4009559Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4009711Z               "line": 161
2026-08-28T09:54:46.4009855Z             },
2026-08-28T09:54:46.4010002Z             {
2026-08-28T09:54:46.4010203Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4010364Z               "line": 632
2026-08-28T09:54:46.4010509Z             },
2026-08-28T09:54:46.4010655Z             {
2026-08-28T09:54:46.4010856Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4011018Z               "line": 1228
2026-08-28T09:54:46.4011166Z             },
2026-08-28T09:54:46.4011313Z             {
2026-08-28T09:54:46.4011510Z               "path": "crates/spt-daemon/src/relay.rs",
2026-08-28T09:54:46.4011679Z               "line": 15
2026-08-28T09:54:46.4011832Z             },
2026-08-28T09:54:46.4011968Z             {
2026-08-28T09:54:46.4012169Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.4012320Z               "line": 462
2026-08-28T09:54:46.4012469Z             },
2026-08-28T09:54:46.4012607Z             {
2026-08-28T09:54:46.4012798Z               "path": "crates/spt/src/api/live.rs",
2026-08-28T09:54:46.4012954Z               "line": 13
2026-08-28T09:54:46.4013255Z             },
2026-08-28T09:54:46.4013414Z             {
2026-08-28T09:54:46.4013608Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4013767Z               "line": 1002
2026-08-28T09:54:46.4013913Z             },
2026-08-28T09:54:46.4014062Z             {
2026-08-28T09:54:46.4014251Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4014417Z               "line": 1164
2026-08-28T09:54:46.4014558Z             }
2026-08-28T09:54:46.4014707Z           ]
2026-08-28T09:54:46.4014858Z         },
2026-08-28T09:54:46.4015003Z         "int": {
2026-08-28T09:54:46.4015168Z           "complete": true,
2026-08-28T09:54:46.4015322Z           "evidence": [
2026-08-28T09:54:46.4015474Z             {
2026-08-28T09:54:46.4015750Z               "path": "crates/spt-daemon/tests/daemon_lifecycle_real_brain.rs",
2026-08-28T09:54:46.4015908Z               "line": 2
2026-08-28T09:54:46.4016060Z             },
2026-08-28T09:54:46.4016218Z             {
2026-08-28T09:54:46.4016504Z               "path": "crates/spt-daemon/tests/daemon_lifecycle_real_brain.rs",
2026-08-28T09:54:46.4016657Z               "line": 21
2026-08-28T09:54:46.4016809Z             },
2026-08-28T09:54:46.4016954Z             {
2026-08-28T09:54:46.4017185Z               "path": "crates/spt/tests/live_bind_firsthost_e2e.rs",
2026-08-28T09:54:46.4017338Z               "line": 12
2026-08-28T09:54:46.4017489Z             },
2026-08-28T09:54:46.4017638Z             {
2026-08-28T09:54:46.4017853Z               "path": "crates/spt/tests/live_firsthost_e2e.rs",
2026-08-28T09:54:46.4018015Z               "line": 12
2026-08-28T09:54:46.4018163Z             }
2026-08-28T09:54:46.4018315Z           ]
2026-08-28T09:54:46.4018458Z         },
2026-08-28T09:54:46.4018605Z         "unit": {
2026-08-28T09:54:46.4018763Z           "complete": true,
2026-08-28T09:54:46.4018920Z           "evidence": [
2026-08-28T09:54:46.4019254Z             {
2026-08-28T09:54:46.4019458Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4019618Z               "line": 377
2026-08-28T09:54:46.4019761Z             },
2026-08-28T09:54:46.4019914Z             {
2026-08-28T09:54:46.4020114Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4020271Z               "line": 385
2026-08-28T09:54:46.4020410Z             },
2026-08-28T09:54:46.4020557Z             {
2026-08-28T09:54:46.4020754Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4020910Z               "line": 401
2026-08-28T09:54:46.4021059Z             },
2026-08-28T09:54:46.4021211Z             {
2026-08-28T09:54:46.4021407Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4021559Z               "line": 409
2026-08-28T09:54:46.4021713Z             },
2026-08-28T09:54:46.4021859Z             {
2026-08-28T09:54:46.4022075Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4022248Z               "line": 2174
2026-08-28T09:54:46.4022401Z             },
2026-08-28T09:54:46.4022547Z             {
2026-08-28T09:54:46.4022748Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4022914Z               "line": 3551
2026-08-28T09:54:46.4023058Z             },
2026-08-28T09:54:46.4023204Z             {
2026-08-28T09:54:46.4023406Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4023568Z               "line": 2111
2026-08-28T09:54:46.4023720Z             },
2026-08-28T09:54:46.4023868Z             {
2026-08-28T09:54:46.4024068Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4024226Z               "line": 2148
2026-08-28T09:54:46.4024378Z             },
2026-08-28T09:54:46.4024522Z             {
2026-08-28T09:54:46.4024721Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4024887Z               "line": 2171
2026-08-28T09:54:46.4025029Z             },
2026-08-28T09:54:46.4025185Z             {
2026-08-28T09:54:46.4025376Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4025648Z               "line": 2200
2026-08-28T09:54:46.4025791Z             },
2026-08-28T09:54:46.4025967Z             {
2026-08-28T09:54:46.4026164Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4026320Z               "line": 2248
2026-08-28T09:54:46.4026458Z             },
2026-08-28T09:54:46.4026616Z             {
2026-08-28T09:54:46.4026831Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4026983Z               "line": 2291
2026-08-28T09:54:46.4027137Z             },
2026-08-28T09:54:46.4027278Z             {
2026-08-28T09:54:46.4027475Z               "path": "crates/spt-daemon/src/relay.rs",
2026-08-28T09:54:46.4027630Z               "line": 119
2026-08-28T09:54:46.4027783Z             },
2026-08-28T09:54:46.4027936Z             {
2026-08-28T09:54:46.4028127Z               "path": "crates/spt-daemon/src/relay.rs",
2026-08-28T09:54:46.4028297Z               "line": 179
2026-08-28T09:54:46.4028452Z             },
2026-08-28T09:54:46.4028607Z             {
2026-08-28T09:54:46.4028804Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.4029048Z               "line": 1227
2026-08-28T09:54:46.4029204Z             }
2026-08-28T09:54:46.4029353Z           ]
2026-08-28T09:54:46.4029504Z         }
2026-08-28T09:54:46.4029652Z       }
2026-08-28T09:54:46.4029796Z     },
2026-08-28T09:54:46.4029942Z     {
2026-08-28T09:54:46.4030104Z       "id": "REQ-DAEMON-2",
2026-08-28T09:54:46.4030335Z       "title": "Broker/brain split for seamless self-update",
2026-08-28T09:54:46.4030507Z       "requiredStages": [
2026-08-28T09:54:46.4030650Z         "impl",
2026-08-28T09:54:46.4030803Z         "unit",
2026-08-28T09:54:46.4030951Z         "int"
2026-08-28T09:54:46.4031099Z       ],
2026-08-28T09:54:46.4031256Z       "stages": {
2026-08-28T09:54:46.4031404Z         "doc": {
2026-08-28T09:54:46.4031676Z           "complete": true,
2026-08-28T09:54:46.4031833Z           "evidence": [
2026-08-28T09:54:46.4032000Z             {
2026-08-28T09:54:46.4032186Z               "path": "docs/TWO-HOST-RUNBOOK.md",
2026-08-28T09:54:46.4032343Z               "line": 376
2026-08-28T09:54:46.4032496Z             }
2026-08-28T09:54:46.4032644Z           ]
2026-08-28T09:54:46.4032799Z         },
2026-08-28T09:54:46.4032947Z         "impl": {
2026-08-28T09:54:46.4033112Z           "complete": true,
2026-08-28T09:54:46.4033265Z           "evidence": [
2026-08-28T09:54:46.4033417Z             {
2026-08-28T09:54:46.4033613Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.4033774Z               "line": 23
2026-08-28T09:54:46.4033923Z             },
2026-08-28T09:54:46.4034070Z             {
2026-08-28T09:54:46.4034266Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.4034423Z               "line": 1565
2026-08-28T09:54:46.4034581Z             },
2026-08-28T09:54:46.4034728Z             {
2026-08-28T09:54:46.4034933Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.4035097Z               "line": 1644
2026-08-28T09:54:46.4035244Z             },
2026-08-28T09:54:46.4035395Z             {
2026-08-28T09:54:46.4035589Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.4035745Z               "line": 2252
2026-08-28T09:54:46.4035890Z             },
2026-08-28T09:54:46.4036041Z             {
2026-08-28T09:54:46.4036242Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4036399Z               "line": 32
2026-08-28T09:54:46.4036552Z             },
2026-08-28T09:54:46.4036699Z             {
2026-08-28T09:54:46.4036914Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4037153Z               "line": 5344
2026-08-28T09:54:46.4037309Z             },
2026-08-28T09:54:46.4037453Z             {
2026-08-28T09:54:46.4037658Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4037848Z               "line": 8682
2026-08-28T09:54:46.4038002Z             },
2026-08-28T09:54:46.4038339Z             {
2026-08-28T09:54:46.4038557Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4038721Z               "line": 9330
2026-08-28T09:54:46.4038862Z             },
2026-08-28T09:54:46.4039107Z             {
2026-08-28T09:54:46.4039298Z               "path": "crates/spt-daemon/src/codec.rs",
2026-08-28T09:54:46.4039455Z               "line": 11
2026-08-28T09:54:46.4039603Z             },
2026-08-28T09:54:46.4039749Z             {
2026-08-28T09:54:46.4039946Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4040102Z               "line": 197
2026-08-28T09:54:46.4040247Z             },
2026-08-28T09:54:46.4040393Z             {
2026-08-28T09:54:46.4040593Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4040743Z               "line": 474
2026-08-28T09:54:46.4040896Z             },
2026-08-28T09:54:46.4041048Z             {
2026-08-28T09:54:46.4041244Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4041401Z               "line": 13
2026-08-28T09:54:46.4044044Z             },
2026-08-28T09:54:46.4044231Z             {
2026-08-28T09:54:46.4044455Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4044616Z               "line": 27
2026-08-28T09:54:46.4044770Z             },
2026-08-28T09:54:46.4044926Z             {
2026-08-28T09:54:46.4045132Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4045289Z               "line": 361
2026-08-28T09:54:46.4045437Z             },
2026-08-28T09:54:46.4045584Z             {
2026-08-28T09:54:46.4045790Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4045945Z               "line": 1278
2026-08-28T09:54:46.4046093Z             },
2026-08-28T09:54:46.4046238Z             {
2026-08-28T09:54:46.4046445Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4046750Z               "line": 1563
2026-08-28T09:54:46.4046901Z             },
2026-08-28T09:54:46.4047050Z             {
2026-08-28T09:54:46.4047250Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4047402Z               "line": 1775
2026-08-28T09:54:46.4047545Z             },
2026-08-28T09:54:46.4047693Z             {
2026-08-28T09:54:46.4047889Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4048046Z               "line": 1887
2026-08-28T09:54:46.4048194Z             },
2026-08-28T09:54:46.4048337Z             {
2026-08-28T09:54:46.4048538Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4048690Z               "line": 2162
2026-08-28T09:54:46.4048841Z             },
2026-08-28T09:54:46.4049089Z             {
2026-08-28T09:54:46.4049300Z               "path": "crates/spt-daemon/src/transport.rs",
2026-08-28T09:54:46.4049451Z               "line": 10
2026-08-28T09:54:46.4049600Z             }
2026-08-28T09:54:46.4049761Z           ]
2026-08-28T09:54:46.4049905Z         },
2026-08-28T09:54:46.4050062Z         "int": {
2026-08-28T09:54:46.4050220Z           "complete": true,
2026-08-28T09:54:46.4050377Z           "evidence": [
2026-08-28T09:54:46.4050525Z             {
2026-08-28T09:54:46.4050729Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.4050883Z               "line": 17
2026-08-28T09:54:46.4051034Z             },
2026-08-28T09:54:46.4051181Z             {
2026-08-28T09:54:46.4051394Z               "path": "crates/spt-daemon/tests/netbroker.rs",
2026-08-28T09:54:46.4051552Z               "line": 92
2026-08-28T09:54:46.4051694Z             },
2026-08-28T09:54:46.4051848Z             {
2026-08-28T09:54:46.4052056Z               "path": "crates/spt-daemon/tests/netbroker.rs",
2026-08-28T09:54:46.4052214Z               "line": 112
2026-08-28T09:54:46.4052362Z             },
2026-08-28T09:54:46.4052505Z             {
2026-08-28T09:54:46.4052715Z               "path": "crates/spt-daemon/tests/netbroker.rs",
2026-08-28T09:54:46.4052877Z               "line": 192
2026-08-28T09:54:46.4053144Z             },
2026-08-28T09:54:46.4053291Z             {
2026-08-28T09:54:46.4053496Z               "path": "crates/spt-daemon/tests/netbroker.rs",
2026-08-28T09:54:46.4053655Z               "line": 319
2026-08-28T09:54:46.4053802Z             },
2026-08-28T09:54:46.4053953Z             {
2026-08-28T09:54:46.4054152Z               "path": "crates/spt-daemon/tests/netstream.rs",
2026-08-28T09:54:46.4054309Z               "line": 139
2026-08-28T09:54:46.4054453Z             },
2026-08-28T09:54:46.4054608Z             {
2026-08-28T09:54:46.4054810Z               "path": "crates/spt/tests/brain_survive.rs",
2026-08-28T09:54:46.4054962Z               "line": 59
2026-08-28T09:54:46.4055106Z             }
2026-08-28T09:54:46.4055253Z           ]
2026-08-28T09:54:46.4055405Z         },
2026-08-28T09:54:46.4055553Z         "unit": {
2026-08-28T09:54:46.4055724Z           "complete": true,
2026-08-28T09:54:46.4055882Z           "evidence": [
2026-08-28T09:54:46.4056039Z             {
2026-08-28T09:54:46.4056236Z               "path": "crates/spt-daemon/src/codec.rs",
2026-08-28T09:54:46.4056392Z               "line": 62
2026-08-28T09:54:46.4056539Z             },
2026-08-28T09:54:46.4056690Z             {
2026-08-28T09:54:46.4056889Z               "path": "crates/spt-daemon/src/codec.rs",
2026-08-28T09:54:46.4057042Z               "line": 76
2026-08-28T09:54:46.4057195Z             },
2026-08-28T09:54:46.4057339Z             {
2026-08-28T09:54:46.4057529Z               "path": "crates/spt-daemon/src/codec.rs",
2026-08-28T09:54:46.4057681Z               "line": 88
2026-08-28T09:54:46.4057825Z             },
2026-08-28T09:54:46.4057972Z             {
2026-08-28T09:54:46.4058173Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.4058325Z               "line": 617
2026-08-28T09:54:46.4058469Z             },
2026-08-28T09:54:46.4058620Z             {
2026-08-28T09:54:46.4058812Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4059189Z               "line": 1896
2026-08-28T09:54:46.4059344Z             },
2026-08-28T09:54:46.4059497Z             {
2026-08-28T09:54:46.4059692Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4059851Z               "line": 1981
2026-08-28T09:54:46.4060002Z             },
2026-08-28T09:54:46.4060146Z             {
2026-08-28T09:54:46.4060340Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4060494Z               "line": 1998
2026-08-28T09:54:46.4060641Z             },
2026-08-28T09:54:46.4060785Z             {
2026-08-28T09:54:46.4060974Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4061133Z               "line": 2129
2026-08-28T09:54:46.4061276Z             },
2026-08-28T09:54:46.4061420Z             {
2026-08-28T09:54:46.4061627Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4061789Z               "line": 2350
2026-08-28T09:54:46.4061939Z             },
2026-08-28T09:54:46.4062084Z             {
2026-08-28T09:54:46.4062283Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4062436Z               "line": 2418
2026-08-28T09:54:46.4062592Z             },
2026-08-28T09:54:46.4062732Z             {
2026-08-28T09:54:46.4062941Z               "path": "crates/spt-daemon/src/transport.rs",
2026-08-28T09:54:46.4063094Z               "line": 110
2026-08-28T09:54:46.4063242Z             },
2026-08-28T09:54:46.4063385Z             {
2026-08-28T09:54:46.4063585Z               "path": "crates/spt-daemon/tests/resume.rs",
2026-08-28T09:54:46.4063737Z               "line": 143
2026-08-28T09:54:46.4063886Z             }
2026-08-28T09:54:46.4064033Z           ]
2026-08-28T09:54:46.4064176Z         }
2026-08-28T09:54:46.4064325Z       }
2026-08-28T09:54:46.4064466Z     },
2026-08-28T09:54:46.4064609Z     {
2026-08-28T09:54:46.4064768Z       "id": "REQ-DAEMON-3",
2026-08-28T09:54:46.4065027Z       "title": "Any api invocation auto-starts the daemon if absent",
2026-08-28T09:54:46.4065188Z       "requiredStages": [
2026-08-28T09:54:46.4065455Z         "impl",
2026-08-28T09:54:46.4065604Z         "unit",
2026-08-28T09:54:46.4065750Z         "int"
2026-08-28T09:54:46.4065900Z       ],
2026-08-28T09:54:46.4066046Z       "stages": {
2026-08-28T09:54:46.4066200Z         "doc": {
2026-08-28T09:54:46.4066361Z           "complete": false,
2026-08-28T09:54:46.4066520Z           "evidence": []
2026-08-28T09:54:46.4066666Z         },
2026-08-28T09:54:46.4066815Z         "impl": {
2026-08-28T09:54:46.4066980Z           "complete": true,
2026-08-28T09:54:46.4067132Z           "evidence": [
2026-08-28T09:54:46.4067283Z             {
2026-08-28T09:54:46.4067498Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4067650Z               "line": 14
2026-08-28T09:54:46.4067799Z             },
2026-08-28T09:54:46.4067945Z             {
2026-08-28T09:54:46.4068142Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:46.4068293Z               "line": 11
2026-08-28T09:54:46.4068452Z             },
2026-08-28T09:54:46.4068599Z             {
2026-08-28T09:54:46.4068781Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.4068932Z               "line": 507
2026-08-28T09:54:46.4069152Z             },
2026-08-28T09:54:46.4069314Z             {
2026-08-28T09:54:46.4069499Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4069654Z               "line": 7817
2026-08-28T09:54:46.4069786Z             },
2026-08-28T09:54:46.4069937Z             {
2026-08-28T09:54:46.4070115Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4070281Z               "line": 13880
2026-08-28T09:54:46.4070463Z             },
2026-08-28T09:54:46.4070625Z             {
2026-08-28T09:54:46.4070797Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4070958Z               "line": 13901
2026-08-28T09:54:46.4071106Z             }
2026-08-28T09:54:46.4071249Z           ]
2026-08-28T09:54:46.4071507Z         },
2026-08-28T09:54:46.4071651Z         "int": {
2026-08-28T09:54:46.4071821Z           "complete": true,
2026-08-28T09:54:46.4071970Z           "evidence": [
2026-08-28T09:54:46.4072121Z             {
2026-08-28T09:54:46.4072321Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:46.4072476Z               "line": 44
2026-08-28T09:54:46.4072624Z             },
2026-08-28T09:54:46.4072767Z             {
2026-08-28T09:54:46.4072963Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:46.4073119Z               "line": 462
2026-08-28T09:54:46.4073263Z             }
2026-08-28T09:54:46.4073410Z           ]
2026-08-28T09:54:46.4073559Z         },
2026-08-28T09:54:46.4073706Z         "unit": {
2026-08-28T09:54:46.4073865Z           "complete": true,
2026-08-28T09:54:46.4074026Z           "evidence": [
2026-08-28T09:54:46.4074170Z             {
2026-08-28T09:54:46.4074369Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4074532Z               "line": 3484
2026-08-28T09:54:46.4074684Z             },
2026-08-28T09:54:46.4074828Z             {
2026-08-28T09:54:46.4075011Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4075169Z               "line": 38044
2026-08-28T09:54:46.4075305Z             }
2026-08-28T09:54:46.4075720Z           ]
2026-08-28T09:54:46.4075859Z         }
2026-08-28T09:54:46.4075996Z       }
2026-08-28T09:54:46.4076131Z     },
2026-08-28T09:54:46.4076278Z     {
2026-08-28T09:54:46.4076440Z       "id": "REQ-DAEMON-4",
2026-08-28T09:54:46.4076644Z       "title": "Honor every KNOWN-HAZARDS invariant",
2026-08-28T09:54:46.4076803Z       "requiredStages": [
2026-08-28T09:54:46.4076950Z         "impl",
2026-08-28T09:54:46.4077099Z         "unit",
2026-08-28T09:54:46.4077241Z         "int"
2026-08-28T09:54:46.4077376Z       ],
2026-08-28T09:54:46.4077526Z       "stages": {
2026-08-28T09:54:46.4077674Z         "doc": {
2026-08-28T09:54:46.4077834Z           "complete": false,
2026-08-28T09:54:46.4077996Z           "evidence": []
2026-08-28T09:54:46.4078140Z         },
2026-08-28T09:54:46.4078416Z         "impl": {
2026-08-28T09:54:46.4078577Z           "complete": true,
2026-08-28T09:54:46.4078730Z           "evidence": [
2026-08-28T09:54:46.4078877Z             {
2026-08-28T09:54:46.4079164Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4079318Z               "line": 1788
2026-08-28T09:54:46.4079465Z             },
2026-08-28T09:54:46.4079613Z             {
2026-08-28T09:54:46.4079821Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4079981Z               "line": 1878
2026-08-28T09:54:46.4080127Z             },
2026-08-28T09:54:46.4080276Z             {
2026-08-28T09:54:46.4080479Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4080632Z               "line": 1900
2026-08-28T09:54:46.4080779Z             }
2026-08-28T09:54:46.4080928Z           ]
2026-08-28T09:54:46.4081103Z         },
2026-08-28T09:54:46.4081253Z         "int": {
2026-08-28T09:54:46.4081418Z           "complete": true,
2026-08-28T09:54:46.4081577Z           "evidence": [
2026-08-28T09:54:46.4081723Z             {
2026-08-28T09:54:46.4081938Z               "path": "crates/spt-daemon/tests/daemon_e2e.rs",
2026-08-28T09:54:46.4082091Z               "line": 42
2026-08-28T09:54:46.4082234Z             }
2026-08-28T09:54:46.4082376Z           ]
2026-08-28T09:54:46.4082526Z         },
2026-08-28T09:54:46.4082676Z         "unit": {
2026-08-28T09:54:46.4082838Z           "complete": true,
2026-08-28T09:54:46.4082993Z           "evidence": [
2026-08-28T09:54:46.4083136Z             {
2026-08-28T09:54:46.4083336Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4083490Z               "line": 534
2026-08-28T09:54:46.4083641Z             },
2026-08-28T09:54:46.4083786Z             {
2026-08-28T09:54:46.4083985Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4084143Z               "line": 3779
2026-08-28T09:54:46.4084400Z             },
2026-08-28T09:54:46.4084553Z             {
2026-08-28T09:54:46.4084754Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4084910Z               "line": 3849
2026-08-28T09:54:46.4085054Z             },
2026-08-28T09:54:46.4085205Z             {
2026-08-28T09:54:46.4085403Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4085558Z               "line": 3879
2026-08-28T09:54:46.4085701Z             },
2026-08-28T09:54:46.4085851Z             {
2026-08-28T09:54:46.4086056Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4086204Z               "line": 3912
2026-08-28T09:54:46.4086357Z             }
2026-08-28T09:54:46.4086499Z           ]
2026-08-28T09:54:46.4086653Z         }
2026-08-28T09:54:46.4086791Z       }
2026-08-28T09:54:46.4086938Z     },
2026-08-28T09:54:46.4087081Z     {
2026-08-28T09:54:46.4087243Z       "id": "REQ-DAEMON-5",
2026-08-28T09:54:46.4089281Z       "title": "Pump liveness: the peer pump writes a last-tick heartbeat consumed by daemon status / subnet status (decision 23 render legs in REQ-CLI-2/REQ-SUBNET-8); the daemon supervises the pump task — a panic is caught, logged loudly, and the pump restarts with capped backoff (≤5 min), so a 5.9-class death self-heals visibly instead of silently halving the daemon (M8 decision 23; field motivation: hfenduleam 2026-06-07 half-death)",
2026-08-28T09:54:46.4089495Z       "requiredStages": [
2026-08-28T09:54:46.4089666Z         "impl",
2026-08-28T09:54:46.4089814Z         "unit"
2026-08-28T09:54:46.4089958Z       ],
2026-08-28T09:54:46.4090110Z       "stages": {
2026-08-28T09:54:46.4090259Z         "doc": {
2026-08-28T09:54:46.4090415Z           "complete": false,
2026-08-28T09:54:46.4090569Z           "evidence": []
2026-08-28T09:54:46.4090720Z         },
2026-08-28T09:54:46.4090865Z         "impl": {
2026-08-28T09:54:46.4091030Z           "complete": true,
2026-08-28T09:54:46.4091183Z           "evidence": [
2026-08-28T09:54:46.4091334Z             {
2026-08-28T09:54:46.4091569Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4091869Z               "line": 670
2026-08-28T09:54:46.4092021Z             },
2026-08-28T09:54:46.4092165Z             {
2026-08-28T09:54:46.4092369Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4092526Z               "line": 1617
2026-08-28T09:54:46.4092675Z             },
2026-08-28T09:54:46.4092823Z             {
2026-08-28T09:54:46.4093023Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4093179Z               "line": 1630
2026-08-28T09:54:46.4093326Z             },
2026-08-28T09:54:46.4093478Z             {
2026-08-28T09:54:46.4093682Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4093839Z               "line": 1648
2026-08-28T09:54:46.4093992Z             },
2026-08-28T09:54:46.4094140Z             {
2026-08-28T09:54:46.4094336Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4094497Z               "line": 1689
2026-08-28T09:54:46.4094646Z             }
2026-08-28T09:54:46.4094789Z           ]
2026-08-28T09:54:46.4094936Z         },
2026-08-28T09:54:46.4095084Z         "int": {
2026-08-28T09:54:46.4095251Z           "complete": false,
2026-08-28T09:54:46.4095398Z           "evidence": []
2026-08-28T09:54:46.4095546Z         },
2026-08-28T09:54:46.4095986Z         "unit": {
2026-08-28T09:54:46.4096151Z           "complete": true,
2026-08-28T09:54:46.4096308Z           "evidence": [
2026-08-28T09:54:46.4096454Z             {
2026-08-28T09:54:46.4096650Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4096797Z               "line": 2230
2026-08-28T09:54:46.4096931Z             },
2026-08-28T09:54:46.4097102Z             {
2026-08-28T09:54:46.4097313Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4097459Z               "line": 2254
2026-08-28T09:54:46.4097608Z             },
2026-08-28T09:54:46.4097975Z             {
2026-08-28T09:54:46.4098177Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4098337Z               "line": 2280
2026-08-28T09:54:46.4098482Z             }
2026-08-28T09:54:46.4098633Z           ]
2026-08-28T09:54:46.4098775Z         }
2026-08-28T09:54:46.4098922Z       }
2026-08-28T09:54:46.4099150Z     },
2026-08-28T09:54:46.4099293Z     {
2026-08-28T09:54:46.4099455Z       "id": "REQ-DAEMON-6",
2026-08-28T09:54:46.4102373Z       "title": "Service-aware `daemon start`/`stop`: when an OS service manager has a registered spt-daemon for this user, `spt daemon start` and `spt daemon stop` drive THAT service (so stop doesn't IPC-kill a unit that auto-restart-fights for the broker socket — the kitsubito 2026-06-08 loop). `start` graduates from a `run` alias to a first-class background verb (ensure-up, idempotent, non-blocking); stop routes managed→manager, manual→IPC. Linux=systemd user unit (`systemctl --user start|stop|is-active spt-daemon`, detected by unit-file presence); Windows=no controllable manager (the logon task is boot-only), so start=detached spawn / stop=IPC.",
2026-08-28T09:54:46.4102552Z       "requiredStages": [
2026-08-28T09:54:46.4102706Z         "impl",
2026-08-28T09:54:46.4102848Z         "unit"
2026-08-28T09:54:46.4103002Z       ],
2026-08-28T09:54:46.4103154Z       "stages": {
2026-08-28T09:54:46.4103307Z         "doc": {
2026-08-28T09:54:46.4103468Z           "complete": false,
2026-08-28T09:54:46.4103632Z           "evidence": []
2026-08-28T09:54:46.4103778Z         },
2026-08-28T09:54:46.4103930Z         "impl": {
2026-08-28T09:54:46.4104099Z           "complete": true,
2026-08-28T09:54:46.4104252Z           "evidence": [
2026-08-28T09:54:46.4104409Z             {
2026-08-28T09:54:46.4104610Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4104761Z               "line": 726
2026-08-28T09:54:46.4104901Z             },
2026-08-28T09:54:46.4105058Z             {
2026-08-28T09:54:46.4105259Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4105525Z               "line": 765
2026-08-28T09:54:46.4105678Z             },
2026-08-28T09:54:46.4105826Z             {
2026-08-28T09:54:46.4106030Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4106184Z               "line": 63
2026-08-28T09:54:46.4106330Z             },
2026-08-28T09:54:46.4106480Z             {
2026-08-28T09:54:46.4106678Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4106830Z               "line": 78
2026-08-28T09:54:46.4106976Z             },
2026-08-28T09:54:46.4107123Z             {
2026-08-28T09:54:46.4107305Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4107468Z               "line": 7897
2026-08-28T09:54:46.4107615Z             },
2026-08-28T09:54:46.4107758Z             {
2026-08-28T09:54:46.4107939Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4108097Z               "line": 8000
2026-08-28T09:54:46.4108249Z             }
2026-08-28T09:54:46.4108388Z           ]
2026-08-28T09:54:46.4108540Z         },
2026-08-28T09:54:46.4108683Z         "int": {
2026-08-28T09:54:46.4108845Z           "complete": false,
2026-08-28T09:54:46.4109090Z           "evidence": []
2026-08-28T09:54:46.4109245Z         },
2026-08-28T09:54:46.4109393Z         "unit": {
2026-08-28T09:54:46.4109552Z           "complete": true,
2026-08-28T09:54:46.4109720Z           "evidence": [
2026-08-28T09:54:46.4109867Z             {
2026-08-28T09:54:46.4110073Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4110229Z               "line": 371
2026-08-28T09:54:46.4110382Z             },
2026-08-28T09:54:46.4110534Z             {
2026-08-28T09:54:46.4110735Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4110891Z               "line": 382
2026-08-28T09:54:46.4111040Z             },
2026-08-28T09:54:46.4111192Z             {
2026-08-28T09:54:46.4111393Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4111675Z               "line": 408
2026-08-28T09:54:46.4111827Z             },
2026-08-28T09:54:46.4111975Z             {
2026-08-28T09:54:46.4112168Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4112327Z               "line": 434
2026-08-28T09:54:46.4112473Z             }
2026-08-28T09:54:46.4112623Z           ]
2026-08-28T09:54:46.4112779Z         }
2026-08-28T09:54:46.4112923Z       }
2026-08-28T09:54:46.4113066Z     },
2026-08-28T09:54:46.4113209Z     {
2026-08-28T09:54:46.4113366Z       "id": "REQ-DAEMON-7",
2026-08-28T09:54:46.4115504Z       "title": "`daemon run` is foreground-consistent on every platform: the invoking process IS the daemon, blocks until signalled, never auto-detaches or respawns into an invisible background task. The detached/de-elevated background behavior lives ONLY in `start`. Windows: an ELEVATED `daemon run` refuses with guidance (use `start`, or an unelevated shell) instead of respawning detached/de-elevated and vanishing (KH 5.7 preserved — it still never serves elevated).",
2026-08-28T09:54:46.4115674Z       "requiredStages": [
2026-08-28T09:54:46.4115829Z         "impl",
2026-08-28T09:54:46.4115975Z         "unit"
2026-08-28T09:54:46.4116124Z       ],
2026-08-28T09:54:46.4116271Z       "stages": {
2026-08-28T09:54:46.4116425Z         "doc": {
2026-08-28T09:54:46.4116581Z           "complete": false,
2026-08-28T09:54:46.4116739Z           "evidence": []
2026-08-28T09:54:46.4116890Z         },
2026-08-28T09:54:46.4117040Z         "impl": {
2026-08-28T09:54:46.4117200Z           "complete": true,
2026-08-28T09:54:46.4117357Z           "evidence": [
2026-08-28T09:54:46.4117503Z             {
2026-08-28T09:54:46.4117708Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4117870Z               "line": 784
2026-08-28T09:54:46.4118013Z             },
2026-08-28T09:54:46.4118166Z             {
2026-08-28T09:54:46.4118381Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.4118537Z               "line": 610
2026-08-28T09:54:46.4118814Z             },
2026-08-28T09:54:46.4119048Z             {
2026-08-28T09:54:46.4119253Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4119405Z               "line": 97
2026-08-28T09:54:46.4119553Z             },
2026-08-28T09:54:46.4119701Z             {
2026-08-28T09:54:46.4119885Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4120042Z               "line": 7818
2026-08-28T09:54:46.4120188Z             }
2026-08-28T09:54:46.4120337Z           ]
2026-08-28T09:54:46.4120484Z         },
2026-08-28T09:54:46.4120633Z         "int": {
2026-08-28T09:54:46.4120789Z           "complete": false,
2026-08-28T09:54:46.4120952Z           "evidence": []
2026-08-28T09:54:46.4121094Z         },
2026-08-28T09:54:46.4121248Z         "unit": {
2026-08-28T09:54:46.4121414Z           "complete": true,
2026-08-28T09:54:46.4121568Z           "evidence": [
2026-08-28T09:54:46.4121719Z             {
2026-08-28T09:54:46.4121920Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4122082Z               "line": 397
2026-08-28T09:54:46.4122226Z             },
2026-08-28T09:54:46.4122377Z             {
2026-08-28T09:54:46.4122555Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4122714Z               "line": 30683
2026-08-28T09:54:46.4122863Z             }
2026-08-28T09:54:46.4123006Z           ]
2026-08-28T09:54:46.4123154Z         }
2026-08-28T09:54:46.4123297Z       }
2026-08-28T09:54:46.4123450Z     },
2026-08-28T09:54:46.4123593Z     {
2026-08-28T09:54:46.4123749Z       "id": "REQ-DAEMON-8",
2026-08-28T09:54:46.4125229Z       "title": "Internal auto-start prefers the service: `ensure_running` (any spt command's implicit daemon start, REQ-DAEMON-3) routes through the service-aware start path — when a manager has a registered service it starts THAT, never a competing manual `spawn_detached` daemon that would fight the service for the socket.",
2026-08-28T09:54:46.4125507Z       "requiredStages": [
2026-08-28T09:54:46.4125658Z         "impl",
2026-08-28T09:54:46.4125811Z         "unit"
2026-08-28T09:54:46.4125958Z       ],
2026-08-28T09:54:46.4126111Z       "stages": {
2026-08-28T09:54:46.4126263Z         "doc": {
2026-08-28T09:54:46.4126422Z           "complete": false,
2026-08-28T09:54:46.4126583Z           "evidence": []
2026-08-28T09:54:46.4126732Z         },
2026-08-28T09:54:46.4126878Z         "impl": {
2026-08-28T09:54:46.4127042Z           "complete": true,
2026-08-28T09:54:46.4127198Z           "evidence": [
2026-08-28T09:54:46.4127347Z             {
2026-08-28T09:54:46.4127542Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4127700Z               "line": 629
2026-08-28T09:54:46.4127850Z             },
2026-08-28T09:54:46.4127994Z             {
2026-08-28T09:54:46.4128200Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4128359Z               "line": 64
2026-08-28T09:54:46.4128506Z             }
2026-08-28T09:54:46.4128659Z           ]
2026-08-28T09:54:46.4128811Z         },
2026-08-28T09:54:46.4129046Z         "int": {
2026-08-28T09:54:46.4129212Z           "complete": false,
2026-08-28T09:54:46.4129370Z           "evidence": []
2026-08-28T09:54:46.4129518Z         },
2026-08-28T09:54:46.4129669Z         "unit": {
2026-08-28T09:54:46.4129828Z           "complete": true,
2026-08-28T09:54:46.4129984Z           "evidence": [
2026-08-28T09:54:46.4130133Z             {
2026-08-28T09:54:46.4130337Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4130493Z               "line": 371
2026-08-28T09:54:46.4130644Z             },
2026-08-28T09:54:46.4130787Z             {
2026-08-28T09:54:46.4130992Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.4131150Z               "line": 408
2026-08-28T09:54:46.4131297Z             }
2026-08-28T09:54:46.4131450Z           ]
2026-08-28T09:54:46.4131598Z         }
2026-08-28T09:54:46.4131746Z       }
2026-08-28T09:54:46.4131898Z     },
2026-08-28T09:54:46.4132045Z     {
2026-08-28T09:54:46.4132317Z       "id": "REQ-DAEMON-9",
2026-08-28T09:54:46.4135804Z       "title": "Net-bind boot-race resilience: a daemon that comes up net-less (NetHost::start failed — e.g. the systemd unit autostarted before the network/DNS stack was ready, `Failed to create an address lookup service`) must SELF-HEAL — retry the net bring-up in the background with capped backoff and, on success, attach net to the broker + spawn the dispatcher/peer-pump (which today are gated on `net_up` at boot and so never start, leaving the node silently unreachable until a manual restart — kitsubito 2026-06-08). Status surfaces the net-less state honestly (a net-less broker renders as 'no connection', not only a pump-STALLED line with a bogus pre-boot heartbeat age). The installer's autostart unit waits for the network (`Wants=/After=network-online.target`) as belt-and-suspenders.",
2026-08-28T09:54:46.4135975Z       "requiredStages": [
2026-08-28T09:54:46.4136142Z         "impl",
2026-08-28T09:54:46.4136290Z         "unit"
2026-08-28T09:54:46.4136447Z       ],
2026-08-28T09:54:46.4136596Z       "stages": {
2026-08-28T09:54:46.4136747Z         "doc": {
2026-08-28T09:54:46.4136906Z           "complete": false,
2026-08-28T09:54:46.4137062Z           "evidence": []
2026-08-28T09:54:46.4137268Z         },
2026-08-28T09:54:46.4137425Z         "impl": {
2026-08-28T09:54:46.4137593Z           "complete": true,
2026-08-28T09:54:46.4137749Z           "evidence": [
2026-08-28T09:54:46.4137902Z             {
2026-08-28T09:54:46.4138112Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.4138279Z               "line": 386
2026-08-28T09:54:46.4138420Z             },
2026-08-28T09:54:46.4138572Z             {
2026-08-28T09:54:46.4138775Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4138934Z               "line": 5414
2026-08-28T09:54:46.4139177Z             },
2026-08-28T09:54:46.4139319Z             {
2026-08-28T09:54:46.4139639Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4139801Z               "line": 241
2026-08-28T09:54:46.4139944Z             },
2026-08-28T09:54:46.4140102Z             {
2026-08-28T09:54:46.4140296Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4140450Z               "line": 475
2026-08-28T09:54:46.4140592Z             },
2026-08-28T09:54:46.4140741Z             {
2026-08-28T09:54:46.4140935Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4141092Z               "line": 524
2026-08-28T09:54:46.4141237Z             },
2026-08-28T09:54:46.4141385Z             {
2026-08-28T09:54:46.4141575Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4141730Z               "line": 8094
2026-08-28T09:54:46.4141880Z             }
2026-08-28T09:54:46.4142025Z           ]
2026-08-28T09:54:46.4142177Z         },
2026-08-28T09:54:46.4142320Z         "int": {
2026-08-28T09:54:46.4142487Z           "complete": false,
2026-08-28T09:54:46.4142640Z           "evidence": []
2026-08-28T09:54:46.4142797Z         },
2026-08-28T09:54:46.4142960Z         "unit": {
2026-08-28T09:54:46.4143145Z           "complete": true,
2026-08-28T09:54:46.4143303Z           "evidence": [
2026-08-28T09:54:46.4143449Z             {
2026-08-28T09:54:46.4143647Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4143802Z               "line": 3089
2026-08-28T09:54:46.4143950Z             },
2026-08-28T09:54:46.4144097Z             {
2026-08-28T09:54:46.4144260Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4144417Z               "line": 37891
2026-08-28T09:54:46.4144565Z             }
2026-08-28T09:54:46.4144732Z           ]
2026-08-28T09:54:46.4144875Z         }
2026-08-28T09:54:46.4145027Z       }
2026-08-28T09:54:46.4145175Z     },
2026-08-28T09:54:46.4145318Z     {
2026-08-28T09:54:46.4145505Z       "id": "REQ-DAEMON-BITS-AMBIGUITY",
2026-08-28T09:54:46.4170680Z       "title": "SEED (inactive, RCA-first — do NOT close on agreement): nothing on a node surfaces WHICH BITS ARE SERVING, and the same silent wrong-state shape bit twice in one day (2026-07-25). Case 1 (adapter-side echo): a post-reboot ensure race left a dev-build alchemy Hub Daemon serving release shells — version skew visible only by manually comparing process image paths. Case 2 (core, field-measured by flynn): TWO spt daemons resident with live brains on one node — the installed main daemon (owning ALL sockets: the 5474 listeners and every established connection, single home_tag pipe family) and an orphaned scratchpad-built daemon (auto-started into the node by ensure_running from a stray dev-binary invocation at 16:18, holding zero sockets, resident for hours) — while `spt --version` on any binary file answers nothing about which process is answering. Measured sharp edges to carry into the RCA: (a) exe path and resolved HOME are independent — the orphan ran scratchpad bits against the DEFAULT home, so 'where the binary lives' predicts nothing about 'whose state it mutates'; (b) the brain.ready breadcrumb is ONE FILE PER HOME, LAST-WRITER-WINS, keyed by generation — with two brains in one home the stamp can be written by the daemon you are NOT gating on, so any readiness/identity gate that trusts it must first establish single-writer; (c) the breadcrumb's exe_hash (SHA-256 of resident bytes captured at process start) is the RIGHT discriminator — image path answers what is on disk, not which bits are answering — but only under (b)'s single-writer precondition; (d) reap order matters: killing the breadcrumb's last writer leaves the file describing a dead brain's bits until the survivor's next ready write, so any bits-gate readback must be re-established AFTER a reap, never carried across one. Open RCA questions before any fix is designed: why did the second daemon's cold-start not refuse against the live singleton (socket-bind loss is survivable-and-resident today — is that the right posture?); what should ensure_running check BEYOND socket liveness (bits identity?); where does 'which bits are serving' surface to an operator (endpoint list? daemon status verb?). Kin: the NEVER-SEALING-OBSERVABILITY candidate (same shape — silent wrong-state only a human staring at the right field catches). Proposed by todlando (his lane), relayed by flynn with the socket-ownership + exe_hash measurements; seeded by doyle. The orphan pair was reaped by path 2026-07-25 (verified by exact ExecutablePath, supervisor before brain); the reap resolved the instance, not the class. RCA POINTS FROM THE PROPOSING LANE (todlando, extended into THIS record 2026-07-26 rather than minted as a second seed): (1) ORDERING — 'do both pids resolve the same spt_home?' is the FIRST question, not a co-equal fact, because every other discriminator is conditioned on its answer: brain.ready is `<spt_home>/brain.ready`, ONE path, single-writer BY DESIGN, so a shared home makes the breadcrumb a contended file and `generation` — the readiness gate's key, which exists precisely to prevent false promotion — becomes satisfiable by the stamp of the daemon you are NOT gating on. Prior art on this node: default-home `home_tag` sockets already cross-talk the live daemon's hubs, so shared-home cross-talk is an established class here, not a hypothetical. (2) GATE ON RESIDENT BYTES, NEVER ON IMAGE PATH — AND TREAT ABSENCE AS UNPROVEN. Path answers 'what is on disk where I asked'; with two daemons on different bits the only question that matters is 'which bits answered me'. Path is the exact field that has already lied in the field: KH 6.11 — the broker resolves `current_exe()` PER SPAWN (`crates/spt-daemon/src/brainproc.rs`), which on Linux is inode-tracking, so an `update apply` rename made the respawn land on the OLD bytes while readiness passed and the trial recorded `applied:N` (kitsubito v0.4.1); `exe_hash` (lowercase-hex SHA-256 of resident bytes, captured ONCE at process start — `current_exe_hash`, `crates/spt-daemon/src/brainproc.rs:402`) exists BECAUSE the path-derived belief was provably wrong, and the enlyzeam 0.3.0-under-0.3.2-on-disk case is the same record/reality divergence one layer up. Constraint any observability gate must inherit and must NOT weaken: `exe_hash` is ADDITIVE/BEST-EFFORT — omitted when the self-read fails, `None` on any pre-D7 stamp — and today's `bytes_gate` deliberately degrades an absent hash to readiness-only promotion with a loud `PROMOTE_BYTES_UNVERIFIED` (N-1 compat, `brainproc.rs:1042`). An operator-facing 'which bits are serving' answer must degrade the OTHER WAY: absent hash reads UNPROVEN — never PASS, and never a silent fall back to image path. A compat degrade that is correct for ACCEPTING an update is wrong for ASSERTING an identity. (3) SERVICE OWNERSHIP IS DECIDED BY SOCKET/HUB BINDING, NOT BY START TIME. Case 2 measured the instance (main holds all 5474 listeners + every established connection; the scratchpad daemon holds zero sockets and was the LATER start) but the INFERENCE RULE is what must survive the instance: a later start is not thereby the loser and an earlier start is not thereby the server — 'who is serving' is answered by who owns the binding, so any gate, reap, or diagnostic that ranks candidates by pid or start time is guessing at the one fact it is supposed to establish. (4) REAP-ORDER SYMMETRY — (d)'s re-establish-the-gate-AFTER-the-reap rule holds identically on the REVERT path; a bits-gate readback may never be carried across a reap or a rollback in either direction. (5) SINGLE RECORD — this seed is the one home for the class (premature-closure guard: convergent reads are not a root cause, and a green re-read after a reap assigns owner without closing); the socket-bind-loss posture question stays OPEN inside it, and the orphan-pair instance stays closed.",
2026-08-28T09:54:46.4171286Z       "requiredStages": [],
2026-08-28T09:54:46.4171443Z       "stages": {
2026-08-28T09:54:46.4171596Z         "doc": {
2026-08-28T09:54:46.4171763Z           "complete": false,
2026-08-28T09:54:46.4171924Z           "evidence": []
2026-08-28T09:54:46.4172064Z         },
2026-08-28T09:54:46.4172229Z         "impl": {
2026-08-28T09:54:46.4172393Z           "complete": false,
2026-08-28T09:54:46.4172554Z           "evidence": []
2026-08-28T09:54:46.4172700Z         },
2026-08-28T09:54:46.4172852Z         "int": {
2026-08-28T09:54:46.4173013Z           "complete": false,
2026-08-28T09:54:46.4173167Z           "evidence": []
2026-08-28T09:54:46.4173318Z         },
2026-08-28T09:54:46.4173462Z         "unit": {
2026-08-28T09:54:46.4173623Z           "complete": false,
2026-08-28T09:54:46.4173781Z           "evidence": []
2026-08-28T09:54:46.4173933Z         }
2026-08-28T09:54:46.4174077Z       }
2026-08-28T09:54:46.4174229Z     },
2026-08-28T09:54:46.4174378Z     {
2026-08-28T09:54:46.4174544Z       "id": "REQ-DAEMON-REFRESH",
2026-08-28T09:54:46.4179623Z       "title": "THE-FORKENING W4 (operator add 2026-07-14): `spt daemon refresh` — restart the daemon BRAIN without a binary swap and WITHOUT touching the broker: exactly the apply_staged brain-cycle path (brain stop -> respawn -> readiness trial -> promote, incl. the trial-drain drive REQ-UPDATE-TRIAL-DRAIN-DRIVE and viewer-only resume REQ-BRAIN-RESUME-NO-CONTROL-STEAL) minus the swap. Recovery verb for wedged brain-held state (field motivator 2026-07-14: endpoint bringup broken on a live daemon + deployah down — today's only remedy is a full daemon bounce that kills every PTY). Broker + PTYs survive by construction (handoff invariant). Failure = the existing trial rollback semantics (old brain resumes; refresh reports loud). Gate: unit — verb routes the brain-cycle without staging/swap preconditions; int — refresh on a live daemon with a hosted PTY: brain generation changes, PTY survives, endpoint stays attached; doc — daemon docs name refresh next to stop/start. Kin apply_staged (the path it reuses), REQ-UPDATE-TRIAL-DRAIN-DRIVE, REQ-BRAIN-RESUME-NO-CONTROL-STEAL.",
2026-08-28T09:54:46.4179947Z       "requiredStages": [
2026-08-28T09:54:46.4180095Z         "doc",
2026-08-28T09:54:46.4180246Z         "impl",
2026-08-28T09:54:46.4180401Z         "unit",
2026-08-28T09:54:46.4180556Z         "int"
2026-08-28T09:54:46.4180709Z       ],
2026-08-28T09:54:46.4180859Z       "stages": {
2026-08-28T09:54:46.4181006Z         "doc": {
2026-08-28T09:54:46.4181170Z           "complete": true,
2026-08-28T09:54:46.4181335Z           "evidence": [
2026-08-28T09:54:46.4181479Z             {
2026-08-28T09:54:46.4181655Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.4181808Z               "line": 684
2026-08-28T09:54:46.4181960Z             }
2026-08-28T09:54:46.4182113Z           ]
2026-08-28T09:54:46.4182251Z         },
2026-08-28T09:54:46.4182404Z         "impl": {
2026-08-28T09:54:46.4182561Z           "complete": true,
2026-08-28T09:54:46.4182724Z           "evidence": [
2026-08-28T09:54:46.4182876Z             {
2026-08-28T09:54:46.4183090Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:46.4183246Z               "line": 363
2026-08-28T09:54:46.4183403Z             },
2026-08-28T09:54:46.4183554Z             {
2026-08-28T09:54:46.4183845Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4184003Z               "line": 2484
2026-08-28T09:54:46.4184155Z             },
2026-08-28T09:54:46.4184303Z             {
2026-08-28T09:54:46.4184479Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4184637Z               "line": 8058
2026-08-28T09:54:46.4184779Z             }
2026-08-28T09:54:46.4184928Z           ]
2026-08-28T09:54:46.4185076Z         },
2026-08-28T09:54:46.4185220Z         "int": {
2026-08-28T09:54:46.4185385Z           "complete": true,
2026-08-28T09:54:46.4185544Z           "evidence": [
2026-08-28T09:54:46.4185690Z             {
2026-08-28T09:54:46.4185901Z               "path": "crates/spt/tests/daemon_refresh_e2e.rs",
2026-08-28T09:54:46.4186047Z               "line": 14
2026-08-28T09:54:46.4186209Z             }
2026-08-28T09:54:46.4186385Z           ]
2026-08-28T09:54:46.4186534Z         },
2026-08-28T09:54:46.4186676Z         "unit": {
2026-08-28T09:54:46.4186839Z           "complete": true,
2026-08-28T09:54:46.4187001Z           "evidence": [
2026-08-28T09:54:46.4187149Z             {
2026-08-28T09:54:46.4187353Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:46.4187498Z               "line": 831
2026-08-28T09:54:46.4187673Z             },
2026-08-28T09:54:46.4187831Z             {
2026-08-28T09:54:46.4188016Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4188156Z               "line": 25762
2026-08-28T09:54:46.4188311Z             }
2026-08-28T09:54:46.4188473Z           ]
2026-08-28T09:54:46.4188623Z         }
2026-08-28T09:54:46.4188771Z       }
2026-08-28T09:54:46.4188919Z     },
2026-08-28T09:54:46.4189143Z     {
2026-08-28T09:54:46.4189392Z       "id": "REQ-DAEMON-RESTART-SELF-INTERRUPTION",
2026-08-28T09:54:46.4199536Z       "title": "SEED (inactive — operator-workflow trap, field-paid 2026-07-25): an spt-hosted context CANNOT restart the daemon, because the restart's STOP phase tears down the very context running the restart command — the START half never executes and the daemon stays down until an operator starts it by hand. Field case (this node, 17:47–17:50): an agent-kicked restart's stop-begin swept the initiating context and everything sharing its Job Object (flynn's shell + the relay-hopped alchemy Hub, cross-context job members — see REQ-SHELL-CLI-SPAWN-JOB-EXPOSURE's field-firing record); the broker drained ~2m10s to final exit (stderr ends abruptly at 17:50:05.8 amid routine traffic, no shutdown markers); the START was already dead; the operator manually started whatever binary was installed (v0.42.0), with no channel conveying which bits the restarting agent had intended — binary choice silently transferred to whoever brings the daemon up (kin: REQ-DAEMON-BITS-AMBIGUITY, the same which-bits-serve blindness). CONSEQUENCES: (a) every RESTART-REQUIRED apply (broker update, seed-skew restart per hazard 7.9) is operator-only today, and nothing documents that; (b) stop-begin kills bound shells with `close_shell` unrun, so even the GRACEFUL stop path manufactures stale-online shell records on every restart — healed at the read gates by REQ-HAZARD-SHELL-STALE-ONLINE's derivation, but manufactured nonetheless, and on pre-derivation binaries the records lie until the next bind; (c) a restart initiated from inside the system it restarts is a self-interruption with no error surface — the initiator dies believing the restart is in flight. Option space at activation: (1) daemon-owned restart verb — the OUTGOING broker spawns its successor job-neutrally (the 7.10 WMI→schtasks→breakaway ladder already exists) before exiting, so the caller only requests and its death is irrelevant; (2) a detached job-neutral restart helper (same detached_no_inherit + ladder) that survives the caller; (3) status quo + the public contract documents restart as operator-only. Whichever wins must also answer where the INTENDED-BITS declaration lives so a manual or automated starter picks the right binary (the (c)/BITS-AMBIGUITY joint).",
2026-08-28T09:54:46.4199966Z       "requiredStages": [],
2026-08-28T09:54:46.4200128Z       "stages": {
2026-08-28T09:54:46.4200276Z         "doc": {
2026-08-28T09:54:46.4200447Z           "complete": false,
2026-08-28T09:54:46.4200605Z           "evidence": []
2026-08-28T09:54:46.4200752Z         },
2026-08-28T09:54:46.4200906Z         "impl": {
2026-08-28T09:54:46.4201072Z           "complete": false,
2026-08-28T09:54:46.4201240Z           "evidence": []
2026-08-28T09:54:46.4201396Z         },
2026-08-28T09:54:46.4201554Z         "int": {
2026-08-28T09:54:46.4201709Z           "complete": false,
2026-08-28T09:54:46.4201876Z           "evidence": []
2026-08-28T09:54:46.4202022Z         },
2026-08-28T09:54:46.4202170Z         "unit": {
2026-08-28T09:54:46.4202328Z           "complete": false,
2026-08-28T09:54:46.4202490Z           "evidence": []
2026-08-28T09:54:46.4202633Z         }
2026-08-28T09:54:46.4202780Z       }
2026-08-28T09:54:46.4202928Z     },
2026-08-28T09:54:46.4203076Z     {
2026-08-28T09:54:46.4203266Z       "id": "REQ-DAEMON-SERVICE-INSTALL",
2026-08-28T09:54:46.4206462Z       "title": "F-038 RIDER (flynn nice-to-have, QUEUED not activated): a documented OS-service registration recipe or `spt daemon install-service` verb so the daemon itself survives box reboot (flynn's box runs managed_by:null = daemon-at-boot unprovisioned; kitsubito's hand-rolled systemd --user unit = prior art). NOT in MSG-IDENTITY scope — REQ-ENDPOINT-AUTOSTART covers the daemon-start-to-endpoint leg; the boot-to-daemon leg stays interim (logon scheduled task / systemd unit). Activate at an infra-provisioning milestone; shape (recipe doc vs verb) ruled then. Kin [[daemon-service-detection-gotcha]] (global-OS-state detection blind on dev box — a verb must not regress that), [[kitsubito-linux-rig]].",
2026-08-28T09:54:46.4209725Z       "requiredStages": [],
2026-08-28T09:54:46.4209887Z       "stages": {
2026-08-28T09:54:46.4210040Z         "doc": {
2026-08-28T09:54:46.4210211Z           "complete": false,
2026-08-28T09:54:46.4210378Z           "evidence": []
2026-08-28T09:54:46.4210531Z         },
2026-08-28T09:54:46.4210850Z         "impl": {
2026-08-28T09:54:46.4211017Z           "complete": false,
2026-08-28T09:54:46.4211175Z           "evidence": []
2026-08-28T09:54:46.4211317Z         },
2026-08-28T09:54:46.4211466Z         "int": {
2026-08-28T09:54:46.4211622Z           "complete": false,
2026-08-28T09:54:46.4211781Z           "evidence": []
2026-08-28T09:54:46.4211932Z         },
2026-08-28T09:54:46.4212081Z         "unit": {
2026-08-28T09:54:46.4212247Z           "complete": false,
2026-08-28T09:54:46.4212398Z           "evidence": []
2026-08-28T09:54:46.4212554Z         }
2026-08-28T09:54:46.4212696Z       }
2026-08-28T09:54:46.4212840Z     },
2026-08-28T09:54:46.4212982Z     {
2026-08-28T09:54:46.4213169Z       "id": "REQ-DAEMON-STATUS-JSON-TRUTH",
2026-08-28T09:54:46.4215597Z       "title": "D2 (F028, perri F-d): `daemon status --json` truth drift. managed_by/managed_active read null in JSON while the HUMAN view says 'managed-by: manual — at-logon task registered' (the two surfaces disagree); and pump staleness (the STALLED diagnosis, B5) is NOT computable from JSON — only a raw pump_heartbeat_ms is emitted, no derived staleness/stalled field. FIX: JSON managed_by/active match the human render, and add a derived pump-staleness/stalled field so B5's condition is machine-observable. See triage D2.",
2026-08-28T09:54:46.4215783Z       "requiredStages": [],
2026-08-28T09:54:46.4215946Z       "stages": {
2026-08-28T09:54:46.4216093Z         "doc": {
2026-08-28T09:54:46.4216256Z           "complete": false,
2026-08-28T09:54:46.4216413Z           "evidence": []
2026-08-28T09:54:46.4216556Z         },
2026-08-28T09:54:46.4216718Z         "impl": {
2026-08-28T09:54:46.4216881Z           "complete": false,
2026-08-28T09:54:46.4217041Z           "evidence": []
2026-08-28T09:54:46.4217186Z         },
2026-08-28T09:54:46.4217332Z         "int": {
2026-08-28T09:54:46.4217491Z           "complete": false,
2026-08-28T09:54:46.4217647Z           "evidence": []
2026-08-28T09:54:46.4217895Z         },
2026-08-28T09:54:46.4218051Z         "unit": {
2026-08-28T09:54:46.4218219Z           "complete": false,
2026-08-28T09:54:46.4218371Z           "evidence": []
2026-08-28T09:54:46.4218525Z         }
2026-08-28T09:54:46.4218671Z       }
2026-08-28T09:54:46.4218820Z     },
2026-08-28T09:54:46.4219038Z     {
2026-08-28T09:54:46.4219230Z       "id": "REQ-DAEMON-STDERR-PERSIST",
2026-08-28T09:54:46.4221148Z       "title": "W3 (LIFECYCLE-TRUTH, observability): broker + brain stderr tee to a rotating size-capped file under SPT_HOME (e.g. 2x5MB), stamped per generation. ROOT: detached daemon nulls stdio -> the 2026-07-06/07 incident window left ZERO logs (both RCAs ran blind; rigs had to recreate everything). KNOWN-HAZARDS note: never inherit handles (REQ-HAZARD-DETACHED-DAEMON-STDIO) — open the file in-process, don't pipe.",
2026-08-28T09:54:46.4221319Z       "requiredStages": [
2026-08-28T09:54:46.4221472Z         "impl",
2026-08-28T09:54:46.4221615Z         "unit"
2026-08-28T09:54:46.4221768Z       ],
2026-08-28T09:54:46.4221920Z       "stages": {
2026-08-28T09:54:46.4222074Z         "doc": {
2026-08-28T09:54:46.4222235Z           "complete": false,
2026-08-28T09:54:46.4222393Z           "evidence": []
2026-08-28T09:54:46.4222545Z         },
2026-08-28T09:54:46.4222689Z         "impl": {
2026-08-28T09:54:46.4222849Z           "complete": true,
2026-08-28T09:54:46.4223006Z           "evidence": [
2026-08-28T09:54:46.4223152Z             {
2026-08-28T09:54:46.4223363Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.4223518Z               "line": 199
2026-08-28T09:54:46.4223663Z             },
2026-08-28T09:54:46.4223815Z             {
2026-08-28T09:54:46.4224025Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4224181Z               "line": 23
2026-08-28T09:54:46.4224330Z             },
2026-08-28T09:54:46.4224472Z             {
2026-08-28T09:54:46.4224673Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4224830Z               "line": 37
2026-08-28T09:54:46.4225102Z             },
2026-08-28T09:54:46.4225246Z             {
2026-08-28T09:54:46.4225458Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4225611Z               "line": 61
2026-08-28T09:54:46.4225756Z             },
2026-08-28T09:54:46.4225900Z             {
2026-08-28T09:54:46.4226104Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4226258Z               "line": 71
2026-08-28T09:54:46.4226405Z             },
2026-08-28T09:54:46.4226554Z             {
2026-08-28T09:54:46.4227096Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4227254Z               "line": 141
2026-08-28T09:54:46.4227402Z             },
2026-08-28T09:54:46.4227541Z             {
2026-08-28T09:54:46.4227726Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4227879Z               "line": 7835
2026-08-28T09:54:46.4228032Z             }
2026-08-28T09:54:46.4228213Z           ]
2026-08-28T09:54:46.4228363Z         },
2026-08-28T09:54:46.4228513Z         "int": {
2026-08-28T09:54:46.4228669Z           "complete": true,
2026-08-28T09:54:46.4228827Z           "evidence": [
2026-08-28T09:54:46.4229061Z             {
2026-08-28T09:54:46.4229260Z               "path": "crates/spt/tests/common/mod.rs",
2026-08-28T09:54:46.4229414Z               "line": 55
2026-08-28T09:54:46.4229565Z             },
2026-08-28T09:54:46.4229705Z             {
2026-08-28T09:54:46.4229937Z               "path": "crates/spt/tests/projindex_reader_e2e.rs",
2026-08-28T09:54:46.4230100Z               "line": 283
2026-08-28T09:54:46.4230242Z             }
2026-08-28T09:54:46.4230401Z           ]
2026-08-28T09:54:46.4230542Z         },
2026-08-28T09:54:46.4230688Z         "unit": {
2026-08-28T09:54:46.4230843Z           "complete": true,
2026-08-28T09:54:46.4231000Z           "evidence": [
2026-08-28T09:54:46.4231140Z             {
2026-08-28T09:54:46.4231483Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4231789Z               "line": 173
2026-08-28T09:54:46.4232008Z             },
2026-08-28T09:54:46.4232146Z             {
2026-08-28T09:54:46.4232356Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4232509Z               "line": 184
2026-08-28T09:54:46.4232652Z             },
2026-08-28T09:54:46.4232795Z             {
2026-08-28T09:54:46.4233009Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4233173Z               "line": 209
2026-08-28T09:54:46.4233348Z             },
2026-08-28T09:54:46.4233495Z             {
2026-08-28T09:54:46.4233703Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.4233850Z               "line": 222
2026-08-28T09:54:46.4234003Z             }
2026-08-28T09:54:46.4234146Z           ]
2026-08-28T09:54:46.4234289Z         }
2026-08-28T09:54:46.4234431Z       }
2026-08-28T09:54:46.4234575Z     },
2026-08-28T09:54:46.4234723Z     {
2026-08-28T09:54:46.4234928Z       "id": "REQ-DAEMON-STOP-LIVE-SESSION-WARN",
2026-08-28T09:54:46.4235739Z       "title": "W3 (LIFECYCLE-TRUTH, promoted old follow-wave seed): `daemon stop` with live hosted sessions warns + requires --force (or names the sessions it will kill) instead of silently killing them.",
2026-08-28T09:54:46.4235901Z       "requiredStages": [
2026-08-28T09:54:46.4236056Z         "impl",
2026-08-28T09:54:46.4236199Z         "unit"
2026-08-28T09:54:46.4236350Z       ],
2026-08-28T09:54:46.4236503Z       "stages": {
2026-08-28T09:54:46.4236655Z         "doc": {
2026-08-28T09:54:46.4236823Z           "complete": false,
2026-08-28T09:54:46.4236979Z           "evidence": []
2026-08-28T09:54:46.4237128Z         },
2026-08-28T09:54:46.4237323Z         "impl": {
2026-08-28T09:54:46.4237485Z           "complete": true,
2026-08-28T09:54:46.4237633Z           "evidence": [
2026-08-28T09:54:46.4237781Z             {
2026-08-28T09:54:46.4237972Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4238129Z               "line": 7927
2026-08-28T09:54:46.4238272Z             },
2026-08-28T09:54:46.4238530Z             {
2026-08-28T09:54:46.4238712Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4238867Z               "line": 7980
2026-08-28T09:54:46.4239097Z             },
2026-08-28T09:54:46.4239252Z             {
2026-08-28T09:54:46.4239435Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4239597Z               "line": 8002
2026-08-28T09:54:46.4239740Z             }
2026-08-28T09:54:46.4239897Z           ]
2026-08-28T09:54:46.4240054Z         },
2026-08-28T09:54:46.4240207Z         "int": {
2026-08-28T09:54:46.4240369Z           "complete": true,
2026-08-28T09:54:46.4240531Z           "evidence": [
2026-08-28T09:54:46.4240679Z             {
2026-08-28T09:54:46.4240899Z               "path": "crates/spt/tests/attach_wedge_e2e.rs",
2026-08-28T09:54:46.4241060Z               "line": 254
2026-08-28T09:54:46.4241212Z             }
2026-08-28T09:54:46.4241353Z           ]
2026-08-28T09:54:46.4241510Z         },
2026-08-28T09:54:46.4241663Z         "unit": {
2026-08-28T09:54:46.4241825Z           "complete": true,
2026-08-28T09:54:46.4241988Z           "evidence": [
2026-08-28T09:54:46.4242134Z             {
2026-08-28T09:54:46.4242316Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4242469Z               "line": 37765
2026-08-28T09:54:46.4242616Z             }
2026-08-28T09:54:46.4242764Z           ]
2026-08-28T09:54:46.4242907Z         }
2026-08-28T09:54:46.4243060Z       }
2026-08-28T09:54:46.4243208Z     },
2026-08-28T09:54:46.4243355Z     {
2026-08-28T09:54:46.4243537Z       "id": "REQ-DIAL-FAILED-ADDR-MEMORY",
2026-08-28T09:54:46.4249517Z       "title": "WAN-TRUTH #40 F2/F3 mechanism: the node remembers the exact ADDRESSES its dials just failed on — never the peer, never the chain leg (doyle ruling 2026-07-31, amending the RCA's per-leg/per-peer wording, which would have deleted the strand-heal guarantee REQ-PEER-ROUTE-CHAIN was built to provide). The record is keyed on the full address actually dialed, compared by exact equality; it is TTL-bounded and cleared by a successful dial or validation of that address, so a transient failure can never permanently ban an address that works. It is RAM-only and node-LOCAL: a restart forfeits it (one wasted dial, re-marked on the next failure), no new persisted store is introduced, and the fact never rides the gossip/roster DTO in any form. It is BUILT at the dial site (which owns the address that was dialed) and consumed by its two leaves — REQ-ROUTE-CHAIN-FAILED-ADDR-SKIP and REQ-RECONCILE-FAILED-ADDR-REFUSE — through ONE shared helper, so neither consumer re-derives the equality. Gate: impl — the type, its construction at the dial site, the clear-on-success, the TTL, and the carry to the pump-side consumer over the existing local presence field; unit — an exact address matches and a differing address does not, a successful dial clears the record, an expired record stops matching, and the type carries no serialization onto any gossip DTO.",
2026-08-28T09:54:46.4249808Z       "requiredStages": [
2026-08-28T09:54:46.4249976Z         "impl",
2026-08-28T09:54:46.4250137Z         "unit"
2026-08-28T09:54:46.4250295Z       ],
2026-08-28T09:54:46.4250443Z       "stages": {
2026-08-28T09:54:46.4250591Z         "doc": {
2026-08-28T09:54:46.4250752Z           "complete": false,
2026-08-28T09:54:46.4250906Z           "evidence": []
2026-08-28T09:54:46.4251053Z         },
2026-08-28T09:54:46.4251202Z         "impl": {
2026-08-28T09:54:46.4251358Z           "complete": true,
2026-08-28T09:54:46.4251512Z           "evidence": [
2026-08-28T09:54:46.4251667Z             {
2026-08-28T09:54:46.4251881Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4252036Z               "line": 73
2026-08-28T09:54:46.4252190Z             },
2026-08-28T09:54:46.4252332Z             {
2026-08-28T09:54:46.4252543Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4252699Z               "line": 90
2026-08-28T09:54:46.4252847Z             },
2026-08-28T09:54:46.4253186Z             {
2026-08-28T09:54:46.4253401Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4253544Z               "line": 100
2026-08-28T09:54:46.4253692Z             },
2026-08-28T09:54:46.4253834Z             {
2026-08-28T09:54:46.4254031Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4254192Z               "line": 109
2026-08-28T09:54:46.4254370Z             },
2026-08-28T09:54:46.4254515Z             {
2026-08-28T09:54:46.4254706Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4254861Z               "line": 1696
2026-08-28T09:54:46.4255004Z             },
2026-08-28T09:54:46.4255156Z             {
2026-08-28T09:54:46.4255362Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4255538Z               "line": 698
2026-08-28T09:54:46.4255710Z             },
2026-08-28T09:54:46.4255848Z             {
2026-08-28T09:54:46.4256053Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4256210Z               "line": 1598
2026-08-28T09:54:46.4256358Z             },
2026-08-28T09:54:46.4256506Z             {
2026-08-28T09:54:46.4256701Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4256855Z               "line": 1636
2026-08-28T09:54:46.4256997Z             },
2026-08-28T09:54:46.4257143Z             {
2026-08-28T09:54:46.4257338Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4257489Z               "line": 1650
2026-08-28T09:54:46.4257634Z             },
2026-08-28T09:54:46.4257784Z             {
2026-08-28T09:54:46.4257996Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4258148Z               "line": 1048
2026-08-28T09:54:46.4258296Z             },
2026-08-28T09:54:46.4258438Z             {
2026-08-28T09:54:46.4258643Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4258873Z               "line": 1102
2026-08-28T09:54:46.4259097Z             }
2026-08-28T09:54:46.4259244Z           ]
2026-08-28T09:54:46.4259387Z         },
2026-08-28T09:54:46.4259536Z         "int": {
2026-08-28T09:54:46.4259697Z           "complete": false,
2026-08-28T09:54:46.4259855Z           "evidence": []
2026-08-28T09:54:46.4260006Z         },
2026-08-28T09:54:46.4260150Z         "unit": {
2026-08-28T09:54:46.4260311Z           "complete": true,
2026-08-28T09:54:46.4260465Z           "evidence": [
2026-08-28T09:54:46.4260607Z             {
2026-08-28T09:54:46.4260817Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4260969Z               "line": 185
2026-08-28T09:54:46.4261113Z             },
2026-08-28T09:54:46.4261260Z             {
2026-08-28T09:54:46.4261466Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4261627Z               "line": 200
2026-08-28T09:54:46.4261771Z             },
2026-08-28T09:54:46.4261914Z             {
2026-08-28T09:54:46.4262119Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4262275Z               "line": 210
2026-08-28T09:54:46.4262427Z             },
2026-08-28T09:54:46.4262563Z             {
2026-08-28T09:54:46.4262770Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4262916Z               "line": 223
2026-08-28T09:54:46.4263083Z             },
2026-08-28T09:54:46.4263254Z             {
2026-08-28T09:54:46.4263455Z               "path": "crates/spt-daemon/src/failedaddr.rs",
2026-08-28T09:54:46.4263613Z               "line": 244
2026-08-28T09:54:46.4263756Z             }
2026-08-28T09:54:46.4263903Z           ]
2026-08-28T09:54:46.4264046Z         }
2026-08-28T09:54:46.4264194Z       }
2026-08-28T09:54:46.4264338Z     },
2026-08-28T09:54:46.4264480Z     {
2026-08-28T09:54:46.4264667Z       "id": "REQ-DIAL-ROUTE-LEG-ATTRIBUTION",
2026-08-28T09:54:46.4271420Z       "title": "WAN-TRUTH #41 leg 1: every submitted dial says WHAT address it dialed and WHICH leg of the route chain produced it, at submit and again on failure. The 2026-07-30 cross-site RCA had to infer the dialed address from timing alone, which is what made a days-long partial outage expensive to diagnose rather than merely bad. The attribution is a VERDICT type over the chain, not a free-text log fragment: one token per outcome, single-sourced so the log sites and the tests that match them can never spell it differently. Critically, the post-lane-1 skip is its own verdict and never collapses into plain discovery: after REQ-ROUTE-CHAIN-FAILED-ADDR-SKIP a node that HOLDS a validated roster address can still fall to discovery because that exact address is the one its last dial failed on, and reporting that as discovery asserts the opposite diagnosis -- that this node has no roster address for the peer -- which would poison the #42/#49 relay RCA this observability exists to serve. The unresolved outcome splits the same way. This requirement owns only the REPORTING; REQ-PEER-ROUTE-CHAIN continues to own the chain order and this must never change an outcome. Gate: impl -- the leg verdict type and its single-source token, returned by the resolver and logged at the submit site, at the submit-refused failure, at the no-route failure, and carried to the drained DIAL_FAILED line (unrecorded means unknown, never a guess); unit -- each chain leg resolves to its own verdict on the existing chain rig, the just-failed roster address resolves to the SKIP verdict while a differing roster address still resolves to the roster verdict, and the unresolved cases split the same way.",
2026-08-28T09:54:46.4271711Z       "requiredStages": [
2026-08-28T09:54:46.4271868Z         "impl",
2026-08-28T09:54:46.4272012Z         "unit",
2026-08-28T09:54:46.4272159Z         "int"
2026-08-28T09:54:46.4272303Z       ],
2026-08-28T09:54:46.4272445Z       "stages": {
2026-08-28T09:54:46.4272599Z         "doc": {
2026-08-28T09:54:46.4272754Z           "complete": false,
2026-08-28T09:54:46.4272912Z           "evidence": []
2026-08-28T09:54:46.4273166Z         },
2026-08-28T09:54:46.4273315Z         "impl": {
2026-08-28T09:54:46.4273471Z           "complete": true,
2026-08-28T09:54:46.4273630Z           "evidence": [
2026-08-28T09:54:46.4273771Z             {
2026-08-28T09:54:46.4273987Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4274139Z               "line": 363
2026-08-28T09:54:46.4274283Z             },
2026-08-28T09:54:46.4274430Z             {
2026-08-28T09:54:46.4274625Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4274788Z               "line": 386
2026-08-28T09:54:46.4274931Z             },
2026-08-28T09:54:46.4275074Z             {
2026-08-28T09:54:46.4275274Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4275423Z               "line": 397
2026-08-28T09:54:46.4275570Z             },
2026-08-28T09:54:46.4275716Z             {
2026-08-28T09:54:46.4275920Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4276072Z               "line": 733
2026-08-28T09:54:46.4276221Z             },
2026-08-28T09:54:46.4276362Z             {
2026-08-28T09:54:46.4276568Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4276721Z               "line": 762
2026-08-28T09:54:46.4276864Z             },
2026-08-28T09:54:46.4277011Z             {
2026-08-28T09:54:46.4277207Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4277355Z               "line": 775
2026-08-28T09:54:46.4277502Z             },
2026-08-28T09:54:46.4277645Z             {
2026-08-28T09:54:46.4277840Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4277995Z               "line": 801
2026-08-28T09:54:46.4278141Z             },
2026-08-28T09:54:46.4278287Z             {
2026-08-28T09:54:46.4278486Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4278639Z               "line": 1066
2026-08-28T09:54:46.4278783Z             },
2026-08-28T09:54:46.4278929Z             {
2026-08-28T09:54:46.4279234Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4279515Z               "line": 1269
2026-08-28T09:54:46.4279665Z             },
2026-08-28T09:54:46.4279806Z             {
2026-08-28T09:54:46.4280003Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4280159Z               "line": 1301
2026-08-28T09:54:46.4280304Z             },
2026-08-28T09:54:46.4280450Z             {
2026-08-28T09:54:46.4280647Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4280803Z               "line": 1322
2026-08-28T09:54:46.4280953Z             }
2026-08-28T09:54:46.4281098Z           ]
2026-08-28T09:54:46.4281251Z         },
2026-08-28T09:54:46.4281403Z         "int": {
2026-08-28T09:54:46.4281561Z           "complete": true,
2026-08-28T09:54:46.4281713Z           "evidence": [
2026-08-28T09:54:46.4281862Z             {
2026-08-28T09:54:46.4282080Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:46.4282242Z               "line": 543
2026-08-28T09:54:46.4282390Z             },
2026-08-28T09:54:46.4282534Z             {
2026-08-28T09:54:46.4282757Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:46.4282906Z               "line": 567
2026-08-28T09:54:46.4283062Z             }
2026-08-28T09:54:46.4283206Z           ]
2026-08-28T09:54:46.4283352Z         },
2026-08-28T09:54:46.4283500Z         "unit": {
2026-08-28T09:54:46.4283660Z           "complete": true,
2026-08-28T09:54:46.4283817Z           "evidence": [
2026-08-28T09:54:46.4283965Z             {
2026-08-28T09:54:46.4284171Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4284327Z               "line": 2451
2026-08-28T09:54:46.4284481Z             },
2026-08-28T09:54:46.4284623Z             {
2026-08-28T09:54:46.4284824Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4284980Z               "line": 2469
2026-08-28T09:54:46.4285233Z             },
2026-08-28T09:54:46.4285378Z             {
2026-08-28T09:54:46.4285577Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.4285740Z               "line": 2534
2026-08-28T09:54:46.4285882Z             }
2026-08-28T09:54:46.4286036Z           ]
2026-08-28T09:54:46.4286182Z         }
2026-08-28T09:54:46.4286329Z       }
2026-08-28T09:54:46.4286480Z     },
2026-08-28T09:54:46.4286627Z     {
2026-08-28T09:54:46.4286818Z       "id": "REQ-DIGEST-CROSS-NODE-PULL",
2026-08-28T09:54:46.4291063Z       "title": "The digest SNAPSHOT PULL crosses nodes: `spt endpoint digest <[subnet:]id@node>` (including `--after <seq>` incremental polling) resolves and serves under the EXISTING address gate — the CROSS_NODE_M4 qualified-address refusal lifts for the pull verb only. The structured-delta stream stays node-local until a real cross-node subscriber exists (ADR-0048 decision 5, defer-until-consumer; operator-ruled 2026-07-24). Access policy is NOT new — fetch was ratified address-gated long ago; this is routing. Composition note: REQ-DIGEST-SEAL-ON-IDLE's stable seqs are what make remote --after polling trustworthy. Forcing customer: spt-mobile 'view live digest of ANY endpoint' (host proxies transparently once the refusal lifts). Gate: int — two-node rig: a qualified digest pull from the non-hosting node returns the hosting node's buffer; --after returns only rows past the cursor; the address gate still refuses a non-resolvable caller.",
2026-08-28T09:54:46.4291244Z       "requiredStages": [
2026-08-28T09:54:46.4291393Z         "doc",
2026-08-28T09:54:46.4291541Z         "impl",
2026-08-28T09:54:46.4291691Z         "unit",
2026-08-28T09:54:46.4291835Z         "int"
2026-08-28T09:54:46.4291992Z       ],
2026-08-28T09:54:46.4292136Z       "stages": {
2026-08-28T09:54:46.4292287Z         "doc": {
2026-08-28T09:54:46.4292441Z           "complete": true,
2026-08-28T09:54:46.4292592Z           "evidence": [
2026-08-28T09:54:46.4292741Z             {
2026-08-28T09:54:46.4292964Z               "path": "docs-site/src/reference/json-shapes.md",
2026-08-28T09:54:46.4293241Z               "line": 34
2026-08-28T09:54:46.4293385Z             },
2026-08-28T09:54:46.4293536Z             {
2026-08-28T09:54:46.4293743Z               "path": "docs/adr/0048-idle-edge-contract.md",
2026-08-28T09:54:46.4293898Z               "line": 119
2026-08-28T09:54:46.4294046Z             }
2026-08-28T09:54:46.4294192Z           ]
2026-08-28T09:54:46.4294344Z         },
2026-08-28T09:54:46.4294492Z         "impl": {
2026-08-28T09:54:46.4294659Z           "complete": true,
2026-08-28T09:54:46.4294811Z           "evidence": [
2026-08-28T09:54:46.4294959Z             {
2026-08-28T09:54:46.4295169Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.4295323Z               "line": 21
2026-08-28T09:54:46.4295474Z             },
2026-08-28T09:54:46.4295623Z             {
2026-08-28T09:54:46.4295832Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.4295985Z               "line": 91
2026-08-28T09:54:46.4296132Z             },
2026-08-28T09:54:46.4296277Z             {
2026-08-28T09:54:46.4296485Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.4296648Z               "line": 115
2026-08-28T09:54:46.4296789Z             },
2026-08-28T09:54:46.4296937Z             {
2026-08-28T09:54:46.4297139Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.4297298Z               "line": 175
2026-08-28T09:54:46.4297439Z             },
2026-08-28T09:54:46.4297589Z             {
2026-08-28T09:54:46.4297787Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.4297946Z               "line": 226
2026-08-28T09:54:46.4298102Z             },
2026-08-28T09:54:46.4298242Z             {
2026-08-28T09:54:46.4298441Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4298599Z               "line": 129
2026-08-28T09:54:46.4298746Z             },
2026-08-28T09:54:46.4299091Z             {
2026-08-28T09:54:46.4299304Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4299461Z               "line": 240
2026-08-28T09:54:46.4299597Z             },
2026-08-28T09:54:46.4299759Z             {
2026-08-28T09:54:46.4299973Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4300132Z               "line": 1214
2026-08-28T09:54:46.4300269Z             },
2026-08-28T09:54:46.4300422Z             {
2026-08-28T09:54:46.4300631Z               "path": "crates/spt-net/src/net/digestpull.rs",
2026-08-28T09:54:46.4300794Z               "line": 29
2026-08-28T09:54:46.4300950Z             },
2026-08-28T09:54:46.4301137Z             {
2026-08-28T09:54:46.4301342Z               "path": "crates/spt-net/src/net/digestpull.rs",
2026-08-28T09:54:46.4301490Z               "line": 48
2026-08-28T09:54:46.4301643Z             },
2026-08-28T09:54:46.4301786Z             {
2026-08-28T09:54:46.4301962Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4302120Z               "line": 2563
2026-08-28T09:54:46.4302270Z             },
2026-08-28T09:54:46.4302414Z             {
2026-08-28T09:54:46.4302590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4302748Z               "line": 2572
2026-08-28T09:54:46.4302895Z             },
2026-08-28T09:54:46.4303044Z             {
2026-08-28T09:54:46.4303219Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4303377Z               "line": 2655
2026-08-28T09:54:46.4303519Z             },
2026-08-28T09:54:46.4303669Z             {
2026-08-28T09:54:46.4303863Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.4304017Z               "line": 1130
2026-08-28T09:54:46.4304173Z             },
2026-08-28T09:54:46.4304313Z             {
2026-08-28T09:54:46.4304496Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.4304649Z               "line": 1182
2026-08-28T09:54:46.4304799Z             }
2026-08-28T09:54:46.4304943Z           ]
2026-08-28T09:54:46.4305390Z         },
2026-08-28T09:54:46.4305534Z         "int": {
2026-08-28T09:54:46.4305820Z           "complete": true,
2026-08-28T09:54:46.4305987Z           "evidence": [
2026-08-28T09:54:46.4306154Z             {
2026-08-28T09:54:46.4306397Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4306536Z               "line": 207
2026-08-28T09:54:46.4306711Z             },
2026-08-28T09:54:46.4306856Z             {
2026-08-28T09:54:46.4307089Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4307245Z               "line": 281
2026-08-28T09:54:46.4307387Z             },
2026-08-28T09:54:46.4307530Z             {
2026-08-28T09:54:46.4307771Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4307919Z               "line": 323
2026-08-28T09:54:46.4308067Z             },
2026-08-28T09:54:46.4308211Z             {
2026-08-28T09:54:46.4308435Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4308596Z               "line": 380
2026-08-28T09:54:46.4308735Z             },
2026-08-28T09:54:46.4308882Z             {
2026-08-28T09:54:46.4309240Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4309389Z               "line": 488
2026-08-28T09:54:46.4309535Z             },
2026-08-28T09:54:46.4309685Z             {
2026-08-28T09:54:46.4309911Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4310073Z               "line": 546
2026-08-28T09:54:46.4310219Z             },
2026-08-28T09:54:46.4310362Z             {
2026-08-28T09:54:46.4310585Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4310740Z               "line": 635
2026-08-28T09:54:46.4310886Z             },
2026-08-28T09:54:46.4311035Z             {
2026-08-28T09:54:46.4311239Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.4311397Z               "line": 573
2026-08-28T09:54:46.4311655Z             },
2026-08-28T09:54:46.4311798Z             {
2026-08-28T09:54:46.4312003Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.4312155Z               "line": 2952
2026-08-28T09:54:46.4312304Z             }
2026-08-28T09:54:46.4312446Z           ]
2026-08-28T09:54:46.4312599Z         },
2026-08-28T09:54:46.4312741Z         "unit": {
2026-08-28T09:54:46.4312907Z           "complete": true,
2026-08-28T09:54:46.4313060Z           "evidence": [
2026-08-28T09:54:46.4313208Z             {
2026-08-28T09:54:46.4313412Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4313561Z               "line": 2237
2026-08-28T09:54:46.4313718Z             },
2026-08-28T09:54:46.4313861Z             {
2026-08-28T09:54:46.4314070Z               "path": "crates/spt-net/src/net/digestpull.rs",
2026-08-28T09:54:46.4314220Z               "line": 84
2026-08-28T09:54:46.4314376Z             },
2026-08-28T09:54:46.4314525Z             {
2026-08-28T09:54:46.4314733Z               "path": "crates/spt-net/src/net/digestpull.rs",
2026-08-28T09:54:46.4314892Z               "line": 122
2026-08-28T09:54:46.4315033Z             },
2026-08-28T09:54:46.4315181Z             {
2026-08-28T09:54:46.4315383Z               "path": "crates/spt-net/src/net/digestpull.rs",
2026-08-28T09:54:46.4315546Z               "line": 158
2026-08-28T09:54:46.4315693Z             },
2026-08-28T09:54:46.4315832Z             {
2026-08-28T09:54:46.4316041Z               "path": "crates/spt-net/src/net/digestpull.rs",
2026-08-28T09:54:46.4316189Z               "line": 184
2026-08-28T09:54:46.4316341Z             },
2026-08-28T09:54:46.4316485Z             {
2026-08-28T09:54:46.4316666Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4316819Z               "line": 33102
2026-08-28T09:54:46.4316966Z             }
2026-08-28T09:54:46.4317111Z           ]
2026-08-28T09:54:46.4317252Z         }
2026-08-28T09:54:46.4317402Z       }
2026-08-28T09:54:46.4317548Z     },
2026-08-28T09:54:46.4317697Z     {
2026-08-28T09:54:46.4317976Z       "id": "REQ-DIGEST-CURSOR",
2026-08-28T09:54:46.4323501Z       "title": "`spt endpoint digest` gains incremental turn-end consumption (extends REQ-TERM-4/5): `--last <N>` = the last N TURNS (the digest's natural unit; --last 1 = the latest turn = turn-end output); a per-entry STABLE SOURCE-DERIVED `seq` in the --json output (deterministic from the entry's append position in the source — transcript record index across the session ledger / digest.log index — so a live re-projection yields the same seq for the same committed entry; NOT a window-position index that renumbers on slide); `--after <seq>` = entries newer than seq still in the window (full window + signal if seq predates it, mirroring the version-slide full-refresh). An in-flight (still-growing) entry is flagged `partial: true` with NO stable seq until finalized (consumer reprocesses partial, skips <= seq). Also emit per-entry `ts` where present (seq is the authoritative dedup+cursor key). The digest's agent text is sufficient fidelity (no raw-source mode). BINDING doc-guidance: an adapter's [digest] extractor / api digest-entry MUST classify delivered user-facing messages as turn-opening `input` (equiv to direct PTY user-input), else messaging-driven sessions collapse into a few giant turns and --last/seq lose granularity. (v0.16.0)",
2026-08-28T09:54:46.4323691Z       "requiredStages": [
2026-08-28T09:54:46.4323835Z         "doc",
2026-08-28T09:54:46.4323987Z         "impl",
2026-08-28T09:54:46.4324140Z         "unit"
2026-08-28T09:54:46.4324283Z       ],
2026-08-28T09:54:46.4324431Z       "stages": {
2026-08-28T09:54:46.4324579Z         "doc": {
2026-08-28T09:54:46.4324737Z           "complete": true,
2026-08-28T09:54:46.4324888Z           "evidence": [
2026-08-28T09:54:46.4325037Z             {
2026-08-28T09:54:46.4325202Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.4325356Z               "line": 591
2026-08-28T09:54:46.4325508Z             },
2026-08-28T09:54:46.4325915Z             {
2026-08-28T09:54:46.4326087Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.4326243Z               "line": 608
2026-08-28T09:54:46.4326393Z             }
2026-08-28T09:54:46.4326539Z           ]
2026-08-28T09:54:46.4326717Z         },
2026-08-28T09:54:46.4326868Z         "impl": {
2026-08-28T09:54:46.4327027Z           "complete": true,
2026-08-28T09:54:46.4327211Z           "evidence": [
2026-08-28T09:54:46.4327356Z             {
2026-08-28T09:54:46.4327560Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4327717Z               "line": 231
2026-08-28T09:54:46.4327865Z             },
2026-08-28T09:54:46.4328009Z             {
2026-08-28T09:54:46.4328214Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4328366Z               "line": 297
2026-08-28T09:54:46.4328512Z             },
2026-08-28T09:54:46.4328646Z             {
2026-08-28T09:54:46.4328838Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4329082Z               "line": 439
2026-08-28T09:54:46.4329226Z             },
2026-08-28T09:54:46.4329373Z             {
2026-08-28T09:54:46.4329575Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:46.4329730Z               "line": 82
2026-08-28T09:54:46.4329884Z             },
2026-08-28T09:54:46.4330031Z             {
2026-08-28T09:54:46.4330233Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:46.4330384Z               "line": 124
2026-08-28T09:54:46.4330528Z             },
2026-08-28T09:54:46.4330670Z             {
2026-08-28T09:54:46.4330872Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4331018Z               "line": 82
2026-08-28T09:54:46.4331156Z             },
2026-08-28T09:54:46.4331301Z             {
2026-08-28T09:54:46.4331492Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4331644Z               "line": 95
2026-08-28T09:54:46.4331798Z             },
2026-08-28T09:54:46.4331945Z             {
2026-08-28T09:54:46.4332132Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4332403Z               "line": 133
2026-08-28T09:54:46.4332555Z             },
2026-08-28T09:54:46.4332698Z             {
2026-08-28T09:54:46.4332889Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4333047Z               "line": 143
2026-08-28T09:54:46.4333198Z             },
2026-08-28T09:54:46.4333343Z             {
2026-08-28T09:54:46.4333532Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4333681Z               "line": 168
2026-08-28T09:54:46.4333828Z             },
2026-08-28T09:54:46.4333975Z             {
2026-08-28T09:54:46.4334180Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4334333Z               "line": 213
2026-08-28T09:54:46.4334486Z             },
2026-08-28T09:54:46.4334628Z             {
2026-08-28T09:54:46.4334833Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4334996Z               "line": 347
2026-08-28T09:54:46.4335139Z             },
2026-08-28T09:54:46.4335282Z             {
2026-08-28T09:54:46.4335482Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4335636Z               "line": 355
2026-08-28T09:54:46.4335781Z             },
2026-08-28T09:54:46.4335921Z             {
2026-08-28T09:54:46.4336110Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4336258Z               "line": 372
2026-08-28T09:54:46.4336399Z             },
2026-08-28T09:54:46.4336546Z             {
2026-08-28T09:54:46.4336738Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4336890Z               "line": 423
2026-08-28T09:54:46.4337033Z             },
2026-08-28T09:54:46.4337180Z             {
2026-08-28T09:54:46.4337400Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4337606Z               "line": 718
2026-08-28T09:54:46.4337748Z             },
2026-08-28T09:54:46.4338001Z             {
2026-08-28T09:54:46.4338178Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4338339Z               "line": 724
2026-08-28T09:54:46.4338484Z             },
2026-08-28T09:54:46.4338630Z             {
2026-08-28T09:54:46.4338813Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4339058Z               "line": 2562
2026-08-28T09:54:46.4339206Z             },
2026-08-28T09:54:46.4339346Z             {
2026-08-28T09:54:46.4339524Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4339680Z               "line": 2607
2026-08-28T09:54:46.4339825Z             },
2026-08-28T09:54:46.4339976Z             {
2026-08-28T09:54:46.4340149Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4340305Z               "line": 2617
2026-08-28T09:54:46.4340449Z             },
2026-08-28T09:54:46.4340601Z             {
2026-08-28T09:54:46.4340774Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4340930Z               "line": 2723
2026-08-28T09:54:46.4341074Z             },
2026-08-28T09:54:46.4341225Z             {
2026-08-28T09:54:46.4341403Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4341554Z               "line": 2800
2026-08-28T09:54:46.4341701Z             }
2026-08-28T09:54:46.4341847Z           ]
2026-08-28T09:54:46.4341990Z         },
2026-08-28T09:54:46.4342139Z         "int": {
2026-08-28T09:54:46.4342295Z           "complete": false,
2026-08-28T09:54:46.4342458Z           "evidence": []
2026-08-28T09:54:46.4342600Z         },
2026-08-28T09:54:46.4342748Z         "unit": {
2026-08-28T09:54:46.4342905Z           "complete": true,
2026-08-28T09:54:46.4343063Z           "evidence": [
2026-08-28T09:54:46.4343206Z             {
2026-08-28T09:54:46.4343420Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:46.4343573Z               "line": 391
2026-08-28T09:54:46.4343720Z             },
2026-08-28T09:54:46.4343873Z             {
2026-08-28T09:54:46.4344068Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:46.4344341Z               "line": 405
2026-08-28T09:54:46.4344487Z             },
2026-08-28T09:54:46.4344636Z             {
2026-08-28T09:54:46.4344830Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:46.4344989Z               "line": 433
2026-08-28T09:54:46.4345131Z             },
2026-08-28T09:54:46.4347755Z             {
2026-08-28T09:54:46.4347984Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4348128Z               "line": 905
2026-08-28T09:54:46.4348280Z             },
2026-08-28T09:54:46.4348424Z             {
2026-08-28T09:54:46.4348632Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4348786Z               "line": 956
2026-08-28T09:54:46.4348933Z             },
2026-08-28T09:54:46.4349233Z             {
2026-08-28T09:54:46.4349444Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4349604Z               "line": 970
2026-08-28T09:54:46.4349766Z             },
2026-08-28T09:54:46.4349916Z             {
2026-08-28T09:54:46.4350112Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4350269Z               "line": 1006
2026-08-28T09:54:46.4350423Z             },
2026-08-28T09:54:46.4350569Z             {
2026-08-28T09:54:46.4350775Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4350927Z               "line": 1246
2026-08-28T09:54:46.4351076Z             },
2026-08-28T09:54:46.4351223Z             {
2026-08-28T09:54:46.4351400Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4351576Z               "line": 33016
2026-08-28T09:54:46.4351752Z             },
2026-08-28T09:54:46.4351896Z             {
2026-08-28T09:54:46.4352076Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4352238Z               "line": 33035
2026-08-28T09:54:46.4352379Z             },
2026-08-28T09:54:46.4352521Z             {
2026-08-28T09:54:46.4352699Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4352989Z               "line": 33072
2026-08-28T09:54:46.4353136Z             }
2026-08-28T09:54:46.4353299Z           ]
2026-08-28T09:54:46.4353441Z         }
2026-08-28T09:54:46.4353591Z       }
2026-08-28T09:54:46.4353737Z     },
2026-08-28T09:54:46.4353872Z     {
2026-08-28T09:54:46.4354066Z       "id": "REQ-DIGEST-FETCHER-STRATEGY",
2026-08-28T09:54:46.4359860Z       "title": "Bug #17 (W6b, closes eel-a end-to-end): [digest] gains a `fetcher` strategy mirroring [history]'s locate/normalize split (CONTEXT §history: [digest] mirrors history's two strategies — locate ownership). ROOT: the pre-W6b [digest] had only the locate_normalize analog (spt-core resolves ONE `source` template + pre-reads the file), which CANNOT express a PARTITIONED transcript layout — CC's projects/<munge(cwd)>/<session_id>.jsonl or a date-globbed rollout tree — the exact case CONTEXT already assigns to the adapter. spt-core (correctly) provides NO {project}/slug key (harness-specific cwd munging = the charter violation FIX-A was rejected for). Fix: strategy = fetcher makes the ADAPTER's extractor locate + read + emit normalized records; spt-core runs it bounded (no locate, no pre-read, no stdin) and consumes stdout, feeding only the harness-NEUTRAL inputs it owns — {session_id}, the perch-bound {cwd} (info.json.cwd), and the captured [env] direction=read vars (W6/REQ-DIGEST-PROFILE-ENV) — so the extractor globs the unique {session_id} under {read-var-root}/projects/ with no slug. Keeps locate_normalize (default, back-compat) for a trivial single-file harness. Distinct capability from REQ-DIGEST-PROFILE-ENV (which supplies the root env). See docs/NEXT-MILESTONE-BUG-TRIAGE.md #17.",
2026-08-28T09:54:46.4360042Z       "requiredStages": [
2026-08-28T09:54:46.4360193Z         "doc",
2026-08-28T09:54:46.4360340Z         "impl",
2026-08-28T09:54:46.4360490Z         "unit",
2026-08-28T09:54:46.4360640Z         "int"
2026-08-28T09:54:46.4360782Z       ],
2026-08-28T09:54:46.4360940Z       "stages": {
2026-08-28T09:54:46.4361087Z         "doc": {
2026-08-28T09:54:46.4361369Z           "complete": true,
2026-08-28T09:54:46.4361521Z           "evidence": [
2026-08-28T09:54:46.4361664Z             {
2026-08-28T09:54:46.4361903Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:46.4362060Z               "line": 327
2026-08-28T09:54:46.4362208Z             },
2026-08-28T09:54:46.4362350Z             {
2026-08-28T09:54:46.4362528Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.4362678Z               "line": 275
2026-08-28T09:54:46.4362827Z             }
2026-08-28T09:54:46.4362972Z           ]
2026-08-28T09:54:46.4363115Z         },
2026-08-28T09:54:46.4363264Z         "impl": {
2026-08-28T09:54:46.4363420Z           "complete": true,
2026-08-28T09:54:46.4363573Z           "evidence": [
2026-08-28T09:54:46.4363716Z             {
2026-08-28T09:54:46.4363917Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4364069Z               "line": 280
2026-08-28T09:54:46.4364221Z             },
2026-08-28T09:54:46.4364374Z             {
2026-08-28T09:54:46.4364565Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:46.4364728Z               "line": 103
2026-08-28T09:54:46.4364878Z             },
2026-08-28T09:54:46.4365023Z             {
2026-08-28T09:54:46.4365198Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4365353Z               "line": 22051
2026-08-28T09:54:46.4365499Z             }
2026-08-28T09:54:46.4365645Z           ]
2026-08-28T09:54:46.4365790Z         },
2026-08-28T09:54:46.4365937Z         "int": {
2026-08-28T09:54:46.4366104Z           "complete": true,
2026-08-28T09:54:46.4366256Z           "evidence": [
2026-08-28T09:54:46.4366395Z             {
2026-08-28T09:54:46.4366585Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:46.4366743Z               "line": 242
2026-08-28T09:54:46.4366890Z             }
2026-08-28T09:54:46.4367035Z           ]
2026-08-28T09:54:46.4367287Z         },
2026-08-28T09:54:46.4367438Z         "unit": {
2026-08-28T09:54:46.4367607Z           "complete": true,
2026-08-28T09:54:46.4367758Z           "evidence": [
2026-08-28T09:54:46.4367900Z             {
2026-08-28T09:54:46.4368108Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.4368265Z               "line": 2255
2026-08-28T09:54:46.4368408Z             }
2026-08-28T09:54:46.4368561Z           ]
2026-08-28T09:54:46.4368704Z         }
2026-08-28T09:54:46.4368856Z       }
2026-08-28T09:54:46.4369085Z     },
2026-08-28T09:54:46.4369229Z     {
2026-08-28T09:54:46.4369438Z       "id": "REQ-DIGEST-GENERATION-SUPERSEDE",
2026-08-28T09:54:46.4380556Z       "title": "W3 (LIFECYCLE-TRUTH, digest projection truth — flynn filing spt-mobile d0aa3f4): a one-shot `endpoint digest --json` snapshot must return each logical activity row ONCE across a checkpoint/resume, not once per seq-generation. ROOT (spt-core-side, not a consumer bug): the K-session span (digest.rs activity_spanned, SPAN_SESSIONS=5) runs the [digest] extractor per session file and tags each row seq=(ledger_ordinal<<32)|localseq (REQ-DIGEST-CURSOR). A checkpoint/resume (self-/clear + Psyche rebuild) makes the harness REPLAY the prior generation's transcript into the NEW session file, so the ancestor's rows appear in BOTH the ancestor file AND the resume file at the SAME localseq — the span UNIONS them, one logical row surfacing under two full seqs (gen23,local208) + (gen25,local208), identical text/ts/localseq. Consumers dedup by exact seq (the documented authoritative key) so nothing collapses -> duplicate rows in every snapshot / `--after` view (`--follow from:0` is CLEAN — it reads current-generation only; the SPAN is the sole culprit). The trigger cannot disambiguate: `api boundary clear` records SessionTrigger::Clear for BOTH a fresh /clear (disjoint) and a carry-forward checkpoint (reporting.rs:94) — so a structural skip-ancestor needs new boundary metadata + adapter cooperation, deferred. FIX (doyle ruling — flynn Option 1 Supersede, projection-local, source-independent): within the span, collapse cross-generation replay dupes — an Activity record from an OLDER ordinal is dropped when an identical logical record (role, ts, text, tool) exists under a NEWER ordinal; keep the NEWEST-ordinal occurrence so the surviving seq is the live generation (snapshot + follow agree on seq). Cross-generation ONLY (never dedup within one ordinal — a session cannot replay itself; identical within-gen rows are real). Supersede runs on the raw span items BEFORE the window fold (project_timeline) so window_turns counts real turns, not phantoms; and a boundary divider adjacent to a now-fully-superseded ancestor is not left orphaned. Context entries (REQ-TERM-7, single digest.log) are not per-session-spanned -> untouched. Int = a two-session span rig where session B's extracted lines are a superset replay of A (same ts/text at same localseq) + B's own new tail: RED-first (pre-fix shows every A row twice); post-fix each logical row appears ONCE under B's generation, B's tail intact, the /clear boundary marker preserved when A retains rows.",
2026-08-28T09:54:46.4380894Z       "requiredStages": [
2026-08-28T09:54:46.4381048Z         "impl",
2026-08-28T09:54:46.4381199Z         "unit",
2026-08-28T09:54:46.4381347Z         "int"
2026-08-28T09:54:46.4381493Z       ],
2026-08-28T09:54:46.4381639Z       "stages": {
2026-08-28T09:54:46.4381793Z         "doc": {
2026-08-28T09:54:46.4381954Z           "complete": false,
2026-08-28T09:54:46.4382112Z           "evidence": []
2026-08-28T09:54:46.4382264Z         },
2026-08-28T09:54:46.4382413Z         "impl": {
2026-08-28T09:54:46.4382570Z           "complete": true,
2026-08-28T09:54:46.4382723Z           "evidence": [
2026-08-28T09:54:46.4382875Z             {
2026-08-28T09:54:46.4383080Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4383237Z               "line": 197
2026-08-28T09:54:46.4383386Z             },
2026-08-28T09:54:46.4383533Z             {
2026-08-28T09:54:46.4383842Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4383999Z               "line": 331
2026-08-28T09:54:46.4384149Z             },
2026-08-28T09:54:46.4384293Z             {
2026-08-28T09:54:46.4384487Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4384641Z               "line": 357
2026-08-28T09:54:46.4384788Z             }
2026-08-28T09:54:46.4384932Z           ]
2026-08-28T09:54:46.4385084Z         },
2026-08-28T09:54:46.4385233Z         "int": {
2026-08-28T09:54:46.4385390Z           "complete": true,
2026-08-28T09:54:46.4385543Z           "evidence": [
2026-08-28T09:54:46.4385690Z             {
2026-08-28T09:54:46.4385938Z               "path": "crates/spt-daemon/tests/two_origin_spanning.rs",
2026-08-28T09:54:46.4386085Z               "line": 190
2026-08-28T09:54:46.4386234Z             }
2026-08-28T09:54:46.4386377Z           ]
2026-08-28T09:54:46.4386525Z         },
2026-08-28T09:54:46.4386676Z         "unit": {
2026-08-28T09:54:46.4386838Z           "complete": true,
2026-08-28T09:54:46.4386995Z           "evidence": [
2026-08-28T09:54:46.4387139Z             {
2026-08-28T09:54:46.4387338Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4387492Z               "line": 688
2026-08-28T09:54:46.4387639Z             },
2026-08-28T09:54:46.4387783Z             {
2026-08-28T09:54:46.4387982Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4388136Z               "line": 720
2026-08-28T09:54:46.4388278Z             },
2026-08-28T09:54:46.4388426Z             {
2026-08-28T09:54:46.4388612Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4388770Z               "line": 733
2026-08-28T09:54:46.4388916Z             },
2026-08-28T09:54:46.4389144Z             {
2026-08-28T09:54:46.4389342Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4389496Z               "line": 752
2026-08-28T09:54:46.4389642Z             }
2026-08-28T09:54:46.4389796Z           ]
2026-08-28T09:54:46.4389938Z         }
2026-08-28T09:54:46.4390196Z       }
2026-08-28T09:54:46.4390340Z     },
2026-08-28T09:54:46.4390488Z     {
2026-08-28T09:54:46.4390674Z       "id": "REQ-DIGEST-JSON-SELF-CONTAINED",
2026-08-28T09:54:46.4402400Z       "title": "TEARDOWN-AUTHORITY W4 (perri adapter-surface finding 2026-07-19, doyle-grounded and RE-SCOPED; title AMENDED at gate 2026-07-19 — the original welded version to --after polling, todlando falsified it from digesthub.rs/cli.rs and doyle ruled the amendment rides the wave: fifth instance of the claim-keyed-on-the-wrong-thing class, this one in the REQ registry itself): `spt endpoint digest <id> --json` must be self-contained on stdout. Today the digest snapshot version is NOT a field of the --json object at all — it exists ONLY in the DIGEST:<id> version=N trailer that cmd_digest eprintln!s at cli.rs:1619 — so a JSON consumer that wants it is FORCED to parse stderr. NUMBER-SPACE TRUTH (the amendment): version is digesthub's monotonic PROJECTION counter — it bumps when the projected digest CHANGES, serves as the --follow from_version floor and a change-detection cursor, and is NOT valid --after input; --after filters on entry seq ((ledger_ordinal<<32)|line_idx), a different number space, so a version passed as --after predates the window every time. NOTE the corrected history (perri's original RCA framed this as a fleet outage and doyle falsified it; perri confirmed): the trailer has been on STDERR since it was added 2026-06-03 (16f4c8e) and no stdout trailer ever existed, so stdout-only consumers never choked — this is a CONTRACT-COMPLETENESS defect, low priority, NOT an outage. FIX: (a) emit version as a top-level integer field inside the --json object (field name pinned by the consumer — perri's adapter parses 'version' — so no second round is needed), alongside the existing after_predates_window signal; (b) gate the stderr trailer on the non-json path so --json leaves stderr clean while the human path keeps its status line. Result: --json stdout = pure self-contained JSON including the version, safe whether the consumer reads stdout-only OR merges 2>&1. Additive to the JSON shape (REQ-CLI-JSON evolution rule). The published doc must state the number-space split with the EXPLICIT NEGATIVE (version is NOT valid --after input) — the original title proves the misuse is the natural reading. Gate: doc — the json-shapes digest section carries version, the stderr-clean --json contract, the complete entry-kind enum with per-kind produced-vs-injected provenance, and the seq/version asymmetry incl the explicit negative; impl — version field on the --json snapshot path + non-json-gated trailer; unit — the --json object carries version and stderr carries no DIGEST: trailer, the non-json path still prints it (predates ordering included), and the behavior-change sweep confirms no existing test asserts the old --json shape or the trailer presence under --json.",
2026-08-28T09:54:46.4402703Z       "requiredStages": [
2026-08-28T09:54:46.4402856Z         "doc",
2026-08-28T09:54:46.4403003Z         "impl",
2026-08-28T09:54:46.4403157Z         "unit"
2026-08-28T09:54:46.4403304Z       ],
2026-08-28T09:54:46.4403452Z       "stages": {
2026-08-28T09:54:46.4403600Z         "doc": {
2026-08-28T09:54:46.4403757Z           "complete": true,
2026-08-28T09:54:46.4403934Z           "evidence": [
2026-08-28T09:54:46.4404096Z             {
2026-08-28T09:54:46.4404310Z               "path": "docs-site/src/reference/json-shapes.md",
2026-08-28T09:54:46.4404445Z               "line": 29
2026-08-28T09:54:46.4404581Z             }
2026-08-28T09:54:46.4404730Z           ]
2026-08-28T09:54:46.4404891Z         },
2026-08-28T09:54:46.4405067Z         "impl": {
2026-08-28T09:54:46.4405227Z           "complete": true,
2026-08-28T09:54:46.4405384Z           "evidence": [
2026-08-28T09:54:46.4405527Z             {
2026-08-28T09:54:46.4405704Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4405847Z               "line": 2799
2026-08-28T09:54:46.4405995Z             }
2026-08-28T09:54:46.4406152Z           ]
2026-08-28T09:54:46.4406400Z         },
2026-08-28T09:54:46.4406547Z         "int": {
2026-08-28T09:54:46.4406724Z           "complete": false,
2026-08-28T09:54:46.4406914Z           "evidence": []
2026-08-28T09:54:46.4407044Z         },
2026-08-28T09:54:46.4407191Z         "unit": {
2026-08-28T09:54:46.4407331Z           "complete": true,
2026-08-28T09:54:46.4407487Z           "evidence": [
2026-08-28T09:54:46.4407646Z             {
2026-08-28T09:54:46.4407824Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4407973Z               "line": 33201
2026-08-28T09:54:46.4408116Z             },
2026-08-28T09:54:46.4408288Z             {
2026-08-28T09:54:46.4408478Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4408631Z               "line": 33224
2026-08-28T09:54:46.4408783Z             },
2026-08-28T09:54:46.4408918Z             {
2026-08-28T09:54:46.4409179Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4409336Z               "line": 33242
2026-08-28T09:54:46.4409484Z             }
2026-08-28T09:54:46.4409637Z           ]
2026-08-28T09:54:46.4409784Z         }
2026-08-28T09:54:46.4409923Z       }
2026-08-28T09:54:46.4410069Z     },
2026-08-28T09:54:46.4410208Z     {
2026-08-28T09:54:46.4410386Z       "id": "REQ-DIGEST-PROFILE-ENV",
2026-08-28T09:54:46.4413954Z       "title": "Bug #17: spt endpoint digest returns NO_DIGEST for a ccs-profile endpoint (claude-spt:ccs) though [digest] is wired and the transcript exists — under .ccs (CLAUDE_CONFIG_DIR relocation) not .claude. The on-demand digest runs the extractor in the daemon context WITHOUT the endpoint profile transcript-location env, so the env-aware resolver cannot find the relocated transcript. Fix: propagate/persist the endpoint profile transcript-location env (e.g. the ccs CLAUDE_CONFIG_DIR) to the on-demand digest extractor so a profile-relocated transcript resolves; confirm the exact extractor verdict via spt adapter digest-proof. Ownership spt-core (digest env/profile propagation), possibly with a claude-spt extractor-resolver assist. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #17.",
2026-08-28T09:54:46.4414230Z       "requiredStages": [
2026-08-28T09:54:46.4414385Z         "doc",
2026-08-28T09:54:46.4414531Z         "impl",
2026-08-28T09:54:46.4414676Z         "unit"
2026-08-28T09:54:46.4414822Z       ],
2026-08-28T09:54:46.4414971Z       "stages": {
2026-08-28T09:54:46.4415122Z         "doc": {
2026-08-28T09:54:46.4415282Z           "complete": true,
2026-08-28T09:54:46.4415437Z           "evidence": [
2026-08-28T09:54:46.4415579Z             {
2026-08-28T09:54:46.4415749Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.4415906Z               "line": 214
2026-08-28T09:54:46.4416051Z             },
2026-08-28T09:54:46.4416196Z             {
2026-08-28T09:54:46.4416369Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:46.4416525Z               "line": 300
2026-08-28T09:54:46.4416669Z             }
2026-08-28T09:54:46.4416812Z           ]
2026-08-28T09:54:46.4416961Z         },
2026-08-28T09:54:46.4417112Z         "impl": {
2026-08-28T09:54:46.4417276Z           "complete": true,
2026-08-28T09:54:46.4417427Z           "evidence": [
2026-08-28T09:54:46.4417576Z             {
2026-08-28T09:54:46.4417780Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4417933Z               "line": 270
2026-08-28T09:54:46.4418076Z             },
2026-08-28T09:54:46.4418230Z             {
2026-08-28T09:54:46.4418432Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4418586Z               "line": 398
2026-08-28T09:54:46.4418732Z             },
2026-08-28T09:54:46.4418881Z             {
2026-08-28T09:54:46.4419158Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4419314Z               "line": 422
2026-08-28T09:54:46.4419463Z             },
2026-08-28T09:54:46.4419601Z             {
2026-08-28T09:54:46.4419807Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4419968Z               "line": 449
2026-08-28T09:54:46.4420225Z             },
2026-08-28T09:54:46.4420383Z             {
2026-08-28T09:54:46.4420573Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4420729Z               "line": 393
2026-08-28T09:54:46.4420876Z             },
2026-08-28T09:54:46.4421023Z             {
2026-08-28T09:54:46.4421214Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4421371Z               "line": 723
2026-08-28T09:54:46.4421519Z             },
2026-08-28T09:54:46.4421662Z             {
2026-08-28T09:54:46.4421839Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4421996Z               "line": 22042
2026-08-28T09:54:46.4422139Z             }
2026-08-28T09:54:46.4422287Z           ]
2026-08-28T09:54:46.4422434Z         },
2026-08-28T09:54:46.4422577Z         "int": {
2026-08-28T09:54:46.4422745Z           "complete": false,
2026-08-28T09:54:46.4422901Z           "evidence": []
2026-08-28T09:54:46.4423050Z         },
2026-08-28T09:54:46.4423202Z         "unit": {
2026-08-28T09:54:46.4423365Z           "complete": true,
2026-08-28T09:54:46.4423520Z           "evidence": [
2026-08-28T09:54:46.4423668Z             {
2026-08-28T09:54:46.4423871Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4424024Z               "line": 1161
2026-08-28T09:54:46.4424171Z             },
2026-08-28T09:54:46.4424325Z             {
2026-08-28T09:54:46.4424524Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4424682Z               "line": 1192
2026-08-28T09:54:46.4424829Z             },
2026-08-28T09:54:46.4424978Z             {
2026-08-28T09:54:46.4425177Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4425330Z               "line": 1504
2026-08-28T09:54:46.4425478Z             },
2026-08-28T09:54:46.4425622Z             {
2026-08-28T09:54:46.4425812Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.4426068Z               "line": 1138
2026-08-28T09:54:46.4426211Z             },
2026-08-28T09:54:46.4426356Z             {
2026-08-28T09:54:46.4426553Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4426704Z               "line": 3148
2026-08-28T09:54:46.4426854Z             }
2026-08-28T09:54:46.4426995Z           ]
2026-08-28T09:54:46.4427149Z         }
2026-08-28T09:54:46.4427297Z       }
2026-08-28T09:54:46.4427440Z     },
2026-08-28T09:54:46.4427667Z     {
2026-08-28T09:54:46.4427936Z       "id": "REQ-DIGEST-SEAL-ON-IDLE",
2026-08-28T09:54:46.4432999Z       "title": "A digest turn's records gain their stable `seq` at the endpoint's IDLE TRANSITION — the adapter-reported, already-authoritative turn-finished signal — not at next-user-input arrival (which is demoted to a harmless no-op fallback seal). Kills the mint-then-idle deadlock (liam/spt-progress-tool W16: a finished-but-idle turn stayed partial/seq-less, so a seq-keyed scanner could never see the owner's latest turn until the owner was prompted again; interim drive-one-more-command workaround retires at ship). Sealing is IDEMPOTENT and SEQ-STABLE: it assigns seq to what the log holds at idle; a late-flushing straggler record folds into the sealed turn WITHOUT changing the assigned seq. (ADR-0048 decision 4; rejected: extractor-observed completion = banned heuristic inference class; provisional seqs = scanner bug factory.) Gate: int — the liam field shape RED-first: finish a turn, report idle, do NOT prompt again — the turn is sealed with a stable seq and a scanner keyed on seq sees it; fallback leg: next-input on an already-sealed turn re-seals nothing; straggler leg: a post-idle log record folds in, seq unchanged.",
2026-08-28T09:54:46.4433181Z       "requiredStages": [
2026-08-28T09:54:46.4433333Z         "doc",
2026-08-28T09:54:46.4433476Z         "impl",
2026-08-28T09:54:46.4433629Z         "unit",
2026-08-28T09:54:46.4433772Z         "int"
2026-08-28T09:54:46.4433925Z       ],
2026-08-28T09:54:46.4434066Z       "stages": {
2026-08-28T09:54:46.4434219Z         "doc": {
2026-08-28T09:54:46.4434522Z           "complete": true,
2026-08-28T09:54:46.4434665Z           "evidence": [
2026-08-28T09:54:46.4434798Z             {
2026-08-28T09:54:46.4435013Z               "path": "docs-site/src/reference/json-shapes.md",
2026-08-28T09:54:46.4435176Z               "line": 229
2026-08-28T09:54:46.4435318Z             },
2026-08-28T09:54:46.4435467Z             {
2026-08-28T09:54:46.4435671Z               "path": "docs/adr/0048-idle-edge-contract.md",
2026-08-28T09:54:46.4435834Z               "line": 93
2026-08-28T09:54:46.4435976Z             }
2026-08-28T09:54:46.4436129Z           ]
2026-08-28T09:54:46.4436271Z         },
2026-08-28T09:54:46.4436421Z         "impl": {
2026-08-28T09:54:46.4436586Z           "complete": true,
2026-08-28T09:54:46.4436733Z           "evidence": [
2026-08-28T09:54:46.4436884Z             {
2026-08-28T09:54:46.4437079Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:46.4437236Z               "line": 162
2026-08-28T09:54:46.4437466Z             },
2026-08-28T09:54:46.4437656Z             {
2026-08-28T09:54:46.4437847Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4438005Z               "line": 41
2026-08-28T09:54:46.4438156Z             },
2026-08-28T09:54:46.4438309Z             {
2026-08-28T09:54:46.4438500Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:46.4438654Z               "line": 181
2026-08-28T09:54:46.4438804Z             },
2026-08-28T09:54:46.4439026Z             {
2026-08-28T09:54:46.4439240Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4439411Z               "line": 435
2026-08-28T09:54:46.4439557Z             }
2026-08-28T09:54:46.4439701Z           ]
2026-08-28T09:54:46.4439843Z         },
2026-08-28T09:54:46.4439997Z         "int": {
2026-08-28T09:54:46.4440158Z           "complete": true,
2026-08-28T09:54:46.4440312Z           "evidence": [
2026-08-28T09:54:46.4440453Z             {
2026-08-28T09:54:46.4440797Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.4440974Z               "line": 207
2026-08-28T09:54:46.4441145Z             },
2026-08-28T09:54:46.4441294Z             {
2026-08-28T09:54:46.4441498Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:46.4441650Z               "line": 2952
2026-08-28T09:54:46.4441792Z             },
2026-08-28T09:54:46.4441940Z             {
2026-08-28T09:54:46.4442148Z               "path": "crates/spt/tests/idle_edge_seal_e2e.rs",
2026-08-28T09:54:46.4442301Z               "line": 109
2026-08-28T09:54:46.4442448Z             }
2026-08-28T09:54:46.4442592Z           ]
2026-08-28T09:54:46.4442739Z         },
2026-08-28T09:54:46.4442883Z         "unit": {
2026-08-28T09:54:46.4443044Z           "complete": true,
2026-08-28T09:54:46.4443197Z           "evidence": [
2026-08-28T09:54:46.4443344Z             {
2026-08-28T09:54:46.4443545Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4443702Z               "line": 1067
2026-08-28T09:54:46.4443851Z             },
2026-08-28T09:54:46.4443993Z             {
2026-08-28T09:54:46.4444194Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4444346Z               "line": 1114
2026-08-28T09:54:46.4444499Z             },
2026-08-28T09:54:46.4444640Z             {
2026-08-28T09:54:46.4444840Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4444991Z               "line": 1142
2026-08-28T09:54:46.4445140Z             },
2026-08-28T09:54:46.4445497Z             {
2026-08-28T09:54:46.4445693Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4445845Z               "line": 1159
2026-08-28T09:54:46.4445988Z             },
2026-08-28T09:54:46.4446145Z             {
2026-08-28T09:54:46.4446337Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4446517Z               "line": 1198
2026-08-28T09:54:46.4446676Z             },
2026-08-28T09:54:46.4446822Z             {
2026-08-28T09:54:46.4447165Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4447360Z               "line": 1219
2026-08-28T09:54:46.4447505Z             },
2026-08-28T09:54:46.4447653Z             {
2026-08-28T09:54:46.4447848Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:46.4447998Z               "line": 1246
2026-08-28T09:54:46.4448149Z             }
2026-08-28T09:54:46.4448298Z           ]
2026-08-28T09:54:46.4448450Z         }
2026-08-28T09:54:46.4448598Z       }
2026-08-28T09:54:46.4448741Z     },
2026-08-28T09:54:46.4448894Z     {
2026-08-28T09:54:46.4449165Z       "id": "REQ-DISPATCH-CLAIM-RETRY",
2026-08-28T09:54:46.4453481Z       "title": "REDISPATCH-TRUTH W1 (ADR-0038, hertz fix C): dispatcher claims are RETRYABLE and outcomes are CLASSIFIED — today claimed.insert(stream_id) happens PRE-spawn (dispatch.rs:206/214) and is never cleared or retried on Unknown/Failed, so one transient worker-setup failure permanently abandons the stream. Distinguish active/retryable vs served vs finished: a transient worker-setup failure releases/requeues the claim (bounded/backoff-shaped); terminal classification outcomes stay terminal and do NOT hot-loop (show the distinction in test, not just code). Gate: impl — claim lifecycle; unit — transient failure requeues + terminal outcome does not (no hot-loop under a persistently-failing stream); int — production-path regression D3: inject ONE transient worker-start failure, prove claim retry recovers the stream with NO duplicate controller/output. HEAVY nextest group at birth. Kin REQ-REDISPATCH-FINISHED-RETIRE, REQ-STREAM-OPENER-DURABLE.",
2026-08-28T09:54:46.4453662Z       "requiredStages": [
2026-08-28T09:54:46.4453815Z         "impl",
2026-08-28T09:54:46.4453962Z         "unit",
2026-08-28T09:54:46.4454115Z         "int"
2026-08-28T09:54:46.4454258Z       ],
2026-08-28T09:54:46.4454411Z       "stages": {
2026-08-28T09:54:46.4454558Z         "doc": {
2026-08-28T09:54:46.4455296Z           "complete": false,
2026-08-28T09:54:46.4455456Z           "evidence": []
2026-08-28T09:54:46.4455608Z         },
2026-08-28T09:54:46.4455757Z         "impl": {
2026-08-28T09:54:46.4455914Z           "complete": true,
2026-08-28T09:54:46.4456067Z           "evidence": [
2026-08-28T09:54:46.4456229Z             {
2026-08-28T09:54:46.4456433Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4456587Z               "line": 433
2026-08-28T09:54:46.4456734Z             },
2026-08-28T09:54:46.4456882Z             {
2026-08-28T09:54:46.4457091Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4457241Z               "line": 479
2026-08-28T09:54:46.4457392Z             }
2026-08-28T09:54:46.4457541Z           ]
2026-08-28T09:54:46.4457687Z         },
2026-08-28T09:54:46.4457834Z         "int": {
2026-08-28T09:54:46.4457995Z           "complete": true,
2026-08-28T09:54:46.4458156Z           "evidence": [
2026-08-28T09:54:46.4458300Z             {
2026-08-28T09:54:46.4458519Z               "path": "crates/spt-daemon/tests/redispatch.rs",
2026-08-28T09:54:46.4458676Z               "line": 681
2026-08-28T09:54:46.4458825Z             }
2026-08-28T09:54:46.4459061Z           ]
2026-08-28T09:54:46.4459201Z         },
2026-08-28T09:54:46.4459367Z         "unit": {
2026-08-28T09:54:46.4459516Z           "complete": true,
2026-08-28T09:54:46.4459673Z           "evidence": [
2026-08-28T09:54:46.4459816Z             {
2026-08-28T09:54:46.4460020Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4460174Z               "line": 2772
2026-08-28T09:54:46.4460312Z             }
2026-08-28T09:54:46.4460456Z           ]
2026-08-28T09:54:46.4460601Z         }
2026-08-28T09:54:46.4460750Z       }
2026-08-28T09:54:46.4460897Z     },
2026-08-28T09:54:46.4461040Z     {
2026-08-28T09:54:46.4461226Z       "id": "REQ-DISPATCH-FALLBACK-CIRCUIT",
2026-08-28T09:54:46.4466894Z       "title": "REDISPATCH-STALL W1 (ADR-0038 Amendment, fixes 1+5): the opener ring-peek fallback fires ONLY on the explicit UnsupportedVerb/old-broker answer — transport timeout/EOF/poison classify Failed and requeue bounded, NEVER a second replay subscriber (today first_line's Err(_) arm at dispatch.rs:414 catches everything; the comment intends old-broker-only). Retries are CLASSIFIED: pre-setup transient may retry; a deadline-poisoned replay is CIRCUIT-BROKEN (global backoff) and a replacement subscriber is never installed until the prior subscriber is fully gone. NOT a revert to the v0.33 burn-the-claim abandonment (rejected): the stream must recover after the breaker window — show it in test. Gate: impl — narrowed fallback arm + breaker; unit — timeout/EOF/poison never reach the peek path while unsupported-verb does + breaker trips and resets + no-reinstall-until-gone; int — T2 (no peek subscriber created on transport errors) + T5 (breaker recovery, the not-abandonment discriminator) + T7 mixed-image N-1 with REAL traffic-carrying streams (handshake-only insufficient); doc — ADR-0038 Amendment. Kin REQ-DISPATCH-CLAIM-RETRY (upgraded, not reverted), REQ-STREAM-OPENER-DURABLE (the N-1 window it narrows).",
2026-08-28T09:54:46.4467204Z       "requiredStages": [
2026-08-28T09:54:46.4467356Z         "doc",
2026-08-28T09:54:46.4467510Z         "impl",
2026-08-28T09:54:46.4467651Z         "unit",
2026-08-28T09:54:46.4467796Z         "int"
2026-08-28T09:54:46.4467942Z       ],
2026-08-28T09:54:46.4468087Z       "stages": {
2026-08-28T09:54:46.4468238Z         "doc": {
2026-08-28T09:54:46.4468438Z           "complete": true,
2026-08-28T09:54:46.4468607Z           "evidence": [
2026-08-28T09:54:46.4468760Z             {
2026-08-28T09:54:46.4469385Z               "path": "docs/adr/0038-broker-stream-lifecycle-truth.md",
2026-08-28T09:54:46.4469608Z               "line": 74
2026-08-28T09:54:46.4469756Z             }
2026-08-28T09:54:46.4469908Z           ]
2026-08-28T09:54:46.4470057Z         },
2026-08-28T09:54:46.4470214Z         "impl": {
2026-08-28T09:54:46.4470372Z           "complete": true,
2026-08-28T09:54:46.4470706Z           "evidence": [
2026-08-28T09:54:46.4470867Z             {
2026-08-28T09:54:46.4471086Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4471237Z               "line": 351
2026-08-28T09:54:46.4471382Z             },
2026-08-28T09:54:46.4471533Z             {
2026-08-28T09:54:46.4471739Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4471901Z               "line": 369
2026-08-28T09:54:46.4472040Z             },
2026-08-28T09:54:46.4472186Z             {
2026-08-28T09:54:46.4472411Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4472584Z               "line": 379
2026-08-28T09:54:46.4472735Z             },
2026-08-28T09:54:46.4472884Z             {
2026-08-28T09:54:46.4473078Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4473237Z               "line": 480
2026-08-28T09:54:46.4473383Z             },
2026-08-28T09:54:46.4473526Z             {
2026-08-28T09:54:46.4473738Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4473929Z               "line": 726
2026-08-28T09:54:46.4474076Z             },
2026-08-28T09:54:46.4474268Z             {
2026-08-28T09:54:46.4474467Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4474630Z               "line": 880
2026-08-28T09:54:46.4474772Z             }
2026-08-28T09:54:46.4474925Z           ]
2026-08-28T09:54:46.4475068Z         },
2026-08-28T09:54:46.4475217Z         "int": {
2026-08-28T09:54:46.4475378Z           "complete": true,
2026-08-28T09:54:46.4475532Z           "evidence": [
2026-08-28T09:54:46.4475683Z             {
2026-08-28T09:54:46.4475912Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:46.4476061Z               "line": 535
2026-08-28T09:54:46.4476199Z             },
2026-08-28T09:54:46.4476335Z             {
2026-08-28T09:54:46.4476572Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:46.4476729Z               "line": 595
2026-08-28T09:54:46.4476991Z             },
2026-08-28T09:54:46.4477135Z             {
2026-08-28T09:54:46.4477364Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:46.4477517Z               "line": 797
2026-08-28T09:54:46.4477668Z             }
2026-08-28T09:54:46.4477811Z           ]
2026-08-28T09:54:46.4477964Z         },
2026-08-28T09:54:46.4478117Z         "unit": {
2026-08-28T09:54:46.4478279Z           "complete": true,
2026-08-28T09:54:46.4478436Z           "evidence": [
2026-08-28T09:54:46.4478584Z             {
2026-08-28T09:54:46.4478793Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4479012Z               "line": 2816
2026-08-28T09:54:46.4479224Z             },
2026-08-28T09:54:46.4479368Z             {
2026-08-28T09:54:46.4479577Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4479740Z               "line": 2852
2026-08-28T09:54:46.4479891Z             },
2026-08-28T09:54:46.4480040Z             {
2026-08-28T09:54:46.4480240Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4480402Z               "line": 2875
2026-08-28T09:54:46.4480545Z             },
2026-08-28T09:54:46.4480693Z             {
2026-08-28T09:54:46.4480894Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4481060Z               "line": 2906
2026-08-28T09:54:46.4481209Z             },
2026-08-28T09:54:46.4481355Z             {
2026-08-28T09:54:46.4481562Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.4481717Z               "line": 2984
2026-08-28T09:54:46.4481870Z             }
2026-08-28T09:54:46.4482013Z           ]
2026-08-28T09:54:46.4482165Z         }
2026-08-28T09:54:46.4482314Z       }
2026-08-28T09:54:46.4482461Z     },
2026-08-28T09:54:46.4482609Z     {
2026-08-28T09:54:46.4482799Z       "id": "REQ-DISPATCH-HYGIENE-TELEMETRY",
2026-08-28T09:54:46.4487376Z       "title": "REDISPATCH-STALL W1 (ADR-0038 Amendment, fixes 7+8+9): dispatcher hygiene + keyed observability — (a) bounded redispatch worker pool with batched cold enumeration, NO claim locks held during I/O (today thread::spawn per stream, unbounded on a cold table); (b) sessions-lock discipline: clone-then-drop before detach_if/info.json I/O (KH 7.12 kin — no fs/conn I/O under global locks); (c) keyed stage telemetry: gen/stream/family/endpoint/attempt/conn on every dispatch record + replay/poison/cancel/worker-outcome events + gauges + PTY high-water/RC cursor — the field-discriminator surface (poison-window census, stream-sub-attach per generation dropping to O(active streams)). Gate: impl — pool + enumeration batching + lock discipline + telemetry keys; unit — pool bound honored under a cold flood + no-lock-across-I/O seam + telemetry key completeness; doc — ADR-0038 Amendment. Kin REQ-HAZARD-REDISPATCH-STALL, KH 7.12 (locks), REQ-CONN-POISON-ATTRIBUTION (extends its attribution).",
2026-08-28T09:54:46.4487676Z       "requiredStages": [
2026-08-28T09:54:46.4487832Z         "doc",
2026-08-28T09:54:46.4487986Z         "impl",
2026-08-28T09:54:46.4488138Z         "unit"
2026-08-28T09:54:46.4488291Z       ],
2026-08-28T09:54:46.4488443Z       "stages": {
2026-08-28T09:54:46.4488597Z         "doc": {
2026-08-28T09:54:46.4488763Z           "complete": true,
2026-08-28T09:54:46.4488916Z           "evidence": [
2026-08-28T09:54:46.4489163Z             {
2026-08-28T09:54:46.4489415Z               "path": "docs/adr/0038-broker-stream-lifecycle-truth.md",
2026-08-28T09:54:46.4489567Z               "line": 77
2026-08-28T09:54:46.4489717Z             }
2026-08-28T09:54:46.4489861Z           ]
2026-08-28T09:54:46.4490009Z         },
2026-08-28T09:54:46.4490166Z         "impl": {
2026-08-28T09:54:46.4490328Z           "complete": true,
2026-08-28T09:54:46.4490481Z           "evidence": [
2026-08-28T09:54:46.4490634Z             {
2026-08-28T09:54:46.4490839Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4491000Z               "line": 6058
2026-08-28T09:54:46.4491262Z             },
2026-08-28T09:54:46.4491405Z             {
2026-08-28T09:54:46.4491620Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4491769Z               "line": 659
2026-08-28T09:54:46.4491925Z             },
2026-08-28T09:54:46.4492065Z             {
2026-08-28T09:54:46.4492272Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4492468Z               "line": 734
2026-08-28T09:54:46.4492611Z             },
2026-08-28T09:54:46.4492759Z             {
2026-08-28T09:54:46.4492954Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4493107Z               "line": 826
2026-08-28T09:54:46.4493249Z             },
2026-08-28T09:54:46.4493408Z             {
2026-08-28T09:54:46.4493631Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4493789Z               "line": 932
2026-08-28T09:54:46.4493941Z             }
2026-08-28T09:54:46.4494089Z           ]
2026-08-28T09:54:46.4494246Z         },
2026-08-28T09:54:46.4494400Z         "int": {
2026-08-28T09:54:46.4494555Z           "complete": false,
2026-08-28T09:54:46.4494717Z           "evidence": []
2026-08-28T09:54:46.4494872Z         },
2026-08-28T09:54:46.4495020Z         "unit": {
2026-08-28T09:54:46.4495187Z           "complete": true,
2026-08-28T09:54:46.4495345Z           "evidence": [
2026-08-28T09:54:46.4495492Z             {
2026-08-28T09:54:46.4495693Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4495849Z               "line": 3042
2026-08-28T09:54:46.4496003Z             },
2026-08-28T09:54:46.4496145Z             {
2026-08-28T09:54:46.4496460Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4496652Z               "line": 3075
2026-08-28T09:54:46.4496808Z             },
2026-08-28T09:54:46.4496971Z             {
2026-08-28T09:54:46.4497167Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.4497437Z               "line": 3099
2026-08-28T09:54:46.4497599Z             }
2026-08-28T09:54:46.4497777Z           ]
2026-08-28T09:54:46.4497945Z         }
2026-08-28T09:54:46.4498087Z       }
2026-08-28T09:54:46.4498236Z     },
2026-08-28T09:54:46.4498383Z     {
2026-08-28T09:54:46.4498556Z       "id": "REQ-DOC-DELIVERY-VOCAB",
2026-08-28T09:54:46.4500354Z       "title": "W6 (LIFECYCLE-TRUTH, docs — remaining flynn/perri gaps folded): publish the full send-outcome vocabulary (SENT / SENT(WAN) / QUEUED window semantics / DEFERRED / NO_PERCH), digest --json row schema, api poll auth + MAC-stamp prefix, remaining --json shapes checklist (seed #3). Public docs use VERSION numbers, never wave codes; docs-publish drift gate applies.",
2026-08-28T09:54:46.4500527Z       "requiredStages": [
2026-08-28T09:54:46.4500678Z         "doc"
2026-08-28T09:54:46.4500836Z       ],
2026-08-28T09:54:46.4500998Z       "stages": {
2026-08-28T09:54:46.4501146Z         "doc": {
2026-08-28T09:54:46.4501307Z           "complete": true,
2026-08-28T09:54:46.4501466Z           "evidence": [
2026-08-28T09:54:46.4501622Z             {
2026-08-28T09:54:46.4501832Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:46.4501995Z               "line": 90
2026-08-28T09:54:46.4502137Z             },
2026-08-28T09:54:46.4502285Z             {
2026-08-28T09:54:46.4502504Z               "path": "docs-site/src/reference/json-shapes.md",
2026-08-28T09:54:46.4502654Z               "line": 3
2026-08-28T09:54:46.4502804Z             }
2026-08-28T09:54:46.4502966Z           ]
2026-08-28T09:54:46.4503124Z         },
2026-08-28T09:54:46.4503276Z         "impl": {
2026-08-28T09:54:46.4503443Z           "complete": false,
2026-08-28T09:54:46.4503596Z           "evidence": []
2026-08-28T09:54:46.4503749Z         },
2026-08-28T09:54:46.4503901Z         "int": {
2026-08-28T09:54:46.4504058Z           "complete": false,
2026-08-28T09:54:46.4504215Z           "evidence": []
2026-08-28T09:54:46.4504363Z         },
2026-08-28T09:54:46.4504520Z         "unit": {
2026-08-28T09:54:46.4504683Z           "complete": false,
2026-08-28T09:54:46.4504956Z           "evidence": []
2026-08-28T09:54:46.4505149Z         }
2026-08-28T09:54:46.4505301Z       }
2026-08-28T09:54:46.4505447Z     },
2026-08-28T09:54:46.4505595Z     {
2026-08-28T09:54:46.4505838Z       "id": "REQ-DOC-ECHO-COMMUNE-CONTRACT",
2026-08-28T09:54:46.4508044Z       "title": "W6 (LIFECYCLE-TRUTH, docs — this gap cost a full outage night, priority slot): publish the [session.echo_commune] I/O contract on the docs-site: key catalog core fills; core does NOT stdin-feed [history] (field-proven); self-locate guidance incl. CLAUDE_CONFIG_DIR / read_env; drop-file protocol (single-writer, ingest-deletes, resolver semantics from W1); stdout ingestion expectations. Public docs use VERSION numbers, never wave codes; docs-publish drift gate applies.",
2026-08-28T09:54:46.4508215Z       "requiredStages": [
2026-08-28T09:54:46.4508366Z         "doc"
2026-08-28T09:54:46.4508515Z       ],
2026-08-28T09:54:46.4508676Z       "stages": {
2026-08-28T09:54:46.4508830Z         "doc": {
2026-08-28T09:54:46.4509083Z           "complete": true,
2026-08-28T09:54:46.4509244Z           "evidence": [
2026-08-28T09:54:46.4509393Z             {
2026-08-28T09:54:46.4509644Z               "path": "docs-site/src/harness-contract/echo-commune.md",
2026-08-28T09:54:46.4509802Z               "line": 20
2026-08-28T09:54:46.4509959Z             }
2026-08-28T09:54:46.4510108Z           ]
2026-08-28T09:54:46.4510259Z         },
2026-08-28T09:54:46.4510408Z         "impl": {
2026-08-28T09:54:46.4510582Z           "complete": false,
2026-08-28T09:54:46.4510740Z           "evidence": []
2026-08-28T09:54:46.4510895Z         },
2026-08-28T09:54:46.4511044Z         "int": {
2026-08-28T09:54:46.4511209Z           "complete": false,
2026-08-28T09:54:46.4514036Z           "evidence": []
2026-08-28T09:54:46.4514223Z         },
2026-08-28T09:54:46.4514413Z         "unit": {
2026-08-28T09:54:46.4514627Z           "complete": false,
2026-08-28T09:54:46.4514956Z           "evidence": []
2026-08-28T09:54:46.4515105Z         }
2026-08-28T09:54:46.4515261Z       }
2026-08-28T09:54:46.4515405Z     },
2026-08-28T09:54:46.4515553Z     {
2026-08-28T09:54:46.4515757Z       "id": "REQ-DOC-ENDPOINT-DROP-RESOLUTION",
2026-08-28T09:54:46.4517667Z       "title": "D1 (F028, perri F-c; docs/truth): SI-1's resolution rule — a RELATIVE watched drop dir resolves against the ENDPOINT's cwd, never the daemon's (KH 7.28, shipped v0.22.0) — is documented NOWHERE public. Add it to harness-contract/manifest.md + the manifest schema field descriptions so an adapter author knows a relative commune_dir/signoff_dir is endpoint-resolved. docs-drift gate applies. See triage D1.",
2026-08-28T09:54:46.4517842Z       "requiredStages": [],
2026-08-28T09:54:46.4517992Z       "stages": {
2026-08-28T09:54:46.4518147Z         "doc": {
2026-08-28T09:54:46.4518311Z           "complete": false,
2026-08-28T09:54:46.4518476Z           "evidence": []
2026-08-28T09:54:46.4518629Z         },
2026-08-28T09:54:46.4518784Z         "impl": {
2026-08-28T09:54:46.4519051Z           "complete": false,
2026-08-28T09:54:46.4519212Z           "evidence": []
2026-08-28T09:54:46.4519361Z         },
2026-08-28T09:54:46.4519503Z         "int": {
2026-08-28T09:54:46.4519666Z           "complete": false,
2026-08-28T09:54:46.4519823Z           "evidence": []
2026-08-28T09:54:46.4519972Z         },
2026-08-28T09:54:46.4520128Z         "unit": {
2026-08-28T09:54:46.4520282Z           "complete": false,
2026-08-28T09:54:46.4520438Z           "evidence": []
2026-08-28T09:54:46.4520583Z         }
2026-08-28T09:54:46.4520738Z       }
2026-08-28T09:54:46.4520883Z     },
2026-08-28T09:54:46.4521029Z     {
2026-08-28T09:54:46.4521185Z       "id": "REQ-DOCS-1",
2026-08-28T09:54:46.4521517Z       "title": "Dual-audience docs (human + AI dev-agent), markdown once / two depths",
2026-08-28T09:54:46.4521680Z       "requiredStages": [
2026-08-28T09:54:46.4521827Z         "doc",
2026-08-28T09:54:46.4521980Z         "impl"
2026-08-28T09:54:46.4522127Z       ],
2026-08-28T09:54:46.4522281Z       "stages": {
2026-08-28T09:54:46.4522543Z         "doc": {
2026-08-28T09:54:46.4522709Z           "complete": true,
2026-08-28T09:54:46.4522863Z           "evidence": [
2026-08-28T09:54:46.4523015Z             {
2026-08-28T09:54:46.4523206Z               "path": "docs-site/src/index.md",
2026-08-28T09:54:46.4523358Z               "line": 49
2026-08-28T09:54:46.4523507Z             }
2026-08-28T09:54:46.4523649Z           ]
2026-08-28T09:54:46.4523798Z         },
2026-08-28T09:54:46.4523948Z         "impl": {
2026-08-28T09:54:46.4524110Z           "complete": true,
2026-08-28T09:54:46.4524268Z           "evidence": [
2026-08-28T09:54:46.4524416Z             {
2026-08-28T09:54:46.4524601Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4524755Z               "line": 13
2026-08-28T09:54:46.4524902Z             }
2026-08-28T09:54:46.4525045Z           ]
2026-08-28T09:54:46.4525197Z         },
2026-08-28T09:54:46.4525345Z         "int": {
2026-08-28T09:54:46.4525516Z           "complete": false,
2026-08-28T09:54:46.4525675Z           "evidence": []
2026-08-28T09:54:46.4525822Z         },
2026-08-28T09:54:46.4525999Z         "unit": {
2026-08-28T09:54:46.4526151Z           "complete": false,
2026-08-28T09:54:46.4526312Z           "evidence": []
2026-08-28T09:54:46.4526459Z         }
2026-08-28T09:54:46.4526605Z       }
2026-08-28T09:54:46.4526749Z     },
2026-08-28T09:54:46.4526901Z     {
2026-08-28T09:54:46.4527059Z       "id": "REQ-DOCS-2",
2026-08-28T09:54:46.4527331Z       "title": "Sub-10-minute runnable killer quickstart per audience",
2026-08-28T09:54:46.4527482Z       "requiredStages": [
2026-08-28T09:54:46.4527627Z         "doc",
2026-08-28T09:54:46.4527783Z         "int"
2026-08-28T09:54:46.4527927Z       ],
2026-08-28T09:54:46.4528084Z       "stages": {
2026-08-28T09:54:46.4528227Z         "doc": {
2026-08-28T09:54:46.4528388Z           "complete": true,
2026-08-28T09:54:46.4528542Z           "evidence": [
2026-08-28T09:54:46.4528794Z             {
2026-08-28T09:54:46.4529174Z               "path": "docs-site/src/harness-contract/integration-checklist.md",
2026-08-28T09:54:46.4529330Z               "line": 3
2026-08-28T09:54:46.4529486Z             },
2026-08-28T09:54:46.4529640Z             {
2026-08-28T09:54:46.4529854Z               "path": "docs-site/src/quickstart/adapter.md",
2026-08-28T09:54:46.4530011Z               "line": 3
2026-08-28T09:54:46.4530160Z             },
2026-08-28T09:54:46.4530303Z             {
2026-08-28T09:54:46.4530518Z               "path": "docs-site/src/quickstart/messaging.md",
2026-08-28T09:54:46.4530679Z               "line": 3
2026-08-28T09:54:46.4530828Z             }
2026-08-28T09:54:46.4530974Z           ]
2026-08-28T09:54:46.4531123Z         },
2026-08-28T09:54:46.4531284Z         "impl": {
2026-08-28T09:54:46.4531448Z           "complete": false,
2026-08-28T09:54:46.4531608Z           "evidence": []
2026-08-28T09:54:46.4531755Z         },
2026-08-28T09:54:46.4531902Z         "int": {
2026-08-28T09:54:46.4532072Z           "complete": true,
2026-08-28T09:54:46.4532231Z           "evidence": [
2026-08-28T09:54:46.4532378Z             {
2026-08-28T09:54:46.4532583Z               "path": "crates/spt/tests/quickstart_e2e.rs",
2026-08-28T09:54:46.4532736Z               "line": 14
2026-08-28T09:54:46.4532883Z             }
2026-08-28T09:54:46.4533031Z           ]
2026-08-28T09:54:46.4533179Z         },
2026-08-28T09:54:46.4533327Z         "unit": {
2026-08-28T09:54:46.4533489Z           "complete": false,
2026-08-28T09:54:46.4533641Z           "evidence": []
2026-08-28T09:54:46.4533789Z         }
2026-08-28T09:54:46.4533956Z       }
2026-08-28T09:54:46.4534142Z     },
2026-08-28T09:54:46.4534286Z     {
2026-08-28T09:54:46.4534452Z       "id": "REQ-DOCS-3",
2026-08-28T09:54:46.4534747Z       "title": "Diátaxis structure; one canonical way to do X",
2026-08-28T09:54:46.4534918Z       "requiredStages": [
2026-08-28T09:54:46.4535067Z         "doc"
2026-08-28T09:54:46.4535204Z       ],
2026-08-28T09:54:46.4535358Z       "stages": {
2026-08-28T09:54:46.4535505Z         "doc": {
2026-08-28T09:54:46.4535886Z           "complete": true,
2026-08-28T09:54:46.4536044Z           "evidence": [
2026-08-28T09:54:46.4536191Z             {
2026-08-28T09:54:46.4536382Z               "path": "docs-site/src/index.md",
2026-08-28T09:54:46.4536544Z               "line": 41
2026-08-28T09:54:46.4536697Z             }
2026-08-28T09:54:46.4536843Z           ]
2026-08-28T09:54:46.4536996Z         },
2026-08-28T09:54:46.4537146Z         "impl": {
2026-08-28T09:54:46.4537376Z           "complete": false,
2026-08-28T09:54:46.4537533Z           "evidence": []
2026-08-28T09:54:46.4537690Z         },
2026-08-28T09:54:46.4537838Z         "int": {
2026-08-28T09:54:46.4538001Z           "complete": false,
2026-08-28T09:54:46.4538168Z           "evidence": []
2026-08-28T09:54:46.4538315Z         },
2026-08-28T09:54:46.4538467Z         "unit": {
2026-08-28T09:54:46.4538624Z           "complete": false,
2026-08-28T09:54:46.4538777Z           "evidence": []
2026-08-28T09:54:46.4538930Z         }
2026-08-28T09:54:46.4539165Z       }
2026-08-28T09:54:46.4539311Z     },
2026-08-28T09:54:46.4539456Z     {
2026-08-28T09:54:46.4539620Z       "id": "REQ-DOCS-4",
2026-08-28T09:54:46.4539942Z       "title": "Agent-consumable layer (llms.txt, manifest schema, MCP, CLI help)",
2026-08-28T09:54:46.4540104Z       "requiredStages": [
2026-08-28T09:54:46.4540252Z         "doc",
2026-08-28T09:54:46.4540410Z         "impl",
2026-08-28T09:54:46.4540553Z         "unit"
2026-08-28T09:54:46.4540700Z       ],
2026-08-28T09:54:46.4540848Z       "stages": {
2026-08-28T09:54:46.4541000Z         "doc": {
2026-08-28T09:54:46.4541162Z           "complete": true,
2026-08-28T09:54:46.4541320Z           "evidence": [
2026-08-28T09:54:46.4541473Z             {
2026-08-28T09:54:46.4541654Z               "path": "docs/DOCS-STRATEGY.md",
2026-08-28T09:54:46.4541811Z               "line": 35
2026-08-28T09:54:46.4541959Z             }
2026-08-28T09:54:46.4542107Z           ]
2026-08-28T09:54:46.4542368Z         },
2026-08-28T09:54:46.4542518Z         "impl": {
2026-08-28T09:54:46.4542695Z           "complete": true,
2026-08-28T09:54:46.4542852Z           "evidence": [
2026-08-28T09:54:46.4543001Z             {
2026-08-28T09:54:46.4543210Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.4543367Z               "line": 1071
2026-08-28T09:54:46.4543519Z             },
2026-08-28T09:54:46.4543668Z             {
2026-08-28T09:54:46.4543853Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4544006Z               "line": 14
2026-08-28T09:54:46.4544154Z             }
2026-08-28T09:54:46.4544298Z           ]
2026-08-28T09:54:46.4544450Z         },
2026-08-28T09:54:46.4544594Z         "int": {
2026-08-28T09:54:46.4544759Z           "complete": false,
2026-08-28T09:54:46.4544914Z           "evidence": []
2026-08-28T09:54:46.4545059Z         },
2026-08-28T09:54:46.4545206Z         "unit": {
2026-08-28T09:54:46.4545369Z           "complete": true,
2026-08-28T09:54:46.4545536Z           "evidence": [
2026-08-28T09:54:46.4545684Z             {
2026-08-28T09:54:46.4545894Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.4546050Z               "line": 2409
2026-08-28T09:54:46.4546199Z             }
2026-08-28T09:54:46.4546347Z           ]
2026-08-28T09:54:46.4546495Z         }
2026-08-28T09:54:46.4546633Z       }
2026-08-28T09:54:46.4546785Z     },
2026-08-28T09:54:46.4546933Z     {
2026-08-28T09:54:46.4547090Z       "id": "REQ-DOCS-5",
2026-08-28T09:54:46.4547418Z       "title": "Anti-drift: rustdoc/schema/exports/CLI-help generated + CI-checked",
2026-08-28T09:54:46.4547579Z       "requiredStages": [
2026-08-28T09:54:46.4547725Z         "impl",
2026-08-28T09:54:46.4547869Z         "int"
2026-08-28T09:54:46.4548021Z       ],
2026-08-28T09:54:46.4548170Z       "stages": {
2026-08-28T09:54:46.4548321Z         "doc": {
2026-08-28T09:54:46.4548490Z           "complete": false,
2026-08-28T09:54:46.4548640Z           "evidence": []
2026-08-28T09:54:46.4548795Z         },
2026-08-28T09:54:46.4549147Z         "impl": {
2026-08-28T09:54:46.4549328Z           "complete": true,
2026-08-28T09:54:46.4549481Z           "evidence": [
2026-08-28T09:54:46.4549628Z             {
2026-08-28T09:54:46.4549833Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.4550001Z               "line": 1072
2026-08-28T09:54:46.4550153Z             },
2026-08-28T09:54:46.4550294Z             {
2026-08-28T09:54:46.4550479Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4550636Z               "line": 138
2026-08-28T09:54:46.4550785Z             },
2026-08-28T09:54:46.4550931Z             {
2026-08-28T09:54:46.4551118Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4551270Z               "line": 181
2026-08-28T09:54:46.4551418Z             },
2026-08-28T09:54:46.4551565Z             {
2026-08-28T09:54:46.4551746Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4551904Z               "line": 985
2026-08-28T09:54:46.4552052Z             }
2026-08-28T09:54:46.4552205Z           ]
2026-08-28T09:54:46.4552348Z         },
2026-08-28T09:54:46.4552505Z         "int": {
2026-08-28T09:54:46.4552658Z           "complete": true,
2026-08-28T09:54:46.4552818Z           "evidence": [
2026-08-28T09:54:46.4552966Z             {
2026-08-28T09:54:46.4553159Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.4553318Z               "line": 559
2026-08-28T09:54:46.4553464Z             },
2026-08-28T09:54:46.4553613Z             {
2026-08-28T09:54:46.4553822Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.4553985Z               "line": 2444
2026-08-28T09:54:46.4554127Z             }
2026-08-28T09:54:46.4554275Z           ]
2026-08-28T09:54:46.4554423Z         },
2026-08-28T09:54:46.4554571Z         "unit": {
2026-08-28T09:54:46.4554733Z           "complete": true,
2026-08-28T09:54:46.4554891Z           "evidence": [
2026-08-28T09:54:46.4555139Z             {
2026-08-28T09:54:46.4555319Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4555483Z               "line": 206
2026-08-28T09:54:46.4555624Z             },
2026-08-28T09:54:46.4555776Z             {
2026-08-28T09:54:46.4555958Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4556106Z               "line": 2326
2026-08-28T09:54:46.4556253Z             }
2026-08-28T09:54:46.4556396Z           ]
2026-08-28T09:54:46.4556545Z         }
2026-08-28T09:54:46.4556692Z       }
2026-08-28T09:54:46.4556840Z     },
2026-08-28T09:54:46.4556987Z     {
2026-08-28T09:54:46.4557145Z       "id": "REQ-DOCS-6",
2026-08-28T09:54:46.4557675Z       "title": "spt how-to <topic>: in-binary task-oriented agent instructions (anti-drift; quickstart prompts point agents at it)",
2026-08-28T09:54:46.4557841Z       "requiredStages": [
2026-08-28T09:54:46.4557992Z         "impl",
2026-08-28T09:54:46.4558139Z         "unit",
2026-08-28T09:54:46.4558281Z         "int"
2026-08-28T09:54:46.4558430Z       ],
2026-08-28T09:54:46.4558586Z       "stages": {
2026-08-28T09:54:46.4558735Z         "doc": {
2026-08-28T09:54:46.4558900Z           "complete": true,
2026-08-28T09:54:46.4559144Z           "evidence": [
2026-08-28T09:54:46.4559288Z             {
2026-08-28T09:54:46.4559511Z               "path": "docs-site/src/quickstart/messaging.md",
2026-08-28T09:54:46.4559660Z               "line": 4
2026-08-28T09:54:46.4559817Z             }
2026-08-28T09:54:46.4559961Z           ]
2026-08-28T09:54:46.4560107Z         },
2026-08-28T09:54:46.4560261Z         "impl": {
2026-08-28T09:54:46.4560417Z           "complete": true,
2026-08-28T09:54:46.4560571Z           "evidence": [
2026-08-28T09:54:46.4560722Z             {
2026-08-28T09:54:46.4560898Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4561063Z               "line": 15432
2026-08-28T09:54:46.4561234Z             }
2026-08-28T09:54:46.4561382Z           ]
2026-08-28T09:54:46.4561515Z         },
2026-08-28T09:54:46.4561683Z         "int": {
2026-08-28T09:54:46.4561845Z           "complete": true,
2026-08-28T09:54:46.4562121Z           "evidence": [
2026-08-28T09:54:46.4562265Z             {
2026-08-28T09:54:46.4562474Z               "path": "crates/spt/tests/quickstart_e2e.rs",
2026-08-28T09:54:46.4562626Z               "line": 39
2026-08-28T09:54:46.4562774Z             }
2026-08-28T09:54:46.4562918Z           ]
2026-08-28T09:54:46.4563070Z         },
2026-08-28T09:54:46.4563228Z         "unit": {
2026-08-28T09:54:46.4563393Z           "complete": true,
2026-08-28T09:54:46.4563550Z           "evidence": [
2026-08-28T09:54:46.4563696Z             {
2026-08-28T09:54:46.4563878Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4564034Z               "line": 38071
2026-08-28T09:54:46.4564183Z             }
2026-08-28T09:54:46.4564325Z           ]
2026-08-28T09:54:46.4564469Z         }
2026-08-28T09:54:46.4564620Z       }
2026-08-28T09:54:46.4564760Z     },
2026-08-28T09:54:46.4564912Z     {
2026-08-28T09:54:46.4565089Z       "id": "REQ-DOCS-LOCAL-SERVER",
2026-08-28T09:54:46.4571268Z       "title": "THE-FORKENING W3 (ADR-0036 §4, operator-ruled crate-over-handroll + port 5474): the daemon (broker side — docs are up whenever the daemon is) serves $SPT_HOME/docs over HTTP on LOOPBACK ONLY, default 127.0.0.1:5474 (+ ::1 where available; 547 rejected — privileged <1024 breaks the Linux user-daemon + IANA dhcpv6-server), config + env override. Implementation = hyper (ALREADY in-tree via iroh/reqwest — zero new supply chain; operator ruled battle-tested crate over hand-rolled HTTP). GET-only; strict path-sanitize under $SPT_HOME/docs (reject .., absolute, encoded traversal); bounded write discipline (conn-hazard class). Published URL surface preserved VERBATIM (llms.txt contract: /llms-full.txt, append-.md raw, /manifest.schema.json — flynn/perri doc habits must not break). Verbs: `spt docs url` prints the resolved URL honoring overrides; bare `spt docs` opens the system browser (cfg(windows) creation_flags no-console). NEVER 0.0.0.0 — a LAN-visible server re-leaks what privating hid. Gate: unit — path-sanitize rejections + content-type map + loopback-only bind config; int — daemon up serves book index + llms-full.txt + a raw .md byte-true from a landed bundle; doc — CONTEXT.md Docs Server entry + docs-site self-reference updated (site-url). Kin REQ-DOCS-RELEASE-ASSET (the producer), ADR-0036, translation-binary console-window gotcha.",
2026-08-28T09:54:46.4571576Z       "requiredStages": [
2026-08-28T09:54:46.4571732Z         "doc",
2026-08-28T09:54:46.4571880Z         "impl",
2026-08-28T09:54:46.4572027Z         "unit",
2026-08-28T09:54:46.4572172Z         "int"
2026-08-28T09:54:46.4572318Z       ],
2026-08-28T09:54:46.4572472Z       "stages": {
2026-08-28T09:54:46.4572619Z         "doc": {
2026-08-28T09:54:46.4572782Z           "complete": true,
2026-08-28T09:54:46.4572943Z           "evidence": [
2026-08-28T09:54:46.4573087Z             {
2026-08-28T09:54:46.4573258Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.4573421Z               "line": 679
2026-08-28T09:54:46.4573573Z             }
2026-08-28T09:54:46.4573722Z           ]
2026-08-28T09:54:46.4573872Z         },
2026-08-28T09:54:46.4574020Z         "impl": {
2026-08-28T09:54:46.4574180Z           "complete": true,
2026-08-28T09:54:46.4574328Z           "evidence": [
2026-08-28T09:54:46.4574476Z             {
2026-08-28T09:54:46.4574681Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4574847Z               "line": 258
2026-08-28T09:54:46.4574991Z             },
2026-08-28T09:54:46.4575144Z             {
2026-08-28T09:54:46.4575358Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4575601Z               "line": 41
2026-08-28T09:54:46.4575820Z             },
2026-08-28T09:54:46.4576040Z             {
2026-08-28T09:54:46.4576251Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4576406Z               "line": 69
2026-08-28T09:54:46.4576565Z             },
2026-08-28T09:54:46.4576721Z             {
2026-08-28T09:54:46.4576916Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4577197Z               "line": 99
2026-08-28T09:54:46.4577346Z             },
2026-08-28T09:54:46.4577497Z             {
2026-08-28T09:54:46.4577698Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4577860Z               "line": 128
2026-08-28T09:54:46.4578008Z             },
2026-08-28T09:54:46.4578151Z             {
2026-08-28T09:54:46.4578360Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4578519Z               "line": 166
2026-08-28T09:54:46.4578670Z             },
2026-08-28T09:54:46.4578805Z             {
2026-08-28T09:54:46.4579093Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4579254Z               "line": 269
2026-08-28T09:54:46.4579401Z             },
2026-08-28T09:54:46.4579545Z             {
2026-08-28T09:54:46.4579730Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4579893Z               "line": 2445
2026-08-28T09:54:46.4580030Z             },
2026-08-28T09:54:46.4580184Z             {
2026-08-28T09:54:46.4580384Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4580546Z               "line": 9840
2026-08-28T09:54:46.4580693Z             }
2026-08-28T09:54:46.4580846Z           ]
2026-08-28T09:54:46.4580989Z         },
2026-08-28T09:54:46.4581175Z         "int": {
2026-08-28T09:54:46.4581333Z           "complete": true,
2026-08-28T09:54:46.4581494Z           "evidence": [
2026-08-28T09:54:46.4581643Z             {
2026-08-28T09:54:46.4581875Z               "path": "crates/spt-daemon/tests/docs_server_e2e.rs",
2026-08-28T09:54:46.4582037Z               "line": 12
2026-08-28T09:54:46.4582183Z             }
2026-08-28T09:54:46.4582335Z           ]
2026-08-28T09:54:46.4582483Z         },
2026-08-28T09:54:46.4582679Z         "unit": {
2026-08-28T09:54:46.4582840Z           "complete": true,
2026-08-28T09:54:46.4582994Z           "evidence": [
2026-08-28T09:54:46.4583251Z             {
2026-08-28T09:54:46.4583461Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:46.4583624Z               "line": 311
2026-08-28T09:54:46.4583770Z             }
2026-08-28T09:54:46.4583919Z           ]
2026-08-28T09:54:46.4584061Z         }
2026-08-28T09:54:46.4584220Z       }
2026-08-28T09:54:46.4584372Z     },
2026-08-28T09:54:46.4584513Z     {
2026-08-28T09:54:46.4584707Z       "id": "REQ-DOCS-NO-INTERIOR-SPACE-RUNS",
2026-08-28T09:54:46.4594240Z       "title": "Operator-facing text carries no INTERIOR run of 3+ spaces, judged on RENDERED bytes rather than source text. The defect is a Rust line-continuation backslash that a generator or a careless edit ATE: the literal still compiles, still passes every suite, and only the rendered message is wrong, so no gate we run can see it and only a diff read ever has. The check must RENDER, because a HEALTHY continuation puts a real run of spaces in the file on the next line every time (releases#74 own instance carries thirteen and renders with one) — a source-text scan therefore flags every correctly-continued literal in the crate, and a check with that false-positive rate is one somebody switches off. SCOPE (doyle, re-ruled on the #208 evidence): IN = CLI help and CLI stdout/stderr AND daemon-emitted operator diagnostics, one surface wider than the original brief because the five literals that re-opened the class lived in daemon diagnostics; OUT = test assertion messages, read by someone already reading a trace. A deliberate run stays possible via a per-site greppable `spacerun-ok: <token>` marker carrying a REASON TOKEN, so an exception is a decision written down rather than a hole the gate cannot see; per-site is ruled, because an idiom-aware exemption would have to DETECT alignment, alignment is fuzzy, and any rule recognising `this looks aligned` eventually exempts an eaten continuation that happens to look aligned — a silent false negative in the one direction this check exists to prevent. THIS REQUIREMENT CLAIMS INTERIOR RUNS, NOT THE CLASS (doyle, 2026-08-22). A continuation dies two ways and only one is in reach: if the backslash is deleted AND the lines are joined, the indentation lands mid-sentence and is refused — the JOIN variant, which is measurably what 3416ffd3 repaired (pre-fix run = 18 spaces, those bytes now a cell); if the backslash alone is deleted, the literal keeps its newline and the indentation arrives as LEADING whitespace, which is NOT refused, deliberately, because a help block legitimately indents every line. The limit is named in the module doc as well as here so that greping this id cannot be read as the class being closed.",
2026-08-28T09:54:46.4594575Z       "requiredStages": [
2026-08-28T09:54:46.4594727Z         "impl",
2026-08-28T09:54:46.4594880Z         "unit"
2026-08-28T09:54:46.4595026Z       ],
2026-08-28T09:54:46.4595169Z       "stages": {
2026-08-28T09:54:46.4595329Z         "doc": {
2026-08-28T09:54:46.4595500Z           "complete": false,
2026-08-28T09:54:46.4595662Z           "evidence": []
2026-08-28T09:54:46.4595806Z         },
2026-08-28T09:54:46.4595967Z         "impl": {
2026-08-28T09:54:46.4596135Z           "complete": true,
2026-08-28T09:54:46.4596296Z           "evidence": [
2026-08-28T09:54:46.4596445Z             {
2026-08-28T09:54:46.4596640Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4596826Z               "line": 370
2026-08-28T09:54:46.4596983Z             },
2026-08-28T09:54:46.4597136Z             {
2026-08-28T09:54:46.4597332Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4597484Z               "line": 132
2026-08-28T09:54:46.4597637Z             },
2026-08-28T09:54:46.4597790Z             {
2026-08-28T09:54:46.4597983Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4598137Z               "line": 336
2026-08-28T09:54:46.4598289Z             },
2026-08-28T09:54:46.4598437Z             {
2026-08-28T09:54:46.4598632Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4598889Z               "line": 429
2026-08-28T09:54:46.4599138Z             },
2026-08-28T09:54:46.4599286Z             {
2026-08-28T09:54:46.4599481Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4599639Z               "line": 609
2026-08-28T09:54:46.4599790Z             }
2026-08-28T09:54:46.4599945Z           ]
2026-08-28T09:54:46.4600090Z         },
2026-08-28T09:54:46.4600248Z         "int": {
2026-08-28T09:54:46.4600412Z           "complete": false,
2026-08-28T09:54:46.4600574Z           "evidence": []
2026-08-28T09:54:46.4600718Z         },
2026-08-28T09:54:46.4600874Z         "unit": {
2026-08-28T09:54:46.4601042Z           "complete": true,
2026-08-28T09:54:46.4601199Z           "evidence": [
2026-08-28T09:54:46.4601347Z             {
2026-08-28T09:54:46.4601538Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4601691Z               "line": 648
2026-08-28T09:54:46.4601843Z             },
2026-08-28T09:54:46.4601990Z             {
2026-08-28T09:54:46.4602187Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4602353Z               "line": 666
2026-08-28T09:54:46.4602545Z             },
2026-08-28T09:54:46.4602773Z             {
2026-08-28T09:54:46.4603052Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4603247Z               "line": 678
2026-08-28T09:54:46.4603398Z             },
2026-08-28T09:54:46.4603542Z             {
2026-08-28T09:54:46.4603736Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4603885Z               "line": 690
2026-08-28T09:54:46.4604046Z             },
2026-08-28T09:54:46.4604219Z             {
2026-08-28T09:54:46.4604419Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4604576Z               "line": 702
2026-08-28T09:54:46.4604725Z             },
2026-08-28T09:54:46.4604872Z             {
2026-08-28T09:54:46.4605064Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4605224Z               "line": 711
2026-08-28T09:54:46.4605383Z             },
2026-08-28T09:54:46.4605662Z             {
2026-08-28T09:54:46.4605860Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4606013Z               "line": 714
2026-08-28T09:54:46.4606166Z             },
2026-08-28T09:54:46.4606313Z             {
2026-08-28T09:54:46.4606509Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4606657Z               "line": 721
2026-08-28T09:54:46.4606809Z             },
2026-08-28T09:54:46.4606962Z             {
2026-08-28T09:54:46.4607396Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4607567Z               "line": 730
2026-08-28T09:54:46.4607710Z             },
2026-08-28T09:54:46.4607877Z             {
2026-08-28T09:54:46.4608077Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4608226Z               "line": 740
2026-08-28T09:54:46.4608378Z             },
2026-08-28T09:54:46.4608519Z             {
2026-08-28T09:54:46.4608721Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4608877Z               "line": 830
2026-08-28T09:54:46.4609111Z             },
2026-08-28T09:54:46.4609312Z             {
2026-08-28T09:54:46.4609541Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4609688Z               "line": 838
2026-08-28T09:54:46.4609831Z             },
2026-08-28T09:54:46.4609984Z             {
2026-08-28T09:54:46.4610176Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4610336Z               "line": 841
2026-08-28T09:54:46.4610485Z             },
2026-08-28T09:54:46.4610683Z             {
2026-08-28T09:54:46.4610869Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4611029Z               "line": 877
2026-08-28T09:54:46.4611182Z             },
2026-08-28T09:54:46.4611334Z             {
2026-08-28T09:54:46.4611549Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4611706Z               "line": 923
2026-08-28T09:54:46.4611983Z             },
2026-08-28T09:54:46.4612146Z             {
2026-08-28T09:54:46.4612340Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4612508Z               "line": 1022
2026-08-28T09:54:46.4612713Z             },
2026-08-28T09:54:46.4612870Z             {
2026-08-28T09:54:46.4613062Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4613222Z               "line": 1041
2026-08-28T09:54:46.4613372Z             },
2026-08-28T09:54:46.4613523Z             {
2026-08-28T09:54:46.4613713Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4613868Z               "line": 1104
2026-08-28T09:54:46.4614016Z             },
2026-08-28T09:54:46.4614169Z             {
2026-08-28T09:54:46.4614360Z               "path": "crates/xtask/src/spacerun.rs",
2026-08-28T09:54:46.4614521Z               "line": 1113
2026-08-28T09:54:46.4614665Z             }
2026-08-28T09:54:46.4614817Z           ]
2026-08-28T09:54:46.4614975Z         }
2026-08-28T09:54:46.4615127Z       }
2026-08-28T09:54:46.4615280Z     },
2026-08-28T09:54:46.4615432Z     {
2026-08-28T09:54:46.4615619Z       "id": "REQ-DOCS-NO-INTERNAL-CODES",
2026-08-28T09:54:46.4618065Z       "title": "Public CLI --help (the clap `///` doc-comments) and the generated `docs-site/src/cli/reference.md` MUST NOT contain internal tracker/decision codes — `REQ-*`, `F-###`, `M#-W#`, `ADR-####`. They are meaningless to an end user reading --help and ship to GH-Pages. A CI-gated scan (the `xtask check` docs gate) fails on any such token in the GENERATED reference.md (which by construction contains only clap help, so rustdoc `///` on fns/structs is OUT of scope and keeps its REQ/ADR cross-refs). Substance is kept; codes are rewritten to plain language. (v0.13.2 W6)",
2026-08-28T09:54:46.4618242Z       "requiredStages": [
2026-08-28T09:54:46.4618394Z         "doc",
2026-08-28T09:54:46.4618548Z         "impl",
2026-08-28T09:54:46.4618700Z         "unit"
2026-08-28T09:54:46.4618849Z       ],
2026-08-28T09:54:46.4619109Z       "stages": {
2026-08-28T09:54:46.4619399Z         "doc": {
2026-08-28T09:54:46.4619576Z           "complete": true,
2026-08-28T09:54:46.4619738Z           "evidence": [
2026-08-28T09:54:46.4619886Z             {
2026-08-28T09:54:46.4620077Z               "path": "docs/DOCS-STRATEGY.md",
2026-08-28T09:54:46.4620234Z               "line": 59
2026-08-28T09:54:46.4620387Z             }
2026-08-28T09:54:46.4620539Z           ]
2026-08-28T09:54:46.4620692Z         },
2026-08-28T09:54:46.4620845Z         "impl": {
2026-08-28T09:54:46.4621016Z           "complete": true,
2026-08-28T09:54:46.4621178Z           "evidence": [
2026-08-28T09:54:46.4621325Z             {
2026-08-28T09:54:46.4621514Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4621670Z               "line": 308
2026-08-28T09:54:46.4621824Z             },
2026-08-28T09:54:46.4621999Z             {
2026-08-28T09:54:46.4622205Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4622401Z               "line": 446
2026-08-28T09:54:46.4622552Z             }
2026-08-28T09:54:46.4622711Z           ]
2026-08-28T09:54:46.4622863Z         },
2026-08-28T09:54:46.4623011Z         "int": {
2026-08-28T09:54:46.4623178Z           "complete": false,
2026-08-28T09:54:46.4623340Z           "evidence": []
2026-08-28T09:54:46.4623483Z         },
2026-08-28T09:54:46.4623636Z         "unit": {
2026-08-28T09:54:46.4623802Z           "complete": true,
2026-08-28T09:54:46.4623999Z           "evidence": [
2026-08-28T09:54:46.4624159Z             {
2026-08-28T09:54:46.4624377Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4624537Z               "line": 2287
2026-08-28T09:54:46.4624686Z             },
2026-08-28T09:54:46.4624838Z             {
2026-08-28T09:54:46.4625020Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4625181Z               "line": 2308
2026-08-28T09:54:46.4625329Z             }
2026-08-28T09:54:46.4625487Z           ]
2026-08-28T09:54:46.4625635Z         }
2026-08-28T09:54:46.4625912Z       }
2026-08-28T09:54:46.4626063Z     },
2026-08-28T09:54:46.4626222Z     {
2026-08-28T09:54:46.4626436Z       "id": "REQ-DOCS-RELEASE-ASSET",
2026-08-28T09:54:46.4630522Z       "title": "THE-FORKENING W2 (ADR-0036 §4): every release ships a platform-independent docs bundle `spt-docs.tar.gz` (BUILT mdbook output: HTML + llms.txt + llms-full.txt + raw .md + manifest.schema.json) as a release asset WITH an entry in the SIGNED update-set (sha256, same integrity chain as binaries — docs describe the security-relevant contract surface, they do not ride unverified). Apply lands/refreshes $SPT_HOME/docs (single current copy = docs always match the installed binary). FAILURE ISOLATION binding: a docs-asset failure NEVER fails the binary update — UPDATE_DOCS_SKIPPED loud, retried next fetch. Gate: unit — update-set entry + sha256 verify + skip-loud isolation; int — a fetch+apply lands version-matched docs at $SPT_HOME/docs; doc — self-update docs name the bundle. Kin REQ-DOCS-LOCAL-SERVER (the consumer), REQ-RELEASE-CHANNEL-PRIVATE (the assemble leg), ADR-0036.",
2026-08-28T09:54:46.4630714Z       "requiredStages": [
2026-08-28T09:54:46.4630875Z         "doc",
2026-08-28T09:54:46.4631024Z         "impl",
2026-08-28T09:54:46.4631180Z         "unit",
2026-08-28T09:54:46.4631334Z         "int"
2026-08-28T09:54:46.4631490Z       ],
2026-08-28T09:54:46.4631654Z       "stages": {
2026-08-28T09:54:46.4631800Z         "doc": {
2026-08-28T09:54:46.4631971Z           "complete": true,
2026-08-28T09:54:46.4632126Z           "evidence": [
2026-08-28T09:54:46.4632274Z             {
2026-08-28T09:54:46.4632446Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.4632617Z               "line": 677
2026-08-28T09:54:46.4632769Z             }
2026-08-28T09:54:46.4632923Z           ]
2026-08-28T09:54:46.4633074Z         },
2026-08-28T09:54:46.4633233Z         "impl": {
2026-08-28T09:54:46.4633404Z           "complete": true,
2026-08-28T09:54:46.4633562Z           "evidence": [
2026-08-28T09:54:46.4633723Z             {
2026-08-28T09:54:46.4633924Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:46.4634206Z               "line": 195
2026-08-28T09:54:46.4634367Z             },
2026-08-28T09:54:46.4634516Z             {
2026-08-28T09:54:46.4634733Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.4634890Z               "line": 54
2026-08-28T09:54:46.4635045Z             },
2026-08-28T09:54:46.4635189Z             {
2026-08-28T09:54:46.4635398Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.4635551Z               "line": 286
2026-08-28T09:54:46.4635708Z             },
2026-08-28T09:54:46.4635861Z             {
2026-08-28T09:54:46.4636061Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.4636228Z               "line": 296
2026-08-28T09:54:46.4636376Z             },
2026-08-28T09:54:46.4636533Z             {
2026-08-28T09:54:46.4636735Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.4636904Z               "line": 304
2026-08-28T09:54:46.4637064Z             },
2026-08-28T09:54:46.4637214Z             {
2026-08-28T09:54:46.4637485Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.4637645Z               "line": 311
2026-08-28T09:54:46.4637799Z             },
2026-08-28T09:54:46.4637950Z             {
2026-08-28T09:54:46.4638157Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.4638313Z               "line": 161
2026-08-28T09:54:46.4638466Z             },
2026-08-28T09:54:46.4638623Z             {
2026-08-28T09:54:46.4638828Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.4639076Z               "line": 169
2026-08-28T09:54:46.4639229Z             },
2026-08-28T09:54:46.4639377Z             {
2026-08-28T09:54:46.4639572Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.4639734Z               "line": 661
2026-08-28T09:54:46.4639887Z             },
2026-08-28T09:54:46.4640138Z             {
2026-08-28T09:54:46.4640344Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:46.4640501Z               "line": 1080
2026-08-28T09:54:46.4640654Z             },
2026-08-28T09:54:46.4640801Z             {
2026-08-28T09:54:46.4640987Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4641149Z               "line": 9299
2026-08-28T09:54:46.4641302Z             },
2026-08-28T09:54:46.4641454Z             {
2026-08-28T09:54:46.4641645Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4641812Z               "line": 9474
2026-08-28T09:54:46.4641960Z             },
2026-08-28T09:54:46.4642112Z             {
2026-08-28T09:54:46.4642288Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4642454Z               "line": 10748
2026-08-28T09:54:46.4642601Z             },
2026-08-28T09:54:46.4642757Z             {
2026-08-28T09:54:46.4642935Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4643106Z               "line": 1052
2026-08-28T09:54:46.4643259Z             },
2026-08-28T09:54:46.4643415Z             {
2026-08-28T09:54:46.4643606Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4643764Z               "line": 1314
2026-08-28T09:54:46.4643917Z             },
2026-08-28T09:54:46.4644064Z             {
2026-08-28T09:54:46.4644255Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:46.4644423Z               "line": 1479
2026-08-28T09:54:46.4644569Z             }
2026-08-28T09:54:46.4644718Z           ]
2026-08-28T09:54:46.4644869Z         },
2026-08-28T09:54:46.4645024Z         "int": {
2026-08-28T09:54:46.4645189Z           "complete": true,
2026-08-28T09:54:46.4645350Z           "evidence": [
2026-08-28T09:54:46.4649198Z             {
2026-08-28T09:54:46.4649561Z               "path": "crates/spt/tests/docs_bundle_e2e.rs",
2026-08-28T09:54:46.4649722Z               "line": 13
2026-08-28T09:54:46.4649875Z             }
2026-08-28T09:54:46.4650022Z           ]
2026-08-28T09:54:46.4650172Z         },
2026-08-28T09:54:46.4650467Z         "unit": {
2026-08-28T09:54:46.4650637Z           "complete": true,
2026-08-28T09:54:46.4650789Z           "evidence": [
2026-08-28T09:54:46.4650948Z             {
2026-08-28T09:54:46.4651161Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.4651327Z               "line": 527
2026-08-28T09:54:46.4651481Z             },
2026-08-28T09:54:46.4651619Z             {
2026-08-28T09:54:46.4651834Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.4651990Z               "line": 904
2026-08-28T09:54:46.4652140Z             }
2026-08-28T09:54:46.4652286Z           ]
2026-08-28T09:54:46.4652440Z         }
2026-08-28T09:54:46.4652586Z       }
2026-08-28T09:54:46.4652740Z     },
2026-08-28T09:54:46.4652891Z     {
2026-08-28T09:54:46.4653086Z       "id": "REQ-DRIVEN-BY-OWN-NODE-NORMALIZE",
2026-08-28T09:54:46.4669908Z       "title": "RC-RENDER-TRUTH v0.38.1 fast-follow leg 1 — RESHAPED by operator/hertz correction + CONTEXT.md:382-389 grounding (doyle ruling v3, 2026-07-19; the original own-node NORMALIZATION is WITHDRAWN): plain `spt rc` on a CONTROLLED endpoint is refused-with-guidance BY DESIGN (CONTEXT:386 — never silent-displace; --take is the opt-in kick), and `driven_by` = the CONTROLLING NODE including the own node (CONTEXT:386 single-writer datum — the stamp comment's remote-only claim was a legacy-path artifact, NOT the model). v0.38.0 shipped behavior is CORRECT: the own-hex latch + client guidance blocking a second same-node plain rc IS the documented refusal, and the W2 generation ladder stays reachable exactly where it belongs — the recovery seams (rc reconnect re-drive + dispatcher re-serve bypass the client gate; the hertz field FAIL leg is reclassified NOT-A-DEFECT). Remaining work = truth/cosmetics across ALL own-node display surfaces (doyle gate finding 2026-07-19 — the own-hex latch is truthful but only rc.rs first learned to HUMANIZE it; the picker pin + endpoint-info attached_node still read the own-hex stamp as a foreign remote driver and print raw hex): (a) rc.rs guidance copy names the actual state — controlled from another window on this machine — via a pure driver_phrase keyed on the SHARED own-node predicate (roster::is_own_node_hex); (b) picker control_line (view.rs) reads an own-node driver as controlled locally (driven_by_is_self computed at data-build where the raw hex is available, driven_by STAYS populated so View+Kick is still offered); (c) endpoint-info attached_node (reporting.rs derive_attached_node) self-attributes an own-node driver to THIS node, never a foreign null-label hex; (d) stamp_driven_by + set_driven_by/set_controlled comments rewritten to the CONTEXT:386 meaning (controller node, own included) + KH 7.15/secondary remote-only model-claim comments reconciled (selfheal/unlatch semantics unchanged) — STAGE-NOTE CORRECTION (todlando 2026-08-19, doyle-ruled): this item shipped only its FIRST half. The WRITER-side comments were rewritten (broker.rs stamp_driven_by, info.rs set_driven_by, info.rs set_controlled all carry the ruling and are the anchors). The `secondary remote-only model-claim comments reconciled` half was NOT executed: the InfoJson FIELD docs for driven_by/controlled, picker/model.rs's controlled field doc (which contradicted driven_by_is_self twelve lines above it in the same struct), and the REQ/triage records that restate the falsified model all still carried remote-only. Executed by the sweep commit that carries this correction. No prod behavior site ever encoded remote-only — display_status keys on driven_by || controlled, correct under both models — which is why the stale premise never shipped a bug; (e) plain-Control-on-controlled refusal + --view/--take bypass pinned for BOTH remote and own-node drivers. NO broker behavior change; ladder untouched; pure display (no int, same as the ruling-v3 dropped int). Gate: impl — rc/picker/endpoint-info humanization + shared predicate + comment/docs; unit — own-node latch stamps truthfully (broker), guidance fires for own+remote with the right copy (rc), driver_phrase names own-node plainly (rc), control_line reads own-node as controlled locally (view), attached_node self-attributes own-node (reporting), --view/--take bypass; doc — KH 7.15 + ADR-0044 consequence-note alignment.",
2026-08-28T09:54:46.4670456Z       "requiredStages": [
2026-08-28T09:54:46.4670613Z         "doc",
2026-08-28T09:54:46.4670771Z         "impl",
2026-08-28T09:54:46.4670923Z         "unit"
2026-08-28T09:54:46.4671081Z       ],
2026-08-28T09:54:46.4671228Z       "stages": {
2026-08-28T09:54:46.4671377Z         "doc": {
2026-08-28T09:54:46.4671543Z           "complete": true,
2026-08-28T09:54:46.4671706Z           "evidence": [
2026-08-28T09:54:46.4671856Z             {
2026-08-28T09:54:46.4672096Z               "path": "docs/adr/0044-controller-lease-truth.md",
2026-08-28T09:54:46.4672258Z               "line": 109
2026-08-28T09:54:46.4672406Z             }
2026-08-28T09:54:46.4672543Z           ]
2026-08-28T09:54:46.4672696Z         },
2026-08-28T09:54:46.4672849Z         "impl": {
2026-08-28T09:54:46.4673020Z           "complete": true,
2026-08-28T09:54:46.4673173Z           "evidence": [
2026-08-28T09:54:46.4673326Z             {
2026-08-28T09:54:46.4673537Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.4673701Z               "line": 1108
2026-08-28T09:54:46.4673851Z             },
2026-08-28T09:54:46.4674002Z             {
2026-08-28T09:54:46.4674230Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.4674419Z               "line": 218
2026-08-28T09:54:46.4674572Z             },
2026-08-28T09:54:46.4674719Z             {
2026-08-28T09:54:46.4674924Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.4675077Z               "line": 278
2026-08-28T09:54:46.4675216Z             },
2026-08-28T09:54:46.4675372Z             {
2026-08-28T09:54:46.4675573Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.4675730Z               "line": 522
2026-08-28T09:54:46.4675964Z             },
2026-08-28T09:54:46.4676193Z             {
2026-08-28T09:54:46.4676384Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:46.4676536Z               "line": 607
2026-08-28T09:54:46.4676670Z             },
2026-08-28T09:54:46.4676814Z             {
2026-08-28T09:54:46.4677001Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.4677159Z               "line": 1273
2026-08-28T09:54:46.4677309Z             },
2026-08-28T09:54:46.4677449Z             {
2026-08-28T09:54:46.4677638Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.4677792Z               "line": 26
2026-08-28T09:54:46.4677944Z             },
2026-08-28T09:54:46.4678092Z             {
2026-08-28T09:54:46.4678278Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.4678430Z               "line": 33
2026-08-28T09:54:46.4678583Z             }
2026-08-28T09:54:46.4678731Z           ]
2026-08-28T09:54:46.4678878Z         },
2026-08-28T09:54:46.4679140Z         "int": {
2026-08-28T09:54:46.4679309Z           "complete": false,
2026-08-28T09:54:46.4679483Z           "evidence": []
2026-08-28T09:54:46.4679626Z         },
2026-08-28T09:54:46.4679786Z         "unit": {
2026-08-28T09:54:46.4679948Z           "complete": true,
2026-08-28T09:54:46.4680110Z           "evidence": [
2026-08-28T09:54:46.4680268Z             {
2026-08-28T09:54:46.4680472Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4680640Z               "line": 12228
2026-08-28T09:54:46.4680787Z             },
2026-08-28T09:54:46.4680941Z             {
2026-08-28T09:54:46.4681140Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.4681307Z               "line": 1292
2026-08-28T09:54:46.4681455Z             },
2026-08-28T09:54:46.4681608Z             {
2026-08-28T09:54:46.4681808Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:46.4681960Z               "line": 992
2026-08-28T09:54:46.4682113Z             },
2026-08-28T09:54:46.4682266Z             {
2026-08-28T09:54:46.4682599Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.4682755Z               "line": 3805
2026-08-28T09:54:46.4682909Z             },
2026-08-28T09:54:46.4683065Z             {
2026-08-28T09:54:46.4683243Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.4683404Z               "line": 3858
2026-08-28T09:54:46.4683562Z             }
2026-08-28T09:54:46.4683714Z           ]
2026-08-28T09:54:46.4683858Z         }
2026-08-28T09:54:46.4684009Z       }
2026-08-28T09:54:46.4684158Z     },
2026-08-28T09:54:46.4684324Z     {
2026-08-28T09:54:46.4684497Z       "id": "REQ-DSR-SINGLE-CPR",
2026-08-28T09:54:46.4688042Z       "title": "TEARDOWN-AUTHORITY W3 rider (hertz RCA 2026-07-19): a Device Status Report query yields EXACTLY ONE Cursor Position Report. Rides W3 because it is the same emulator-conformance surface as the width work and the same field capture surfaced it; kept a separate REQ so its evidence is not buried inside the width tags. Gate: impl — one CPR per DSR on the emulator reply path; unit — a DSR in the input stream produces a single well-formed CPR carrying the DISPLAY-column cursor position (i.e. consistent with REQ-SCREENGRID-WIDTH reckoning, not the raw char count).",
2026-08-28T09:54:46.4688338Z       "requiredStages": [
2026-08-28T09:54:46.4688557Z         "impl",
2026-08-28T09:54:46.4688799Z         "unit"
2026-08-28T09:54:46.4689119Z       ],
2026-08-28T09:54:46.4689348Z       "stages": {
2026-08-28T09:54:46.4689597Z         "doc": {
2026-08-28T09:54:46.4689831Z           "complete": false,
2026-08-28T09:54:46.4690077Z           "evidence": []
2026-08-28T09:54:46.4690299Z         },
2026-08-28T09:54:46.4690537Z         "impl": {
2026-08-28T09:54:46.4690790Z           "complete": true,
2026-08-28T09:54:46.4691037Z           "evidence": [
2026-08-28T09:54:46.4691200Z             {
2026-08-28T09:54:46.4691414Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4691748Z               "line": 1273
2026-08-28T09:54:46.4691896Z             },
2026-08-28T09:54:46.4692048Z             {
2026-08-28T09:54:46.4692253Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4692407Z               "line": 61
2026-08-28T09:54:46.4692563Z             },
2026-08-28T09:54:46.4692713Z             {
2026-08-28T09:54:46.4692911Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4693063Z               "line": 194
2026-08-28T09:54:46.4693220Z             },
2026-08-28T09:54:46.4693368Z             {
2026-08-28T09:54:46.4693573Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4693727Z               "line": 270
2026-08-28T09:54:46.4693878Z             },
2026-08-28T09:54:46.4694022Z             {
2026-08-28T09:54:46.4694236Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.4694394Z               "line": 297
2026-08-28T09:54:46.4694527Z             }
2026-08-28T09:54:46.4694676Z           ]
2026-08-28T09:54:46.4694827Z         },
2026-08-28T09:54:46.4694976Z         "int": {
2026-08-28T09:54:46.4695142Z           "complete": false,
2026-08-28T09:54:46.4695313Z           "evidence": []
2026-08-28T09:54:46.4695458Z         },
2026-08-28T09:54:46.4695606Z         "unit": {
2026-08-28T09:54:46.4695768Z           "complete": true,
2026-08-28T09:54:46.4695925Z           "evidence": [
2026-08-28T09:54:46.4696078Z             {
2026-08-28T09:54:46.4696270Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4696426Z               "line": 310
2026-08-28T09:54:46.4696575Z             },
2026-08-28T09:54:46.4696736Z             {
2026-08-28T09:54:46.4696927Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4697089Z               "line": 341
2026-08-28T09:54:46.4697238Z             },
2026-08-28T09:54:46.4697389Z             {
2026-08-28T09:54:46.4697576Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4697733Z               "line": 399
2026-08-28T09:54:46.4697886Z             },
2026-08-28T09:54:46.4698037Z             {
2026-08-28T09:54:46.4698345Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.4698507Z               "line": 433
2026-08-28T09:54:46.4698655Z             },
2026-08-28T09:54:46.4698812Z             {
2026-08-28T09:54:46.4699112Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:46.4699275Z               "line": 1549
2026-08-28T09:54:46.4699422Z             }
2026-08-28T09:54:46.4699579Z           ]
2026-08-28T09:54:46.4699727Z         }
2026-08-28T09:54:46.4699889Z       }
2026-08-28T09:54:46.4700042Z     },
2026-08-28T09:54:46.4700191Z     {
2026-08-28T09:54:46.4700376Z       "id": "REQ-ECHO-DROP-DIR-RESOLVE",
2026-08-28T09:54:46.4704649Z       "title": "W1 (LIFECYCLE-TRUTH): fire_echo resolves the manifest commune_dir through the SAME resolver its siblings use before any write. ROOT (pinned): fire_echo (spt-daemon lifecycle.rs:790) passes the RAW manifest commune_dir into run_echo_commune -> echo.rs:115-117 create_dir_all+join; a relative `.claude` under the WMI-launched daemon's System32 cwd = os error 5 deterministic (two live psyches stamped FAILED on it). Siblings already resolve correctly (ingest ~:583, psyche_drop_file :1072 via resolve_endpoint_drop_dir(raw, cwd)). FIX: fire_echo routes through resolve_endpoint_drop_dir; relative-with-no-cwd = SKIP LOUD (stderr), never a raw relative write — kills the latent-worse variant where a writable daemon cwd writes the drop to a WRONG dir silently (echo communes lost, no error). Hardening riders (same touch, no separate REQ): bounded EACCES retry on the drop write; echo claude spawn gets explicit cwd = endpoint cwd (perri ask).",
2026-08-28T09:54:46.4704843Z       "requiredStages": [
2026-08-28T09:54:46.4705001Z         "impl",
2026-08-28T09:54:46.4705149Z         "unit"
2026-08-28T09:54:46.4705302Z       ],
2026-08-28T09:54:46.4705459Z       "stages": {
2026-08-28T09:54:46.4705607Z         "doc": {
2026-08-28T09:54:46.4705777Z           "complete": false,
2026-08-28T09:54:46.4706052Z           "evidence": []
2026-08-28T09:54:46.4706210Z         },
2026-08-28T09:54:46.4706362Z         "impl": {
2026-08-28T09:54:46.4706534Z           "complete": true,
2026-08-28T09:54:46.4706690Z           "evidence": [
2026-08-28T09:54:46.4706839Z             {
2026-08-28T09:54:46.4707057Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4707225Z               "line": 469
2026-08-28T09:54:46.4707381Z             },
2026-08-28T09:54:46.4707526Z             {
2026-08-28T09:54:46.4707740Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4707897Z               "line": 1221
2026-08-28T09:54:46.4708050Z             },
2026-08-28T09:54:46.4708193Z             {
2026-08-28T09:54:46.4708398Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:46.4708550Z               "line": 111
2026-08-28T09:54:46.4708701Z             },
2026-08-28T09:54:46.4708858Z             {
2026-08-28T09:54:46.4709134Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:46.4709300Z               "line": 161
2026-08-28T09:54:46.4709444Z             },
2026-08-28T09:54:46.4709600Z             {
2026-08-28T09:54:46.4709806Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4709968Z               "line": 753
2026-08-28T09:54:46.4710116Z             },
2026-08-28T09:54:46.4710263Z             {
2026-08-28T09:54:46.4710473Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4710631Z               "line": 848
2026-08-28T09:54:46.4710779Z             }
2026-08-28T09:54:46.4710922Z           ]
2026-08-28T09:54:46.4711080Z         },
2026-08-28T09:54:46.4711225Z         "int": {
2026-08-28T09:54:46.4711387Z           "complete": false,
2026-08-28T09:54:46.4711542Z           "evidence": []
2026-08-28T09:54:46.4711687Z         },
2026-08-28T09:54:46.4711843Z         "unit": {
2026-08-28T09:54:46.4712002Z           "complete": true,
2026-08-28T09:54:46.4712167Z           "evidence": [
2026-08-28T09:54:46.4712311Z             {
2026-08-28T09:54:46.4712626Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4712782Z               "line": 3144
2026-08-28T09:54:46.4712936Z             },
2026-08-28T09:54:46.4713079Z             {
2026-08-28T09:54:46.4713289Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4713450Z               "line": 3198
2026-08-28T09:54:46.4713595Z             },
2026-08-28T09:54:46.4713746Z             {
2026-08-28T09:54:46.4713933Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:46.4714102Z               "line": 295
2026-08-28T09:54:46.4714251Z             },
2026-08-28T09:54:46.4714402Z             {
2026-08-28T09:54:46.4714603Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.4714764Z               "line": 1234
2026-08-28T09:54:46.4714913Z             }
2026-08-28T09:54:46.4715065Z           ]
2026-08-28T09:54:46.4715218Z         }
2026-08-28T09:54:46.4715375Z       }
2026-08-28T09:54:46.4715529Z     },
2026-08-28T09:54:46.4715676Z     {
2026-08-28T09:54:46.4715876Z       "id": "REQ-EFFECTIVE-INSTANCE-STATE",
2026-08-28T09:54:46.4722199Z       "title": "A-1 (REMOTE-TRUTH triage §A + ADR-0033 §Decision): the effective instance state of a perch is DERIVED through ONE shared function — liveness discriminates warm/cold, stored rest intent refines within warm, absent intent NEVER defaults active. ROOT (certain): resting::apply_event derived its `from` off the stored rest_state field ALONE (resting.rs:225, `unwrap_or(RestState::Active)`) — a cold perch (offline) with no intent answered `from=Active`, so a Wake event found it 'already in target state' and returned Ok(None) = the field NO_EDGE-on-a-definitely-suspended-endpoint bug (the banked F-028 rest_state-void seed). advertised_status (registryhost.rs:821) ALREADY derived correctly (is_perch_alive→intent-refined / is_perch_unbound→Dormant / cold→Suspended) — the two readers disagreed. FIX (Q1 shared derivation, hazard-class): a pure `effective_rest_state(alive, unbound, intent) -> RestState` mirroring advertised_status, consumed by BOTH advertised_status (mapped RestState→Status, behavior identical) AND apply_event's `from` (real is_perch_alive/is_perch_unbound reads); void + cold ⇒ Suspended. Bonus: kills the spurious active→suspend echo a cold+void perch used to fire (on_rest_edge on a dead driver). Red-first: perch status=offline + no rest_state → daemon_rest_event(Wake) yields from=Suspended→to=Active EdgeReport, not Ok(None).",
2026-08-28T09:54:46.4722499Z       "requiredStages": [
2026-08-28T09:54:46.4722657Z         "doc",
2026-08-28T09:54:46.4722804Z         "impl",
2026-08-28T09:54:46.4722962Z         "unit"
2026-08-28T09:54:46.4723104Z       ],
2026-08-28T09:54:46.4723262Z       "stages": {
2026-08-28T09:54:46.4723405Z         "doc": {
2026-08-28T09:54:46.4723572Z           "complete": true,
2026-08-28T09:54:46.4723729Z           "evidence": [
2026-08-28T09:54:46.4723882Z             {
2026-08-28T09:54:46.4724083Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.4724248Z               "line": 683
2026-08-28T09:54:46.4724407Z             }
2026-08-28T09:54:46.4724558Z           ]
2026-08-28T09:54:46.4724710Z         },
2026-08-28T09:54:46.4724864Z         "impl": {
2026-08-28T09:54:46.4725029Z           "complete": true,
2026-08-28T09:54:46.4725178Z           "evidence": [
2026-08-28T09:54:46.4725334Z             {
2026-08-28T09:54:46.4725554Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.4725717Z               "line": 1000
2026-08-28T09:54:46.4725865Z             },
2026-08-28T09:54:46.4726013Z             {
2026-08-28T09:54:46.4726221Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4726375Z               "line": 224
2026-08-28T09:54:46.4726532Z             },
2026-08-28T09:54:46.4726676Z             {
2026-08-28T09:54:46.4726879Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4727046Z               "line": 309
2026-08-28T09:54:46.4727305Z             }
2026-08-28T09:54:46.4727458Z           ]
2026-08-28T09:54:46.4727611Z         },
2026-08-28T09:54:46.4727764Z         "int": {
2026-08-28T09:54:46.4727926Z           "complete": false,
2026-08-28T09:54:46.4728088Z           "evidence": []
2026-08-28T09:54:46.4728236Z         },
2026-08-28T09:54:46.4728393Z         "unit": {
2026-08-28T09:54:46.4728555Z           "complete": true,
2026-08-28T09:54:46.4728712Z           "evidence": [
2026-08-28T09:54:46.4728865Z             {
2026-08-28T09:54:46.4729160Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4729322Z               "line": 947
2026-08-28T09:54:46.4729466Z             },
2026-08-28T09:54:46.4729619Z             {
2026-08-28T09:54:46.4729817Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4729982Z               "line": 981
2026-08-28T09:54:46.4730134Z             },
2026-08-28T09:54:46.4730278Z             {
2026-08-28T09:54:46.4730483Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4730636Z               "line": 1072
2026-08-28T09:54:46.4730788Z             }
2026-08-28T09:54:46.4730936Z           ]
2026-08-28T09:54:46.4731088Z         }
2026-08-28T09:54:46.4731236Z       }
2026-08-28T09:54:46.4731383Z     },
2026-08-28T09:54:46.4731532Z     {
2026-08-28T09:54:46.4731689Z       "id": "REQ-ELEVATE-1",
2026-08-28T09:54:46.4736372Z       "title": "Cross-platform self-elevating re-launch for privilege-gated commands: a pure decision seam `decide_elevation_path(os, elevation, interactive_tty, has_display, has_pkexec, has_term_emulator) -> ElevatePath{AlreadyElevated, InlineSudo, UacWindow, Pkexec, TerminalEmulator, PrintHint}` selecting how to re-acquire privilege, and the per-OS impure launchers it dispatches — Windows UAC console (ShellExecuteW `runas` on the abs-exe + verbatim argv; the elevated child does the work, prints 'You can close this window', and pauses for a keypress; the original prints 'Elevated terminal launched…' and exits 0; NEVER pipes the child's stdout back across the privilege boundary), Linux desktop pkexec (preferred, native polkit GUI auth) else x-terminal-emulator -e sudo (fallback list x-terminal-emulator→gnome-terminal→konsole→xterm), the existing interactive-TTY inline sudo, and the headless/no-path floor that prints the absolute-path command. Reused by every gated command (not subnet-specific). Generalizes should_auto_elevate.",
2026-08-28T09:54:46.4736668Z       "requiredStages": [
2026-08-28T09:54:46.4736820Z         "doc",
2026-08-28T09:54:46.4736978Z         "impl",
2026-08-28T09:54:46.4737125Z         "unit"
2026-08-28T09:54:46.4737274Z       ],
2026-08-28T09:54:46.4737520Z       "stages": {
2026-08-28T09:54:46.4737671Z         "doc": {
2026-08-28T09:54:46.4737842Z           "complete": true,
2026-08-28T09:54:46.4738000Z           "evidence": [
2026-08-28T09:54:46.4738147Z             {
2026-08-28T09:54:46.4738315Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.4738491Z               "line": 1014
2026-08-28T09:54:46.4738639Z             }
2026-08-28T09:54:46.4738801Z           ]
2026-08-28T09:54:46.4739038Z         },
2026-08-28T09:54:46.4739187Z         "impl": {
2026-08-28T09:54:46.4739353Z           "complete": true,
2026-08-28T09:54:46.4739507Z           "evidence": [
2026-08-28T09:54:46.4739649Z             {
2026-08-28T09:54:46.4739831Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4739992Z               "line": 13068
2026-08-28T09:54:46.4740146Z             },
2026-08-28T09:54:46.4740306Z             {
2026-08-28T09:54:46.4740501Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4740661Z               "line": 13113
2026-08-28T09:54:46.4740819Z             },
2026-08-28T09:54:46.4740966Z             {
2026-08-28T09:54:46.4741148Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4741305Z               "line": 13175
2026-08-28T09:54:46.4741458Z             },
2026-08-28T09:54:46.4741615Z             {
2026-08-28T09:54:46.4741810Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.4742083Z               "line": 92
2026-08-28T09:54:46.4742235Z             },
2026-08-28T09:54:46.4742384Z             {
2026-08-28T09:54:46.4742574Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.4742741Z               "line": 148
2026-08-28T09:54:46.4742891Z             }
2026-08-28T09:54:46.4743044Z           ]
2026-08-28T09:54:46.4743190Z         },
2026-08-28T09:54:46.4743347Z         "int": {
2026-08-28T09:54:46.4743519Z           "complete": false,
2026-08-28T09:54:46.4743682Z           "evidence": []
2026-08-28T09:54:46.4743829Z         },
2026-08-28T09:54:46.4743977Z         "unit": {
2026-08-28T09:54:46.4744138Z           "complete": true,
2026-08-28T09:54:46.4744297Z           "evidence": [
2026-08-28T09:54:46.4744449Z             {
2026-08-28T09:54:46.4744635Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.4744797Z               "line": 442
2026-08-28T09:54:46.4744955Z             },
2026-08-28T09:54:46.4745111Z             {
2026-08-28T09:54:46.4745307Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.4745464Z               "line": 460
2026-08-28T09:54:46.4745618Z             }
2026-08-28T09:54:46.4745763Z           ]
2026-08-28T09:54:46.4745922Z         }
2026-08-28T09:54:46.4746069Z       }
2026-08-28T09:54:46.4746217Z     },
2026-08-28T09:54:46.4746369Z     {
2026-08-28T09:54:46.4746546Z       "id": "REQ-ENDPOINT-AUTOSTART",
2026-08-28T09:54:46.4754494Z       "title": "MSG-IDENTITY W5 / F-038 (flynn operator-directed ask 2026-07-10, SPT-CORE-NEEDS #7 + deployah field-confirm same day: mobile-gw alive=false after the v0.30.6 full daemon restart = this feature's absence, live): an endpoint can be marked a STARTUP DEFAULT so the daemon brings it back up at daemon start — Gateway-class endpoints are infra (the phone treats mobile-gw as always-there; box reboot / daemon cold start currently leaves it down until hands-on). SHAPE RULED (doyle, dispatch): (a) `spt endpoint auto-start <id>` persists the endpoint (id + adapter/profile + args) as a startup default REPLAYED at daemon start, symmetric with the shipped `subnet attach/detach --save` precedent — smallest orthogonal cut, explicit operator intent, no interaction with effective_rest_state/F-035 reader-parity semantics (shape (c) restore-what-was-up REJECTED for now: principled but couples to the rest_state neighborhood that just churned; revisit if --save proves insufficient in the field). A saved endpoint that fails to come up logs loud + does not block daemon start or other replays. flynn docs sweep confirmed missing-feature not docs-gap (rest/wake manual-only; no endpoint analog of subnet --save; no manifest field; no api surface). Gate: int — daemon restart brings a --save'd endpoint back up (fresh daemon, saved default, endpoint reaches its steady state without hands-on); doc — public docs page for the verb (VERSION-scoped); unit — persistence round-trip + replay skip-on-missing-adapter loud. Kin subnet --save (the symmetry precedent), REQ-LIST-JSON-LIVENESS-PARITY + REQ-HAZARD-BIND-REST-STATE-CARRY (the F-035 neighborhood shape (c) would have coupled to), [[spt-core-findings-backlog]] F-038. Interim on flynn's box (logon scheduled task) dissolves when this lands.",
2026-08-28T09:54:46.4754799Z       "requiredStages": [
2026-08-28T09:54:46.4754961Z         "doc",
2026-08-28T09:54:46.4755109Z         "impl",
2026-08-28T09:54:46.4755261Z         "unit",
2026-08-28T09:54:46.4755414Z         "int"
2026-08-28T09:54:46.4755562Z       ],
2026-08-28T09:54:46.4755714Z       "stages": {
2026-08-28T09:54:46.4755863Z         "doc": {
2026-08-28T09:54:46.4756025Z           "complete": true,
2026-08-28T09:54:46.4756182Z           "evidence": [
2026-08-28T09:54:46.4756333Z             {
2026-08-28T09:54:46.4756549Z               "path": "docs-site/src/instances/overview.md",
2026-08-28T09:54:46.4756710Z               "line": 158
2026-08-28T09:54:46.4756858Z             }
2026-08-28T09:54:46.4757010Z           ]
2026-08-28T09:54:46.4757154Z         },
2026-08-28T09:54:46.4757421Z         "impl": {
2026-08-28T09:54:46.4757587Z           "complete": true,
2026-08-28T09:54:46.4757741Z           "evidence": [
2026-08-28T09:54:46.4757893Z             {
2026-08-28T09:54:46.4758103Z               "path": "crates/spt-daemon/src/autostart.rs",
2026-08-28T09:54:46.4758259Z               "line": 37
2026-08-28T09:54:46.4758408Z             },
2026-08-28T09:54:46.4758559Z             {
2026-08-28T09:54:46.4758759Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4758914Z               "line": 75
2026-08-28T09:54:46.4759139Z             },
2026-08-28T09:54:46.4759291Z             {
2026-08-28T09:54:46.4759496Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4759649Z               "line": 338
2026-08-28T09:54:46.4759806Z             },
2026-08-28T09:54:46.4759945Z             {
2026-08-28T09:54:46.4760149Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4760307Z               "line": 361
2026-08-28T09:54:46.4760464Z             },
2026-08-28T09:54:46.4760618Z             {
2026-08-28T09:54:46.4760816Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.4760989Z               "line": 250
2026-08-28T09:54:46.4761136Z             },
2026-08-28T09:54:46.4761286Z             {
2026-08-28T09:54:46.4761469Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4761631Z               "line": 4099
2026-08-28T09:54:46.4761776Z             }
2026-08-28T09:54:46.4761925Z           ]
2026-08-28T09:54:46.4762081Z         },
2026-08-28T09:54:46.4762226Z         "int": {
2026-08-28T09:54:46.4762396Z           "complete": true,
2026-08-28T09:54:46.4762550Z           "evidence": [
2026-08-28T09:54:46.4762701Z             {
2026-08-28T09:54:46.4762917Z               "path": "crates/spt/tests/endpoint_autostart_e2e.rs",
2026-08-28T09:54:46.4763093Z               "line": 247
2026-08-28T09:54:46.4763345Z             }
2026-08-28T09:54:46.4763499Z           ]
2026-08-28T09:54:46.4763651Z         },
2026-08-28T09:54:46.4763800Z         "unit": {
2026-08-28T09:54:46.4763969Z           "complete": true,
2026-08-28T09:54:46.4764126Z           "evidence": [
2026-08-28T09:54:46.4764277Z             {
2026-08-28T09:54:46.4764487Z               "path": "crates/spt-daemon/src/autostart.rs",
2026-08-28T09:54:46.4764648Z               "line": 194
2026-08-28T09:54:46.4764797Z             },
2026-08-28T09:54:46.4764944Z             {
2026-08-28T09:54:46.4765154Z               "path": "crates/spt-daemon/src/autostart.rs",
2026-08-28T09:54:46.4765345Z               "line": 210
2026-08-28T09:54:46.4765497Z             },
2026-08-28T09:54:46.4765636Z             {
2026-08-28T09:54:46.4765831Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4765979Z               "line": 555
2026-08-28T09:54:46.4766131Z             },
2026-08-28T09:54:46.4766279Z             {
2026-08-28T09:54:46.4766474Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4766638Z               "line": 607
2026-08-28T09:54:46.4766784Z             },
2026-08-28T09:54:46.4766936Z             {
2026-08-28T09:54:46.4767127Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:46.4767289Z               "line": 671
2026-08-28T09:54:46.4767438Z             },
2026-08-28T09:54:46.4767595Z             {
2026-08-28T09:54:46.4767781Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4767938Z               "line": 3314
2026-08-28T09:54:46.4768090Z             }
2026-08-28T09:54:46.4768239Z           ]
2026-08-28T09:54:46.4768386Z         }
2026-08-28T09:54:46.4768534Z       }
2026-08-28T09:54:46.4768687Z     },
2026-08-28T09:54:46.4768834Z     {
2026-08-28T09:54:46.4769105Z       "id": "REQ-ENDPOINT-CYCLE-HONEST",
2026-08-28T09:54:46.4772365Z       "title": "REGISTRY-LIFECYCLE W3 (ADR-0041 decision 6, operator deployah stop/run wedge): cycle verbs share ONE liveness authority — the ALREADY_LIVE dup-guard liveness-probes the claimed session client tree before refusing (dead tree means reap + respawn honestly, never a refusal citing a zombie); the shutdown state machine consults the same source so is-it-live has one answer (no ALREADY_LIVE / list-OFFLINE / shutdown-NO_EDGE three-way contradiction on the same endpoint). Gate: impl — probing dup-guard + unified authority; unit — dead-tree claim probes and reaps, live claim still refuses; int — controlled zombie (killed client tree, surviving hosted record) leads to endpoint run succeeding honestly end-to-end; doc — ADR-0041.",
2026-08-28T09:54:46.4772646Z       "requiredStages": [
2026-08-28T09:54:46.4772800Z         "doc",
2026-08-28T09:54:46.4772956Z         "impl",
2026-08-28T09:54:46.4773101Z         "unit",
2026-08-28T09:54:46.4773257Z         "int"
2026-08-28T09:54:46.4773401Z       ],
2026-08-28T09:54:46.4773553Z       "stages": {
2026-08-28T09:54:46.4773702Z         "doc": {
2026-08-28T09:54:46.4773862Z           "complete": true,
2026-08-28T09:54:46.4774021Z           "evidence": [
2026-08-28T09:54:46.4774177Z             {
2026-08-28T09:54:46.4774417Z               "path": "docs/adr/0041-endpoint-lifecycle-truth.md",
2026-08-28T09:54:46.4774572Z               "line": 77
2026-08-28T09:54:46.4774725Z             }
2026-08-28T09:54:46.4774875Z           ]
2026-08-28T09:54:46.4775023Z         },
2026-08-28T09:54:46.4775175Z         "impl": {
2026-08-28T09:54:46.4775343Z           "complete": true,
2026-08-28T09:54:46.4775494Z           "evidence": [
2026-08-28T09:54:46.4775644Z             {
2026-08-28T09:54:46.4775847Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4776006Z               "line": 309
2026-08-28T09:54:46.4776152Z             },
2026-08-28T09:54:46.4776297Z             {
2026-08-28T09:54:46.4776496Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4776650Z               "line": 341
2026-08-28T09:54:46.4776806Z             },
2026-08-28T09:54:46.4776951Z             {
2026-08-28T09:54:46.4777265Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4777440Z               "line": 3949
2026-08-28T09:54:46.4777588Z             },
2026-08-28T09:54:46.4777739Z             {
2026-08-28T09:54:46.4777936Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4778102Z               "line": 5904
2026-08-28T09:54:46.4778255Z             },
2026-08-28T09:54:46.4778402Z             {
2026-08-28T09:54:46.4778598Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4778764Z               "line": 7809
2026-08-28T09:54:46.4778922Z             },
2026-08-28T09:54:46.4779195Z             {
2026-08-28T09:54:46.4779394Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4779552Z               "line": 1524
2026-08-28T09:54:46.4779703Z             },
2026-08-28T09:54:46.4779855Z             {
2026-08-28T09:54:46.4780063Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4780226Z               "line": 1530
2026-08-28T09:54:46.4780378Z             },
2026-08-28T09:54:46.4780541Z             {
2026-08-28T09:54:46.4780726Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.4780888Z               "line": 1537
2026-08-28T09:54:46.4781036Z             },
2026-08-28T09:54:46.4781189Z             {
2026-08-28T09:54:46.4781390Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4781560Z               "line": 285
2026-08-28T09:54:46.4781715Z             },
2026-08-28T09:54:46.4781856Z             {
2026-08-28T09:54:46.4782067Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4782224Z               "line": 415
2026-08-28T09:54:46.4782368Z             },
2026-08-28T09:54:46.4782518Z             {
2026-08-28T09:54:46.4782699Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4782854Z               "line": 4544
2026-08-28T09:54:46.4783007Z             },
2026-08-28T09:54:46.4783164Z             {
2026-08-28T09:54:46.4783346Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4783628Z               "line": 7535
2026-08-28T09:54:46.4783775Z             },
2026-08-28T09:54:46.4783927Z             {
2026-08-28T09:54:46.4784104Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.4784267Z               "line": 1061
2026-08-28T09:54:46.4784417Z             }
2026-08-28T09:54:46.4784577Z           ]
2026-08-28T09:54:46.4784728Z         },
2026-08-28T09:54:46.4784882Z         "int": {
2026-08-28T09:54:46.4785043Z           "complete": true,
2026-08-28T09:54:46.4785199Z           "evidence": [
2026-08-28T09:54:46.4785346Z             {
2026-08-28T09:54:46.4785564Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:46.4785721Z               "line": 329
2026-08-28T09:54:46.4785870Z             }
2026-08-28T09:54:46.4786022Z           ]
2026-08-28T09:54:46.4786180Z         },
2026-08-28T09:54:46.4786332Z         "unit": {
2026-08-28T09:54:46.4786499Z           "complete": true,
2026-08-28T09:54:46.4786661Z           "evidence": [
2026-08-28T09:54:46.4786809Z             {
2026-08-28T09:54:46.4787009Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.4787177Z               "line": 9735
2026-08-28T09:54:46.4787319Z             },
2026-08-28T09:54:46.4787472Z             {
2026-08-28T09:54:46.4787681Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:46.4787835Z               "line": 1021
2026-08-28T09:54:46.4787990Z             }
2026-08-28T09:54:46.4788138Z           ]
2026-08-28T09:54:46.4788290Z         }
2026-08-28T09:54:46.4788438Z       }
2026-08-28T09:54:46.4788595Z     },
2026-08-28T09:54:46.4788739Z     {
2026-08-28T09:54:46.4788938Z       "id": "REQ-ENDPOINT-DROP-DIR-SURFACE",
2026-08-28T09:54:46.4798366Z       "title": "THE REGISTERED COMMUNE DROP DIR IS READABLE FOR THIS NODE'S OTHER ENDPOINTS, NOT ONLY FOR SELF (releases#224, scope amended at measure-first): `endpoint list --json` HAS carried `drop_dir` on the SELF pin since 2026-08-01 (REQ-PSYCHE-INGEST-FAILURE-LOUD, `registered_drop_dir` resolving through the SAME `spt_live::resolve_endpoint_drop_dir` the daemon ingest anchors on -- one anchor, so the read surface cannot drift from the watcher), and the ticket's premise that no read verb exposes it is FALSE at head and at the shipped 0.62.0 binary; the residual is that the field appears EXACTLY ONCE in the whole roster JSON. The field census's real question is about ANOTHER agent's endpoint -- an orphaned drop is diagnosed by whoever finds it, not by its owner -- so `LocalPerchJson` rows gain `drop_dir` on the SAME terms as their `activity` and `host_error` siblings: read from that perch's own `info.json`, LOCAL ROWS ONLY, additive and `skip_serializing_if` so an endpoint with no recorded cwd/adapter or a manifest declaring no commune dir OMITS the key rather than guessing (an absent field is honest; a guessed dir is worse than silence). SUBNET-REMOTE ROWS (`EndpointRowJson`) STAY BARE (doyle ruling 1): a remote endpoint's drop dir is another NODE'S filesystem fact, and surfacing it here invites acting on a path this machine cannot read. The HUMAN view gains the same fact for SELF -- one annotation line under the self pin, the `psyche-host:` / `input-translation:` family -- so the answer does not require `--json`. Gate: doc -- the published drop-file-protocol clause telling an agent to READ the resolved dir rather than re-derive it, naming both JSON fields and the human line (the DISCOVERABILITY half of the residual: nothing pointed at the shipped field, which is how a multi-round probe happened over a fact that was already there, and how the ticket came to be filed on a false premise); impl -- the local-row field + the human self-pin line, both sourced through the one resolver, never a second derivation; unit -- a local row with a resolvable dir CARRIES it while a row with no cwd/adapter OMITS the key (the pair asserted together, since either alone passes an implementation that is uniform the wrong way), the remote row shape is UNCHANGED (the ruled boundary, pinned so a later widening is a decision and not a drift), and the human self pin renders the dir when known and renders NOTHING extra when not.",
2026-08-28T09:54:46.4798780Z       "requiredStages": [
2026-08-28T09:54:46.4798927Z         "doc",
2026-08-28T09:54:46.4799165Z         "impl",
2026-08-28T09:54:46.4799319Z         "unit"
2026-08-28T09:54:46.4799466Z       ],
2026-08-28T09:54:46.4799624Z       "stages": {
2026-08-28T09:54:46.4799771Z         "doc": {
2026-08-28T09:54:46.4799934Z           "complete": true,
2026-08-28T09:54:46.4800090Z           "evidence": [
2026-08-28T09:54:46.4800239Z             {
2026-08-28T09:54:46.4800481Z               "path": "docs-site/src/harness-contract/echo-commune.md",
2026-08-28T09:54:46.4800645Z               "line": 206
2026-08-28T09:54:46.4800795Z             }
2026-08-28T09:54:46.4800948Z           ]
2026-08-28T09:54:46.4801103Z         },
2026-08-28T09:54:46.4801255Z         "impl": {
2026-08-28T09:54:46.4801422Z           "complete": true,
2026-08-28T09:54:46.4801585Z           "evidence": [
2026-08-28T09:54:46.4801746Z             {
2026-08-28T09:54:46.4801923Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4802089Z               "line": 6325
2026-08-28T09:54:46.4802252Z             },
2026-08-28T09:54:46.4802399Z             {
2026-08-28T09:54:46.4802586Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4802743Z               "line": 6519
2026-08-28T09:54:46.4802891Z             },
2026-08-28T09:54:46.4803038Z             {
2026-08-28T09:54:46.4803220Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4803372Z               "line": 12122
2026-08-28T09:54:46.4803531Z             },
2026-08-28T09:54:46.4803686Z             {
2026-08-28T09:54:46.4803866Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4804022Z               "line": 12192
2026-08-28T09:54:46.4804171Z             }
2026-08-28T09:54:46.4804318Z           ]
2026-08-28T09:54:46.4804580Z         },
2026-08-28T09:54:46.4804728Z         "int": {
2026-08-28T09:54:46.4804890Z           "complete": false,
2026-08-28T09:54:46.4805052Z           "evidence": []
2026-08-28T09:54:46.4805205Z         },
2026-08-28T09:54:46.4805353Z         "unit": {
2026-08-28T09:54:46.4805515Z           "complete": true,
2026-08-28T09:54:46.4805658Z           "evidence": [
2026-08-28T09:54:46.4805815Z             {
2026-08-28T09:54:46.4806012Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4806172Z               "line": 26801
2026-08-28T09:54:46.4806319Z             },
2026-08-28T09:54:46.4806470Z             {
2026-08-28T09:54:46.4806641Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4806795Z               "line": 26850
2026-08-28T09:54:46.4806947Z             }
2026-08-28T09:54:46.4807090Z           ]
2026-08-28T09:54:46.4807242Z         }
2026-08-28T09:54:46.4807386Z       }
2026-08-28T09:54:46.4807542Z     },
2026-08-28T09:54:46.4807686Z     {
2026-08-28T09:54:46.4807910Z       "id": "REQ-ENDPOINT-LIST-JOINED-SUBNETS-LABEL",
2026-08-28T09:54:46.4814630Z       "title": "THE THIS-NODE SUBNET LINE IN `spt endpoint list` SAYS JOINED, NOT SHARED (releases#72, BUGFIX). The two subnet lines this surface renders are DIFFERENT FACTS wearing one label: the This-node line lists the subnets THIS node is a member of (cmd_endpoint_list names, narrowed by --subnet), while a remote node row lists the subnets that node gossips a visible row through UNIONED ACROSS OUR MEMBERSHIPS -- the subnets we have in common with that machine. Calling the first one Shared invites the reader to look for a second party that is not there. THE REMOTE LINE KEEPS ITS NAME and that is part of the requirement rather than an omission: Shared is precise for a row whose content IS an intersection, and renaming both would trade one imprecision for another. The render docs already carry the corrected vocabulary (render_node_grouped is documented as carrying our joined subnets for this node and a Shared subnets line for the remotes), so this change makes the rendered text agree with the language the code already uses for it. THE UNIT EVIDENCE MUST DISCRIMINATE THE TWO LINES, which the pre-fix assertion could not: its fixture gave the This-node set and the remote set the SAME members, so a substring assertion matched either line and would have passed unchanged while the subject of the assertion silently changed. The repinned row asserts each label once, against fixtures whose two subnet sets DIFFER, so a build that renames the wrong line fails it. Gate: impl -- the This-node line renders Joined subnets while the remote-group line is untouched; unit -- both labels asserted by name with distinct fixtures, so neither line can be renamed, dropped or duplicated unobserved.",
2026-08-28T09:54:46.4814925Z       "requiredStages": [
2026-08-28T09:54:46.4815074Z         "doc",
2026-08-28T09:54:46.4815231Z         "impl",
2026-08-28T09:54:46.4815383Z         "unit"
2026-08-28T09:54:46.4815531Z       ],
2026-08-28T09:54:46.4815698Z       "stages": {
2026-08-28T09:54:46.4815855Z         "doc": {
2026-08-28T09:54:46.4816023Z           "complete": true,
2026-08-28T09:54:46.4816180Z           "evidence": [
2026-08-28T09:54:46.4816328Z             {
2026-08-28T09:54:46.4816543Z               "path": "docs-site/src/lifecycle/overview.md",
2026-08-28T09:54:46.4816704Z               "line": 91
2026-08-28T09:54:46.4816855Z             }
2026-08-28T09:54:46.4817002Z           ]
2026-08-28T09:54:46.4817148Z         },
2026-08-28T09:54:46.4817302Z         "impl": {
2026-08-28T09:54:46.4817468Z           "complete": true,
2026-08-28T09:54:46.4817622Z           "evidence": [
2026-08-28T09:54:46.4817773Z             {
2026-08-28T09:54:46.4817960Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4818121Z               "line": 7426
2026-08-28T09:54:46.4818275Z             }
2026-08-28T09:54:46.4818422Z           ]
2026-08-28T09:54:46.4818570Z         },
2026-08-28T09:54:46.4818713Z         "int": {
2026-08-28T09:54:46.4818881Z           "complete": false,
2026-08-28T09:54:46.4819224Z           "evidence": []
2026-08-28T09:54:46.4819385Z         },
2026-08-28T09:54:46.4819534Z         "unit": {
2026-08-28T09:54:46.4819698Z           "complete": true,
2026-08-28T09:54:46.4819862Z           "evidence": [
2026-08-28T09:54:46.4820008Z             {
2026-08-28T09:54:46.4820191Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4820342Z               "line": 27191
2026-08-28T09:54:46.4820496Z             }
2026-08-28T09:54:46.4820643Z           ]
2026-08-28T09:54:46.4820792Z         }
2026-08-28T09:54:46.4820939Z       }
2026-08-28T09:54:46.4824651Z     },
2026-08-28T09:54:46.4824839Z     {
2026-08-28T09:54:46.4825038Z       "id": "REQ-ENDPOINT-LIST-MERGE-LOCAL",
2026-08-28T09:54:46.4827699Z       "title": "`spt endpoint list` always merges this node's LOCAL (unadvertised) perches into the view; the `--local` flag is REMOVED (operator decision 2026-06-17). Rationale: `spt whoami` is a thin alias of `endpoint list` — a just-online agent running `whoami` must see its OWN perch, or it gets an omitted-self view ('chaos'). FIX: drop the `--local` flag + its `--detail` conflict test + the v0.10.0 REQ-PICKER-5 hint line (cli.rs:1678) + cmd_list_local; the bare list merges local perches into the subnet view; fix the whoami alias path accordingly. Run `cargo run -p xtask -- gen` (docs-drift, DEFAULT target). (v0.12.1)",
2026-08-28T09:54:46.4827887Z       "requiredStages": [
2026-08-28T09:54:46.4828024Z         "doc",
2026-08-28T09:54:46.4828172Z         "impl",
2026-08-28T09:54:46.4828314Z         "unit"
2026-08-28T09:54:46.4828459Z       ],
2026-08-28T09:54:46.4828610Z       "stages": {
2026-08-28T09:54:46.4828754Z         "doc": {
2026-08-28T09:54:46.4828916Z           "complete": true,
2026-08-28T09:54:46.4829178Z           "evidence": [
2026-08-28T09:54:46.4829325Z             {
2026-08-28T09:54:46.4829492Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.4829650Z               "line": 1041
2026-08-28T09:54:46.4829793Z             }
2026-08-28T09:54:46.4829950Z           ]
2026-08-28T09:54:46.4830240Z         },
2026-08-28T09:54:46.4830393Z         "impl": {
2026-08-28T09:54:46.4830550Z           "complete": true,
2026-08-28T09:54:46.4830703Z           "evidence": [
2026-08-28T09:54:46.4830850Z             {
2026-08-28T09:54:46.4831037Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4831203Z               "line": 6147
2026-08-28T09:54:46.4831352Z             },
2026-08-28T09:54:46.4831503Z             {
2026-08-28T09:54:46.4831685Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4831842Z               "line": 6630
2026-08-28T09:54:46.4831986Z             },
2026-08-28T09:54:46.4832138Z             {
2026-08-28T09:54:46.4832306Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4832466Z               "line": 7399
2026-08-28T09:54:46.4832611Z             }
2026-08-28T09:54:46.4832757Z           ]
2026-08-28T09:54:46.4832895Z         },
2026-08-28T09:54:46.4833041Z         "int": {
2026-08-28T09:54:46.4833280Z           "complete": false,
2026-08-28T09:54:46.4833440Z           "evidence": []
2026-08-28T09:54:46.4833585Z         },
2026-08-28T09:54:46.4833737Z         "unit": {
2026-08-28T09:54:46.4833895Z           "complete": true,
2026-08-28T09:54:46.4834056Z           "evidence": [
2026-08-28T09:54:46.4834200Z             {
2026-08-28T09:54:46.4834381Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4834558Z               "line": 27228
2026-08-28T09:54:46.4834719Z             },
2026-08-28T09:54:46.4834863Z             {
2026-08-28T09:54:46.4835038Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4835197Z               "line": 28991
2026-08-28T09:54:46.4835342Z             }
2026-08-28T09:54:46.4835490Z           ]
2026-08-28T09:54:46.4835636Z         }
2026-08-28T09:54:46.4835784Z       }
2026-08-28T09:54:46.4835927Z     },
2026-08-28T09:54:46.4836074Z     {
2026-08-28T09:54:46.4836266Z       "id": "REQ-ENDPOINT-LIST-NODE-GROUPED",
2026-08-28T09:54:46.4843845Z       "title": "spt endpoint list is node-grouped over unique INSTANCES, not subnet-grouped over duplicated rows: one row per (id,node) instance — subnet duplication collapsed (ADR-0006 §1: subnet is never an identity axis), freshest-epoch wins a cross-subnet status disagreement (the resolve_among twin rule) — grouped under 'This node: <label>' (cyan; local roster is the status truth, advertised-status vocabulary, corrupt = suspended + corrupt annotation) then remote nodes alphabetical (node name orange 38;5;208, the legacy $LIVE orange), this node carrying a light-gray 'Joined subnets:' line (the subnets this node is a member of -- renamed from 'Shared', releases#72, see REQ-ENDPOINT-LIST-JOINED-SUBNETS-LABEL) and each REMOTE node a light-gray 'Shared subnets:' line (subnets among our memberships where that node gossips any visible row; per-instance subnet detail stays in --json/--detail), instance rows [id, endpoint_type, glyph, status] (endpoint_type threaded from Instance.endpoint_type through ResourceRow — additive, pre-field rows render '-'), per-node 'Total:' lines with NO grand total (the stderr ENDPOINTS:<n> line is REMOVED — it counted subnet rows, so the same instance in N subnets counted N times), SELF pin kept first with a '(self @ <node>)' marker (REQ-WHOAMI-1 alias; self also appears as a This-node row so the node total stays honest), remote nodes with zero visible instances skipped, --subnet narrows the union to that subnet's view, --json DTO structure UNCHANGED (committed surface; gains only an additive endpoint_type field). Grill-with-docs ruling 2026-07-02 (operator + doyle); sibling of REQ-PICKER-NODE-GROUPING (the picker half of the same dedup law).",
2026-08-28T09:54:46.4844048Z       "requiredStages": [
2026-08-28T09:54:46.4844197Z         "impl",
2026-08-28T09:54:46.4844348Z         "unit"
2026-08-28T09:54:46.4844507Z       ],
2026-08-28T09:54:46.4844693Z       "stages": {
2026-08-28T09:54:46.4844840Z         "doc": {
2026-08-28T09:54:46.4845012Z           "complete": false,
2026-08-28T09:54:46.4845174Z           "evidence": []
2026-08-28T09:54:46.4845456Z         },
2026-08-28T09:54:46.4845604Z         "impl": {
2026-08-28T09:54:46.4845771Z           "complete": true,
2026-08-28T09:54:46.4845922Z           "evidence": [
2026-08-28T09:54:46.4846074Z             {
2026-08-28T09:54:46.4846286Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.4846444Z               "line": 543
2026-08-28T09:54:46.4846601Z             },
2026-08-28T09:54:46.4846750Z             {
2026-08-28T09:54:46.4846959Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.4847117Z               "line": 550
2026-08-28T09:54:46.4847269Z             },
2026-08-28T09:54:46.4847417Z             {
2026-08-28T09:54:46.4847618Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.4847778Z               "line": 626
2026-08-28T09:54:46.4847928Z             },
2026-08-28T09:54:46.4848075Z             {
2026-08-28T09:54:46.4848271Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.4848441Z               "line": 628
2026-08-28T09:54:46.4848589Z             },
2026-08-28T09:54:46.4848739Z             {
2026-08-28T09:54:46.4848915Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4849163Z               "line": 6267
2026-08-28T09:54:46.4849316Z             },
2026-08-28T09:54:46.4849463Z             {
2026-08-28T09:54:46.4849645Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4849797Z               "line": 6475
2026-08-28T09:54:46.4849946Z             },
2026-08-28T09:54:46.4850098Z             {
2026-08-28T09:54:46.4850279Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4850437Z               "line": 6684
2026-08-28T09:54:46.4850590Z             },
2026-08-28T09:54:46.4850742Z             {
2026-08-28T09:54:46.4850914Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4851076Z               "line": 7011
2026-08-28T09:54:46.4851224Z             },
2026-08-28T09:54:46.4851475Z             {
2026-08-28T09:54:46.4851651Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4851809Z               "line": 7026
2026-08-28T09:54:46.4851956Z             },
2026-08-28T09:54:46.4852105Z             {
2026-08-28T09:54:46.4852280Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4852434Z               "line": 7115
2026-08-28T09:54:46.4852581Z             },
2026-08-28T09:54:46.4852730Z             {
2026-08-28T09:54:46.4852910Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4853059Z               "line": 7153
2026-08-28T09:54:46.4853220Z             },
2026-08-28T09:54:46.4853369Z             {
2026-08-28T09:54:46.4853553Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4853705Z               "line": 7224
2026-08-28T09:54:46.4853856Z             },
2026-08-28T09:54:46.4854003Z             {
2026-08-28T09:54:46.4854180Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4854337Z               "line": 7398
2026-08-28T09:54:46.4854485Z             }
2026-08-28T09:54:46.4854638Z           ]
2026-08-28T09:54:46.4854786Z         },
2026-08-28T09:54:46.4854933Z         "int": {
2026-08-28T09:54:46.4855096Z           "complete": false,
2026-08-28T09:54:46.4855257Z           "evidence": []
2026-08-28T09:54:46.4855410Z         },
2026-08-28T09:54:46.4855557Z         "unit": {
2026-08-28T09:54:46.4855715Z           "complete": true,
2026-08-28T09:54:46.4855868Z           "evidence": [
2026-08-28T09:54:46.4856021Z             {
2026-08-28T09:54:46.4856231Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.4856383Z               "line": 2000
2026-08-28T09:54:46.4856534Z             },
2026-08-28T09:54:46.4856681Z             {
2026-08-28T09:54:46.4856861Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4857014Z               "line": 26583
2026-08-28T09:54:46.4857166Z             },
2026-08-28T09:54:46.4857310Z             {
2026-08-28T09:54:46.4857495Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4857762Z               "line": 26937
2026-08-28T09:54:46.4857911Z             },
2026-08-28T09:54:46.4858063Z             {
2026-08-28T09:54:46.4858240Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4858401Z               "line": 26968
2026-08-28T09:54:46.4858545Z             },
2026-08-28T09:54:46.4858692Z             {
2026-08-28T09:54:46.4858870Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4859115Z               "line": 26991
2026-08-28T09:54:46.4859267Z             },
2026-08-28T09:54:46.4859413Z             {
2026-08-28T09:54:46.4859591Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4859742Z               "line": 27009
2026-08-28T09:54:46.4859895Z             },
2026-08-28T09:54:46.4860043Z             {
2026-08-28T09:54:46.4860224Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4860381Z               "line": 27380
2026-08-28T09:54:46.4860534Z             },
2026-08-28T09:54:46.4860687Z             {
2026-08-28T09:54:46.4860863Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4861020Z               "line": 28613
2026-08-28T09:54:46.4861164Z             }
2026-08-28T09:54:46.4861316Z           ]
2026-08-28T09:54:46.4861460Z         }
2026-08-28T09:54:46.4861607Z       }
2026-08-28T09:54:46.4861751Z     },
2026-08-28T09:54:46.4861887Z     {
2026-08-28T09:54:46.4862074Z       "id": "REQ-ENDPOINT-LIST-NODE-IDENT",
2026-08-28T09:54:46.4864123Z       "title": "Bug #5: spt endpoint list local section header is the hardcoded literal LOCAL (this node) (render_local_section cli.rs:4359). Change to 'This node: <node-id>' using the existing node-ident idiom (os_hostname + nodeid public-key prefix, cli.rs:5531 — factor a node_ident_display helper); compute in the impure print_local_section, pass into the pure renderer. Update the two test assertions (cli.rs:10711/10716). See docs/NEXT-MILESTONE-BUG-TRIAGE.md #5.",
2026-08-28T09:54:46.4864402Z       "requiredStages": [
2026-08-28T09:54:46.4864549Z         "impl",
2026-08-28T09:54:46.4864703Z         "unit"
2026-08-28T09:54:46.4864849Z       ],
2026-08-28T09:54:46.4864998Z       "stages": {
2026-08-28T09:54:46.4865154Z         "doc": {
2026-08-28T09:54:46.4865312Z           "complete": false,
2026-08-28T09:54:46.4865469Z           "evidence": []
2026-08-28T09:54:46.4865608Z         },
2026-08-28T09:54:46.4865755Z         "impl": {
2026-08-28T09:54:46.4865914Z           "complete": true,
2026-08-28T09:54:46.4866070Z           "evidence": [
2026-08-28T09:54:46.4866220Z             {
2026-08-28T09:54:46.4866404Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4866567Z               "line": 6566
2026-08-28T09:54:46.4866714Z             },
2026-08-28T09:54:46.4866864Z             {
2026-08-28T09:54:46.4867033Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4867195Z               "line": 7400
2026-08-28T09:54:46.4867340Z             },
2026-08-28T09:54:46.4867488Z             {
2026-08-28T09:54:46.4867679Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4867837Z               "line": 11845
2026-08-28T09:54:46.4867988Z             }
2026-08-28T09:54:46.4868133Z           ]
2026-08-28T09:54:46.4868284Z         },
2026-08-28T09:54:46.4868433Z         "int": {
2026-08-28T09:54:46.4868590Z           "complete": false,
2026-08-28T09:54:46.4868743Z           "evidence": []
2026-08-28T09:54:46.4868894Z         },
2026-08-28T09:54:46.4869124Z         "unit": {
2026-08-28T09:54:46.4869286Z           "complete": true,
2026-08-28T09:54:46.4869448Z           "evidence": [
2026-08-28T09:54:46.4869618Z             {
2026-08-28T09:54:46.4869794Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4869944Z               "line": 27228
2026-08-28T09:54:46.4870094Z             }
2026-08-28T09:54:46.4870235Z           ]
2026-08-28T09:54:46.4870384Z         }
2026-08-28T09:54:46.4870531Z       }
2026-08-28T09:54:46.4870675Z     },
2026-08-28T09:54:46.4870832Z     {
2026-08-28T09:54:46.4871028Z       "id": "REQ-ENDPOINT-LIST-OWN-NESTED-SECTION",
2026-08-28T09:54:46.4880692Z       "title": "`spt endpoint list` SHOWS THE CALLING ENDPOINT ITS OWN NESTED PERCHES, in a section of their own (releases#98, ADDITION; ruled 2026-08-02). A live agent cannot see its own psyche or its own workers on the surface that exists to answer what is running here: nested perches live at owlery/<parent>/nested/<child>/ and the roster this view is built from enumerates top-level perches only, so the children are invisible by construction rather than by choice. THE NESTING RELATION IS THE STRUCTURAL ONE SPT-CORE ALREADY RECORDS -- the child dir sitting inside the parent perch dir -- AND IT IS THE ONLY SOURCE. NAME-PREFIX MATCHING IS NEVER CONSULTED, and that negative is required text rather than implied by the positive: a perch named <parent>-foo that is not nested does NOT appear, and a genuinely nested perch appears WHATEVER it is called. A build that filtered the flat roster by id prefix would satisfy a naive shows-my-psyche assertion while being wrong in both directions. THE SECTION IS THE CALLERS OWN AND NO ONE ELSES: every other agent entry renders exactly as it does today, so this adds a self-view rather than a new cross-agent disclosure. CALLER IDENTITY RIDES THE EXISTING ENV AND PROCESS-IDENTITY SEAM (roster detect_self_id: session-id match across the nested-inclusive perch enumeration, then the pinned agent and endpoint env vars accepted only when they map to a bound perch, then process ancestry) -- NO NEW IDENTITY CHANNEL IS MINTED, and nothing here confers authority: the seam is label-only by construction (KNOWN-HAZARDS 7.3/7.5) and this consumer only decides whose children to render. A CALLER THE SEAM CANNOT RESOLVE SIMPLY GETS NO SECTION -- silence, never a guessed parent whose children would then be shown to the wrong reader. Path composition for the nested namespace belongs in the single perch-layout source, not in the CLI, per the single-path-source invariant. Gate: impl -- a nested-perch enumerator keyed on the parent in the perch-layout module, the caller resolution at the gather site, and the section rendered inside the This-node group by the existing pure renderer; unit -- a nested child appears under its parent for the calling endpoint, a same-prefix NON-nested perch does NOT appear, a nested child with an unrelated name DOES, another agent nested children are absent from the callers section, and an unresolvable caller renders no section at all.",
2026-08-28T09:54:46.4880978Z       "requiredStages": [
2026-08-28T09:54:46.4881125Z         "doc",
2026-08-28T09:54:46.4881278Z         "impl",
2026-08-28T09:54:46.4881425Z         "unit"
2026-08-28T09:54:46.4881574Z       ],
2026-08-28T09:54:46.4881726Z       "stages": {
2026-08-28T09:54:46.4881880Z         "doc": {
2026-08-28T09:54:46.4882036Z           "complete": true,
2026-08-28T09:54:46.4882195Z           "evidence": [
2026-08-28T09:54:46.4882336Z             {
2026-08-28T09:54:46.4882547Z               "path": "docs-site/src/lifecycle/overview.md",
2026-08-28T09:54:46.4882704Z               "line": 78
2026-08-28T09:54:46.4882852Z             }
2026-08-28T09:54:46.4882998Z           ]
2026-08-28T09:54:46.4883141Z         },
2026-08-28T09:54:46.4883289Z         "impl": {
2026-08-28T09:54:46.4883441Z           "complete": true,
2026-08-28T09:54:46.4883590Z           "evidence": [
2026-08-28T09:54:46.4883756Z             {
2026-08-28T09:54:46.4883985Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.4884138Z               "line": 855
2026-08-28T09:54:46.4884286Z             },
2026-08-28T09:54:46.4884434Z             {
2026-08-28T09:54:46.4884624Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.4884787Z               "line": 890
2026-08-28T09:54:46.4884929Z             },
2026-08-28T09:54:46.4885078Z             {
2026-08-28T09:54:46.4885257Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4885409Z               "line": 6657
2026-08-28T09:54:46.4885560Z             },
2026-08-28T09:54:46.4885708Z             {
2026-08-28T09:54:46.4885998Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4886152Z               "line": 7453
2026-08-28T09:54:46.4886308Z             },
2026-08-28T09:54:46.4886452Z             {
2026-08-28T09:54:46.4886648Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.4886805Z               "line": 157
2026-08-28T09:54:46.4886957Z             }
2026-08-28T09:54:46.4887114Z           ]
2026-08-28T09:54:46.4887262Z         },
2026-08-28T09:54:46.4887415Z         "int": {
2026-08-28T09:54:46.4887577Z           "complete": false,
2026-08-28T09:54:46.4887739Z           "evidence": []
2026-08-28T09:54:46.4887883Z         },
2026-08-28T09:54:46.4888035Z         "unit": {
2026-08-28T09:54:46.4888200Z           "complete": true,
2026-08-28T09:54:46.4888353Z           "evidence": [
2026-08-28T09:54:46.4888498Z             {
2026-08-28T09:54:46.4888695Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.4888851Z               "line": 1109
2026-08-28T09:54:46.4889080Z             },
2026-08-28T09:54:46.4889239Z             {
2026-08-28T09:54:46.4889418Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4889577Z               "line": 27013
2026-08-28T09:54:46.4889728Z             },
2026-08-28T09:54:46.4889878Z             {
2026-08-28T09:54:46.4890062Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4890221Z               "line": 27070
2026-08-28T09:54:46.4890368Z             },
2026-08-28T09:54:46.4890512Z             {
2026-08-28T09:54:46.4890696Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.4890848Z               "line": 307
2026-08-28T09:54:46.4890999Z             }
2026-08-28T09:54:46.4891156Z           ]
2026-08-28T09:54:46.4891304Z         }
2026-08-28T09:54:46.4891451Z       }
2026-08-28T09:54:46.4891595Z     },
2026-08-28T09:54:46.4891747Z     {
2026-08-28T09:54:46.4891938Z       "id": "REQ-ENDPOINT-LIST-PALETTE",
2026-08-28T09:54:46.4895527Z       "title": "Bugs #11 + #15 (display): spt endpoint list renders status as plain text while the picker turns the same ResourceRow into the W5 colored EpDisplay palette. Fix: extract one shared ResourceRow-to-EpDisplay builder + make the picker display enums/helpers public, and have endpoint list render the same colored status squares (via helpfmt stdout_color, not ratatui Span). This also fixes #15 — a lone warm detached instance renders as its online flavor (Dormant maps to online) instead of leaking the bare word Dormant through the text-only list (no resting.rs/CONTEXT model change; operator ruling display-only). Couples REQ-PICKER-NODE-GROUPING (both edit subnet_rows — sequence the shared-builder extraction first). See docs/NEXT-MILESTONE-BUG-TRIAGE.md #11/#15.",
2026-08-28T09:54:46.4895704Z       "requiredStages": [
2026-08-28T09:54:46.4895851Z         "impl",
2026-08-28T09:54:46.4895998Z         "unit"
2026-08-28T09:54:46.4896144Z       ],
2026-08-28T09:54:46.4896301Z       "stages": {
2026-08-28T09:54:46.4896454Z         "doc": {
2026-08-28T09:54:46.4896611Z           "complete": false,
2026-08-28T09:54:46.4896778Z           "evidence": []
2026-08-28T09:54:46.4896931Z         },
2026-08-28T09:54:46.4897083Z         "impl": {
2026-08-28T09:54:46.4897246Z           "complete": true,
2026-08-28T09:54:46.4897403Z           "evidence": [
2026-08-28T09:54:46.4897547Z             {
2026-08-28T09:54:46.4897732Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4897885Z               "line": 7225
2026-08-28T09:54:46.4898037Z             },
2026-08-28T09:54:46.4898186Z             {
2026-08-28T09:54:46.4898390Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.4898548Z               "line": 574
2026-08-28T09:54:46.4898689Z             }
2026-08-28T09:54:46.4898841Z           ]
2026-08-28T09:54:46.4899096Z         },
2026-08-28T09:54:46.4899250Z         "int": {
2026-08-28T09:54:46.4899411Z           "complete": false,
2026-08-28T09:54:46.4899564Z           "evidence": []
2026-08-28T09:54:46.4899716Z         },
2026-08-28T09:54:46.4899988Z         "unit": {
2026-08-28T09:54:46.4900152Z           "complete": true,
2026-08-28T09:54:46.4900303Z           "evidence": [
2026-08-28T09:54:46.4900447Z             {
2026-08-28T09:54:46.4900627Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4900786Z               "line": 26583
2026-08-28T09:54:46.4900937Z             },
2026-08-28T09:54:46.4901082Z             {
2026-08-28T09:54:46.4901285Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.4901437Z               "line": 1838
2026-08-28T09:54:46.4901592Z             }
2026-08-28T09:54:46.4901740Z           ]
2026-08-28T09:54:46.4901883Z         }
2026-08-28T09:54:46.4902031Z       }
2026-08-28T09:54:46.4902179Z     },
2026-08-28T09:54:46.4902332Z     {
2026-08-28T09:54:46.4902522Z       "id": "REQ-ENDPOINT-LIST-PROJECT-COL",
2026-08-28T09:54:46.4905344Z       "title": "#8: spt endpoint list gains a second column <project>/ (the endpoint's LATEST project) -> 4 columns total: id / <project>/ / type / status. Local rows: head of REQ-PICKER-PROJECT-HISTORY-TRUTH (sessions.log-derived, owlery-excluded). Remote rows: head of REQ-GOSSIP-ADAPTER-PROJECTS recent_projects. Project IDs only + #4 disambiguation; '-' when unknown (pre-field remote rows). Extends the v0.21.0 node-grouped renderer (format_instance_rows — additive column, alignment char-width-safe). --json: additive project field on the row DTO (skip-if-none, N-1 safe). Depends on #1 + #4. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #8.",
2026-08-28T09:54:46.4905521Z       "requiredStages": [
2026-08-28T09:54:46.4905668Z         "impl",
2026-08-28T09:54:46.4905816Z         "unit"
2026-08-28T09:54:46.4905955Z       ],
2026-08-28T09:54:46.4906102Z       "stages": {
2026-08-28T09:54:46.4906250Z         "doc": {
2026-08-28T09:54:46.4906420Z           "complete": false,
2026-08-28T09:54:46.4906568Z           "evidence": []
2026-08-28T09:54:46.4906713Z         },
2026-08-28T09:54:46.4906871Z         "impl": {
2026-08-28T09:54:46.4907133Z           "complete": true,
2026-08-28T09:54:46.4907300Z           "evidence": [
2026-08-28T09:54:46.4907438Z             {
2026-08-28T09:54:46.4907629Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4907788Z               "line": 6273
2026-08-28T09:54:46.4907939Z             },
2026-08-28T09:54:46.4908087Z             {
2026-08-28T09:54:46.4908268Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4908427Z               "line": 6290
2026-08-28T09:54:46.4908577Z             },
2026-08-28T09:54:46.4908737Z             {
2026-08-28T09:54:46.4908911Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4909146Z               "line": 6477
2026-08-28T09:54:46.4909297Z             },
2026-08-28T09:54:46.4909449Z             {
2026-08-28T09:54:46.4909623Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4909786Z               "line": 6495
2026-08-28T09:54:46.4909938Z             },
2026-08-28T09:54:46.4910087Z             {
2026-08-28T09:54:46.4910267Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4910425Z               "line": 6643
2026-08-28T09:54:46.4910581Z             },
2026-08-28T09:54:46.4910726Z             {
2026-08-28T09:54:46.4910906Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4911055Z               "line": 6788
2026-08-28T09:54:46.4911206Z             },
2026-08-28T09:54:46.4911360Z             {
2026-08-28T09:54:46.4911540Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4911699Z               "line": 7094
2026-08-28T09:54:46.4911845Z             },
2026-08-28T09:54:46.4911992Z             {
2026-08-28T09:54:46.4912171Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4912325Z               "line": 7131
2026-08-28T09:54:46.4912476Z             },
2026-08-28T09:54:46.4912630Z             {
2026-08-28T09:54:46.4912839Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.4913001Z               "line": 462
2026-08-28T09:54:46.4913158Z             }
2026-08-28T09:54:46.4913415Z           ]
2026-08-28T09:54:46.4913570Z         },
2026-08-28T09:54:46.4913716Z         "int": {
2026-08-28T09:54:46.4913884Z           "complete": false,
2026-08-28T09:54:46.4914041Z           "evidence": []
2026-08-28T09:54:46.4914199Z         },
2026-08-28T09:54:46.4914350Z         "unit": {
2026-08-28T09:54:46.4914509Z           "complete": true,
2026-08-28T09:54:46.4914669Z           "evidence": [
2026-08-28T09:54:46.4914817Z             {
2026-08-28T09:54:46.4914998Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4915155Z               "line": 26651
2026-08-28T09:54:46.4915308Z             },
2026-08-28T09:54:46.4915451Z             {
2026-08-28T09:54:46.4915637Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4915800Z               "line": 26688
2026-08-28T09:54:46.4915947Z             },
2026-08-28T09:54:46.4916095Z             {
2026-08-28T09:54:46.4916271Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4916439Z               "line": 26710
2026-08-28T09:54:46.4916590Z             }
2026-08-28T09:54:46.4916739Z           ]
2026-08-28T09:54:46.4916886Z         }
2026-08-28T09:54:46.4917033Z       }
2026-08-28T09:54:46.4917179Z     },
2026-08-28T09:54:46.4917330Z     {
2026-08-28T09:54:46.4917531Z       "id": "REQ-ENDPOINT-LIST-RENDER-POLISH",
2026-08-28T09:54:46.4921033Z       "title": "A6 (F028, operator, 4 asks): `spt endpoint list` render polish. (a) the 'Shared subnets' line is NOT dim — LIGHT_GRAY = \"37\" (cli.rs:3019) is standard-palette WHITE, indistinguishable from row text; use SGR 90 (bright-black/gray) for the dim intent. (b) the `Total:` line takes the same dim color. (c) move the status glyph ADJACENT to the endpoint name (operator: 'right behind the endpoint name'), mirroring the picker's glyph-beside-name presentation (today the glyph sits at the end next to the status word). (d) color the status WORD like the picker TUI (green ONLINE / gray OFFLINE / blue when driven, matching picker glyph semantics). All in render_node_grouped/render_instance_row (cli.rs ~3000s); pure render with an injected color decision — unit-testable off a tty. See triage A6.",
2026-08-28T09:54:46.4921333Z       "requiredStages": [
2026-08-28T09:54:46.4921495Z         "impl",
2026-08-28T09:54:46.4921643Z         "unit"
2026-08-28T09:54:46.4921795Z       ],
2026-08-28T09:54:46.4921944Z       "stages": {
2026-08-28T09:54:46.4922100Z         "doc": {
2026-08-28T09:54:46.4922264Z           "complete": false,
2026-08-28T09:54:46.4922419Z           "evidence": []
2026-08-28T09:54:46.4922562Z         },
2026-08-28T09:54:46.4922712Z         "impl": {
2026-08-28T09:54:46.4922870Z           "complete": true,
2026-08-28T09:54:46.4923026Z           "evidence": [
2026-08-28T09:54:46.4923181Z             {
2026-08-28T09:54:46.4923360Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4923524Z               "line": 7354
2026-08-28T09:54:46.4923689Z             },
2026-08-28T09:54:46.4923843Z             {
2026-08-28T09:54:46.4924028Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4924191Z               "line": 7361
2026-08-28T09:54:46.4924343Z             }
2026-08-28T09:54:46.4924492Z           ]
2026-08-28T09:54:46.4924648Z         },
2026-08-28T09:54:46.4924793Z         "int": {
2026-08-28T09:54:46.4924958Z           "complete": false,
2026-08-28T09:54:46.4925117Z           "evidence": []
2026-08-28T09:54:46.4925267Z         },
2026-08-28T09:54:46.4925425Z         "unit": {
2026-08-28T09:54:46.4925586Z           "complete": true,
2026-08-28T09:54:46.4925750Z           "evidence": [
2026-08-28T09:54:46.4925901Z             {
2026-08-28T09:54:46.4926079Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4926230Z               "line": 26636
2026-08-28T09:54:46.4926384Z             },
2026-08-28T09:54:46.4926540Z             {
2026-08-28T09:54:46.4926713Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4926869Z               "line": 27368
2026-08-28T09:54:46.4927023Z             }
2026-08-28T09:54:46.4927290Z           ]
2026-08-28T09:54:46.4927431Z         }
2026-08-28T09:54:46.4927588Z       }
2026-08-28T09:54:46.4927730Z     },
2026-08-28T09:54:46.4927886Z     {
2026-08-28T09:54:46.4928078Z       "id": "REQ-ENDPOINT-LIST-REST-FILTER",
2026-08-28T09:54:46.4931870Z       "title": "spt endpoint list hides SUSPENDED instances by default; a new --show-all flag reveals them. Status-first row ordering with fixed precedence ONLINE > CONTROLLED > UNBOUND > SUSPENDED (when shown) > corrupt last, alphabetical by id within each band. Two invariants: (1) CORRUPT rows ALWAYS render regardless of filters — corrupt is a record condition demanding operator action (purge/re-mint), not resting clutter; hiding it would re-create counter-39 bug #3 (cross-ref REQ-HAZARD-CORRUPT-PERCH-COHERENCE, CONTEXT.md instance-state _Also avoid_); (2) the per-node Total line DISCLOSES the filter — 'Total: N (+M suspended hidden)' — so nothing silently vanishes. Registry-Offline rows stay excluded by projection law (resource_projection skips unroutable; unchanged). Grill-with-docs ruling 2026-07-02 (operator + doyle).",
2026-08-28T09:54:46.4932050Z       "requiredStages": [
2026-08-28T09:54:46.4932208Z         "impl",
2026-08-28T09:54:46.4932360Z         "unit"
2026-08-28T09:54:46.4932514Z       ],
2026-08-28T09:54:46.4932665Z       "stages": {
2026-08-28T09:54:46.4932819Z         "doc": {
2026-08-28T09:54:46.4932984Z           "complete": false,
2026-08-28T09:54:46.4933141Z           "evidence": []
2026-08-28T09:54:46.4933286Z         },
2026-08-28T09:54:46.4933450Z         "impl": {
2026-08-28T09:54:46.4933615Z           "complete": true,
2026-08-28T09:54:46.4933769Z           "evidence": [
2026-08-28T09:54:46.4933920Z             {
2026-08-28T09:54:46.4934103Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4934259Z               "line": 7308
2026-08-28T09:54:46.4934408Z             },
2026-08-28T09:54:46.4934560Z             {
2026-08-28T09:54:46.4934856Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4935023Z               "line": 7330
2026-08-28T09:54:46.4935176Z             },
2026-08-28T09:54:46.4935319Z             {
2026-08-28T09:54:46.4935500Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4935658Z               "line": 7361
2026-08-28T09:54:46.4935813Z             }
2026-08-28T09:54:46.4935966Z           ]
2026-08-28T09:54:46.4936118Z         },
2026-08-28T09:54:46.4936262Z         "int": {
2026-08-28T09:54:46.4936429Z           "complete": false,
2026-08-28T09:54:46.4936591Z           "evidence": []
2026-08-28T09:54:46.4936739Z         },
2026-08-28T09:54:46.4936896Z         "unit": {
2026-08-28T09:54:46.4937058Z           "complete": true,
2026-08-28T09:54:46.4937216Z           "evidence": [
2026-08-28T09:54:46.4937367Z             {
2026-08-28T09:54:46.4937602Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4937753Z               "line": 27306
2026-08-28T09:54:46.4937913Z             },
2026-08-28T09:54:46.4938077Z             {
2026-08-28T09:54:46.4938253Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4938418Z               "line": 27331
2026-08-28T09:54:46.4938561Z             },
2026-08-28T09:54:46.4938718Z             {
2026-08-28T09:54:46.4938895Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4939119Z               "line": 27359
2026-08-28T09:54:46.4939262Z             },
2026-08-28T09:54:46.4939409Z             {
2026-08-28T09:54:46.4939611Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4939768Z               "line": 27412
2026-08-28T09:54:46.4939910Z             }
2026-08-28T09:54:46.4940044Z           ]
2026-08-28T09:54:46.4940196Z         }
2026-08-28T09:54:46.4940349Z       }
2026-08-28T09:54:46.4940498Z     },
2026-08-28T09:54:46.4940659Z     {
2026-08-28T09:54:46.4940864Z       "id": "REQ-ENDPOINT-MESSAGE-ONLY-DISPLAY",
2026-08-28T09:54:46.4948018Z       "title": "An online agent-family endpoint with NO session surface reads as message-reachable, not as a harness-hosted live agent and not as a plain ONLINE. (hertz v0.39.0 field report 2026-07-21; doyle PRODUCT RULING — deliberately NEITHER of the two options offered.) OBSERVED: an adapterless `spt ready` perch (type=ready_agent, adapter=null, ready/alive true) displays plain ONLINE with '(unknown adapter)'. SOURCE: picker/model.rs display_status returns Online for every non-live_agent type (~680-681) BEFORE consulting controllable, and amber HarnessOnly is live-agent-only (~683-687). RULING: that type gate is CORRECT and STAYS. 'ONLINE - HARNESS ONLY' means one specific thing — a LIVE AGENT whose session surface is owned by a harness rather than a broker PTY. Broadening it to 'online non-controllable agent-family' would make one label mean two different things, which is how a status label starts lying. An adapterless ready receiver is a THIRD truth: message-reachable, no session surface at all, nothing to attach to ever. So: a DISTINCT display state (working name 'ONLINE - MESSAGE ONLY') keyed on the endpoint TYPE (ready_agent), never on absence-of-adapter, and never an invented adapter name. SECOND RULING (same surface, separate lie): '(unknown adapter)' is itself a small diagnostic untruth — adapter=null is ABSENT, deliberately so, not unknown; the copy must say absent. Gate: impl — the distinct display state + the absent-adapter copy; unit — the display table gains the ready_agent row and the existing live_agent/gateway rows are UNCHANGED (this must not perturb the HarnessOnly gate), plus a label assertion for the new state.",
2026-08-28T09:54:46.4948328Z       "requiredStages": [],
2026-08-28T09:54:46.4948487Z       "stages": {
2026-08-28T09:54:46.4948647Z         "doc": {
2026-08-28T09:54:46.4948809Z           "complete": false,
2026-08-28T09:54:46.4949040Z           "evidence": []
2026-08-28T09:54:46.4949194Z         },
2026-08-28T09:54:46.4949345Z         "impl": {
2026-08-28T09:54:46.4949518Z           "complete": false,
2026-08-28T09:54:46.4949752Z           "evidence": []
2026-08-28T09:54:46.4950241Z         },
2026-08-28T09:54:46.4950400Z         "int": {
2026-08-28T09:54:46.4950566Z           "complete": false,
2026-08-28T09:54:46.4950725Z           "evidence": []
2026-08-28T09:54:46.4950857Z         },
2026-08-28T09:54:46.4951016Z         "unit": {
2026-08-28T09:54:46.4951176Z           "complete": false,
2026-08-28T09:54:46.4951330Z           "evidence": []
2026-08-28T09:54:46.4951476Z         }
2026-08-28T09:54:46.4951628Z       }
2026-08-28T09:54:46.4951769Z     },
2026-08-28T09:54:46.4951922Z     {
2026-08-28T09:54:46.4952117Z       "id": "REQ-ENDPOINT-ONLINE-TRUTH",
2026-08-28T09:54:46.4957309Z       "title": "REGISTRY-LIFECYCLE W2 (ADR-0041 decisions 1+2, emphasys C1 P0): ONLINE is earned, not declared — cmd_listen stamps status=online only from actual persisted state + hosting authority, never from manifest psyche_init capability alone (no more ready_agent/controllable=false hybrid rows born online-authoritative); livehost reconcile SPLITS control cleanup (clear controlled/driven_by/viewer_count for EVERY endpoint absent from session truth, regardless of state/controllable) from offline classification (live_agent+controllable gate unchanged); legacy hybrid rows self-heal after a SUCCESSFUL broker query only (broker failure is never interpreted as an empty session set); terminal signoff/owner-loss = atomic CAS-guarded offline + ready/address removal WITHOUT overloading soft api session-end (/clear preserves the live listener). Gate: impl — creator gate + reconcile split + self-heal + terminal path; unit — creator refuses capability-only online, cleanup clears stamps on state-quirk rows, broker-failure never mass-offlines; int — dead-PID hybrid row does NOT survive a reconcile cycle (the immortal-row regression); doc — ADR-0041.",
2026-08-28T09:54:46.4957501Z       "requiredStages": [
2026-08-28T09:54:46.4957663Z         "doc",
2026-08-28T09:54:46.4957850Z         "impl",
2026-08-28T09:54:46.4958001Z         "unit",
2026-08-28T09:54:46.4958149Z         "int"
2026-08-28T09:54:46.4958311Z       ],
2026-08-28T09:54:46.4958464Z       "stages": {
2026-08-28T09:54:46.4958736Z         "doc": {
2026-08-28T09:54:46.4958907Z           "complete": true,
2026-08-28T09:54:46.4959154Z           "evidence": [
2026-08-28T09:54:46.4959312Z             {
2026-08-28T09:54:46.4959543Z               "path": "docs/adr/0041-endpoint-lifecycle-truth.md",
2026-08-28T09:54:46.4959710Z               "line": 41
2026-08-28T09:54:46.4959857Z             }
2026-08-28T09:54:46.4960007Z           ]
2026-08-28T09:54:46.4960153Z         },
2026-08-28T09:54:46.4960307Z         "impl": {
2026-08-28T09:54:46.4960472Z           "complete": true,
2026-08-28T09:54:46.4960626Z           "evidence": [
2026-08-28T09:54:46.4960778Z             {
2026-08-28T09:54:46.4960984Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.4961145Z               "line": 1841
2026-08-28T09:54:46.4961294Z             },
2026-08-28T09:54:46.4961450Z             {
2026-08-28T09:54:46.4961656Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4961818Z               "line": 712
2026-08-28T09:54:46.4961966Z             },
2026-08-28T09:54:46.4962112Z             {
2026-08-28T09:54:46.4962320Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4962472Z               "line": 815
2026-08-28T09:54:46.4962631Z             },
2026-08-28T09:54:46.4962777Z             {
2026-08-28T09:54:46.4962978Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4963140Z               "line": 852
2026-08-28T09:54:46.4963284Z             },
2026-08-28T09:54:46.4963431Z             {
2026-08-28T09:54:46.4963626Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4963775Z               "line": 884
2026-08-28T09:54:46.4963917Z             },
2026-08-28T09:54:46.4964070Z             {
2026-08-28T09:54:46.4964269Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4964423Z               "line": 1013
2026-08-28T09:54:46.4964707Z             }
2026-08-28T09:54:46.4964863Z           ]
2026-08-28T09:54:46.4965019Z         },
2026-08-28T09:54:46.4965169Z         "int": {
2026-08-28T09:54:46.4965334Z           "complete": true,
2026-08-28T09:54:46.4965492Z           "evidence": [
2026-08-28T09:54:46.4965644Z             {
2026-08-28T09:54:46.4965892Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.4966046Z               "line": 168
2026-08-28T09:54:46.4966198Z             }
2026-08-28T09:54:46.4966346Z           ]
2026-08-28T09:54:46.4966498Z         },
2026-08-28T09:54:46.4966651Z         "unit": {
2026-08-28T09:54:46.4966827Z           "complete": true,
2026-08-28T09:54:46.4966985Z           "evidence": [
2026-08-28T09:54:46.4967136Z             {
2026-08-28T09:54:46.4967339Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4967499Z               "line": 1551
2026-08-28T09:54:46.4967647Z             },
2026-08-28T09:54:46.4967789Z             {
2026-08-28T09:54:46.4968009Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4968166Z               "line": 1581
2026-08-28T09:54:46.4968319Z             },
2026-08-28T09:54:46.4968461Z             {
2026-08-28T09:54:46.4968667Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4968823Z               "line": 1626
2026-08-28T09:54:46.4969048Z             },
2026-08-28T09:54:46.4969201Z             {
2026-08-28T09:54:46.4969400Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.4969560Z               "line": 1647
2026-08-28T09:54:46.4969701Z             },
2026-08-28T09:54:46.4969853Z             {
2026-08-28T09:54:46.4970051Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.4970213Z               "line": 2041
2026-08-28T09:54:46.4970370Z             }
2026-08-28T09:54:46.4970523Z           ]
2026-08-28T09:54:46.4970671Z         }
2026-08-28T09:54:46.4970819Z       }
2026-08-28T09:54:46.4970976Z     },
2026-08-28T09:54:46.4971124Z     {
2026-08-28T09:54:46.4971415Z       "id": "REQ-ENDPOINT-PURGE",
2026-08-28T09:54:46.4978387Z       "title": "`spt endpoint purge <id>` fully removes an endpoint AND every record keyed on it — the formal teardown devs/CI need for clean test setup/reset. NOT consent-gated (a local dev/test op — no peer consent). OFFLINE-ONLY: refuses while the endpoint is online / daemon-hosted (deleting records out from under a live host risks the daemon re-creating or re-hosting mid-purge); `--force` STOPS it first (endpoint stop → wait for the daemon reconcile to un-host + reap the Psyche) THEN purges. Confirms interactively unless `--yes` (the CI path). Refuses purging the CALLER's OWN running id. All LOCAL — purge reaches only THIS node's records; a remote endpoint's records can't be touched, and its subnet-registry rows decay via the epoch-lease eviction (REQ-HAZARD-REGISTRY-DECAY). Removes: (1) the perch dir TREE recursively — owlery/<id>/ incl every nested {id}-psyche / {id}-w* / shells child (info.json, ready marker, sessions.log ledger, spool.db, inbox, .idle/.more-done sentinels, auth token); (2) the registry address (registry::unregister_address); (3) the context store — ContextStore::remove_endpoint(id): the a-<id> branch+worktree + the <id>/ rows from every p-<project> branch (the same fn `fork --delete-source` already uses); (4) node-local trust rows keyed on the id — access.json + visibility.json. Reuse-heavy: it is `fork --delete-source` generalized (recursive perch remove + unregister + remove_endpoint) + the trust-record cleanup; `endpoint rename` already enumerates the same record set + uses the same offline-only gate. (v0.12.0)",
2026-08-28T09:54:46.4978579Z       "requiredStages": [
2026-08-28T09:54:46.4978735Z         "doc",
2026-08-28T09:54:46.4978889Z         "impl",
2026-08-28T09:54:46.4979122Z         "unit",
2026-08-28T09:54:46.4979270Z         "int"
2026-08-28T09:54:46.4979422Z       ],
2026-08-28T09:54:46.4979570Z       "stages": {
2026-08-28T09:54:46.4979833Z         "doc": {
2026-08-28T09:54:46.4979999Z           "complete": true,
2026-08-28T09:54:46.4980157Z           "evidence": [
2026-08-28T09:54:46.4980308Z             {
2026-08-28T09:54:46.4980479Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.4980634Z               "line": 197
2026-08-28T09:54:46.4980783Z             }
2026-08-28T09:54:46.4980935Z           ]
2026-08-28T09:54:46.4981083Z         },
2026-08-28T09:54:46.4981236Z         "impl": {
2026-08-28T09:54:46.4981394Z           "complete": true,
2026-08-28T09:54:46.4981550Z           "evidence": [
2026-08-28T09:54:46.4981699Z             {
2026-08-28T09:54:46.4981908Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:46.4982070Z               "line": 105
2026-08-28T09:54:46.4982218Z             },
2026-08-28T09:54:46.4982367Z             {
2026-08-28T09:54:46.4982542Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4982696Z               "line": 23956
2026-08-28T09:54:46.4982837Z             },
2026-08-28T09:54:46.4982987Z             {
2026-08-28T09:54:46.4983175Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4983328Z               "line": 23969
2026-08-28T09:54:46.4983478Z             },
2026-08-28T09:54:46.4983621Z             {
2026-08-28T09:54:46.4983803Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4983955Z               "line": 24149
2026-08-28T09:54:46.4984108Z             }
2026-08-28T09:54:46.4984266Z           ]
2026-08-28T09:54:46.4984413Z         },
2026-08-28T09:54:46.4984565Z         "int": {
2026-08-28T09:54:46.4984722Z           "complete": true,
2026-08-28T09:54:46.4984890Z           "evidence": [
2026-08-28T09:54:46.4985037Z             {
2026-08-28T09:54:46.4987904Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4988087Z               "line": 26441
2026-08-28T09:54:46.4988242Z             }
2026-08-28T09:54:46.4988397Z           ]
2026-08-28T09:54:46.4988543Z         },
2026-08-28T09:54:46.4988694Z         "unit": {
2026-08-28T09:54:46.4988867Z           "complete": true,
2026-08-28T09:54:46.4989406Z           "evidence": [
2026-08-28T09:54:46.4989562Z             {
2026-08-28T09:54:46.4989745Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4989896Z               "line": 26159
2026-08-28T09:54:46.4990050Z             }
2026-08-28T09:54:46.4990197Z           ]
2026-08-28T09:54:46.4990341Z         }
2026-08-28T09:54:46.4990478Z       }
2026-08-28T09:54:46.4990621Z     },
2026-08-28T09:54:46.4990769Z     {
2026-08-28T09:54:46.4990954Z       "id": "REQ-ENDPOINT-STOP-OFFLINE",
2026-08-28T09:54:46.4992969Z       "title": "H3: `spt endpoint stop <id>` marks the endpoint OFFLINE (alive=false), not merely de-readied. cmd_stop (cli.rs:2994-3010) removes the ready marker + unregisters the address but does NOT set status offline, so a stopped daemon-hosted endpoint still reports alive=true (status=online latch). FIX: add set_status(perch, STATUS_OFFLINE) to cmd_stop — folds with B2 (same setter). Unit: stop → is_perch_alive=false / alive=false. (v0.12.0)",
2026-08-28T09:54:46.4993150Z       "requiredStages": [
2026-08-28T09:54:46.4993303Z         "impl",
2026-08-28T09:54:46.4993446Z         "unit"
2026-08-28T09:54:46.4993594Z       ],
2026-08-28T09:54:46.4993759Z       "stages": {
2026-08-28T09:54:46.4993907Z         "doc": {
2026-08-28T09:54:46.4994071Z           "complete": false,
2026-08-28T09:54:46.4994229Z           "evidence": []
2026-08-28T09:54:46.4994381Z         },
2026-08-28T09:54:46.4994530Z         "impl": {
2026-08-28T09:54:46.4994686Z           "complete": true,
2026-08-28T09:54:46.4994840Z           "evidence": [
2026-08-28T09:54:46.4994987Z             {
2026-08-28T09:54:46.4995174Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4995330Z               "line": 12093
2026-08-28T09:54:46.4995479Z             }
2026-08-28T09:54:46.4995630Z           ]
2026-08-28T09:54:46.4995780Z         },
2026-08-28T09:54:46.4995931Z         "int": {
2026-08-28T09:54:46.4996090Z           "complete": false,
2026-08-28T09:54:46.4996373Z           "evidence": []
2026-08-28T09:54:46.4996530Z         },
2026-08-28T09:54:46.4996681Z         "unit": {
2026-08-28T09:54:46.4996839Z           "complete": true,
2026-08-28T09:54:46.4996995Z           "evidence": [
2026-08-28T09:54:46.4997149Z             {
2026-08-28T09:54:46.4997325Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.4997483Z               "line": 26111
2026-08-28T09:54:46.4997629Z             }
2026-08-28T09:54:46.4997788Z           ]
2026-08-28T09:54:46.4997935Z         }
2026-08-28T09:54:46.4998089Z       }
2026-08-28T09:54:46.4998235Z     },
2026-08-28T09:54:46.4998384Z     {
2026-08-28T09:54:46.4998564Z       "id": "REQ-ENDPOINT-STOP-RESOLVES",
2026-08-28T09:54:46.5006554Z       "title": "`spt endpoint stop <id>` REFUSES an id that nothing on the node knows, instead of stamping success on a no-op — an unconditional-success verb is a lying instrument (find: liam via flynn's discriminating repro, mechanism corrected by flynn 2026-07-26 superseding the original shell-half-action framing; shells aren't endpoints and the verb correctly never tried to resolve one — it then answered incorrectly). TODAY (cli.rs `stop_endpoint_core`, read at mint): ready-marker removal is `.is_ok()`-best-effort, `teardown_hosted_session` topology-gates on a `controllable` flag a nonexistent perch cannot have and falls through, `unregister_address` is `let _`, `terminal_normalize` silently skips a recordless perch — so EVERY string returns `Stopped{removed:false}` → `STOPPED:<id> (no ready marker; address unregistered)` exit 0, and the 'address unregistered' clause prints whether or not any address existed to unregister. FIX SHAPE: resolve FIRST — an id with ZERO evidence on this node (no ready marker, no perch record, no registered address, no broker session row) is REFUSED with a non-zero exit and a line naming that nothing by that id exists here; ANY evidence → proceed EXACTLY as today (stop is the last rung of the teardown ladder and its wedge-breaking semantics on partially-dead state are load-bearing — the refusal must never make a wedged-but-evidenced endpoint harder to kill). STOPPED is claimed only when the verb acted on something that existed. Success-line honesty rides the same change: clauses name what actually happened ('address unregistered' only when an address was removed). Kin: KH 7.49 (a verb never stamps a state it did not cause — this is that hazard's resolve-half), REQ-ENDPOINT-TEARDOWN-AUTHORITY (the ladder whose semantics must survive unchanged).",
2026-08-28T09:54:46.5006891Z       "requiredStages": [
2026-08-28T09:54:46.5007053Z         "impl",
2026-08-28T09:54:46.5007212Z         "unit"
2026-08-28T09:54:46.5007356Z       ],
2026-08-28T09:54:46.5007513Z       "stages": {
2026-08-28T09:54:46.5007662Z         "doc": {
2026-08-28T09:54:46.5007828Z           "complete": false,
2026-08-28T09:54:46.5007986Z           "evidence": []
2026-08-28T09:54:46.5008138Z         },
2026-08-28T09:54:46.5008286Z         "impl": {
2026-08-28T09:54:46.5008457Z           "complete": true,
2026-08-28T09:54:46.5008615Z           "evidence": [
2026-08-28T09:54:46.5008772Z             {
2026-08-28T09:54:46.5009236Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5009401Z               "line": 11893
2026-08-28T09:54:46.5009565Z             },
2026-08-28T09:54:46.5009720Z             {
2026-08-28T09:54:46.5009906Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5010058Z               "line": 11911
2026-08-28T09:54:46.5010206Z             },
2026-08-28T09:54:46.5010364Z             {
2026-08-28T09:54:46.5010541Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5010702Z               "line": 11977
2026-08-28T09:54:46.5010846Z             },
2026-08-28T09:54:46.5011003Z             {
2026-08-28T09:54:46.5011180Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5011341Z               "line": 12000
2026-08-28T09:54:46.5011490Z             },
2026-08-28T09:54:46.5011641Z             {
2026-08-28T09:54:46.5011955Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5012122Z               "line": 12021
2026-08-28T09:54:46.5012272Z             },
2026-08-28T09:54:46.5012415Z             {
2026-08-28T09:54:46.5012596Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5012749Z               "line": 12047
2026-08-28T09:54:46.5012902Z             },
2026-08-28T09:54:46.5013055Z             {
2026-08-28T09:54:46.5013235Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5013389Z               "line": 12075
2026-08-28T09:54:46.5013527Z             },
2026-08-28T09:54:46.5013684Z             {
2026-08-28T09:54:46.5013861Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5014018Z               "line": 24040
2026-08-28T09:54:46.5014160Z             }
2026-08-28T09:54:46.5014304Z           ]
2026-08-28T09:54:46.5014456Z         },
2026-08-28T09:54:46.5014599Z         "int": {
2026-08-28T09:54:46.5014761Z           "complete": false,
2026-08-28T09:54:46.5014926Z           "evidence": []
2026-08-28T09:54:46.5015079Z         },
2026-08-28T09:54:46.5015225Z         "unit": {
2026-08-28T09:54:46.5015378Z           "complete": true,
2026-08-28T09:54:46.5015535Z           "evidence": [
2026-08-28T09:54:46.5015717Z             {
2026-08-28T09:54:46.5015907Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5016065Z               "line": 25141
2026-08-28T09:54:46.5016217Z             },
2026-08-28T09:54:46.5016365Z             {
2026-08-28T09:54:46.5016551Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5016703Z               "line": 25170
2026-08-28T09:54:46.5016851Z             },
2026-08-28T09:54:46.5017004Z             {
2026-08-28T09:54:46.5017181Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5017338Z               "line": 25216
2026-08-28T09:54:46.5017484Z             }
2026-08-28T09:54:46.5017636Z           ]
2026-08-28T09:54:46.5017777Z         }
2026-08-28T09:54:46.5017926Z       }
2026-08-28T09:54:46.5018068Z     },
2026-08-28T09:54:46.5018217Z     {
2026-08-28T09:54:46.5018518Z       "id": "REQ-ENDPOINT-TEARDOWN-AUTHORITY",
2026-08-28T09:54:46.5036547Z       "title": "TEARDOWN-AUTHORITY W1 (ADR-0045; two hertz field RCAs 2026-07-19, doyle code-verified + ruled): ONE shared topology-aware broker-teardown primitive behind BOTH `endpoint shutdown` and `endpoint stop`. Today both verbs stamp state they never cause: cmd_shutdown (cli.rs:3979) = remove ready marker + cmd_rest(Suspend) — the Suspend edge (resting.rs daemon_rest_event_with_liveness -> apply_event -> cascade_shells_on_edge -> advertise) fires echo + shell cascade + advertise and NEVER touches a session, even though the verb already probed broker-session truth (cli.rs:3797-3804 has_live_session_honest) to force from=alive; cmd_stop (cli.rs:7071) = marker + unregister_address + terminal_normalize + advertise, whose own comment calls it a DEFINITIVE death observation it fabricates. Field: broker retains the whole subtree (adapter -> node -> harness -> nested resumed harness + MCP children; the surviving `spt api listen` is a DESCENDANT, so a direct-child kill misses it). PRIMITIVE (ordered, ADR-0045 decisions 1/6/7/9): resolve broker SessionInfo -> dedicated sid/endpoint-keyed broker kill claiming NO controller (NOT Brain::attach()+kill_session(), brain.rs:622 require_session() = controller theft under the ADR-0044 lease ladder; idempotent — unknown session is benign success) -> reap the whole DESCENDANT subtree (reuse spt_store::proc.rs kill-root+process_descendants, do not mint a second tree-walk) -> await broker-row removal under a bound -> ONLY THEN stamp + unregister + advertise. Stamp-after-reap is load-bearing: field-observed post-stop info.json read status=offline BUT rest_state=active + controlled=true because the SURVIVING host RE-BOUND after the CAS-less terminal_normalize(path, None) — no hardening of the write fixes this, only the reap makes the stamp true (shutdown passes Some(sid) for the concurrent-newer-bind CAS; stop's unconditional posture stays, it is the operator's own definitive command). TOPOLOGY SPLIT (decision 2): gated controllable==Some(true) (ADR-0041 hosting authority — the SAME predicate cmd_bind's online-earn and the livehost reconcile use); harness-hosted/external keeps marker+address+status-only behavior (CONTEXT.md:39 — core spawned nothing, holds nothing) and the misleading cmd_shutdown doc comment claiming marker-removal stops the listener is corrected to name its topology. VERB DIFFERENCES ARE ONLY ceremony + resulting intent (decision 3): shutdown = echo commune + shell cascade FIRST then teardown, result rest_state=suspended (wrap the EXISTING rest edge — apply_event already echoes before the flip per KH 3.3; do NOT reimplement the ordering); stop = NO ceremony, result terminal_normalize. TIMEOUT (decision 7): do NOT stamp cold over a survivor — exit non-zero, and because stop is the last rung with no in-band escalation behind it its failure line names the surviving ROOT PID + the scoped-kill remedy. reconcile_hosted_liveness stays the partial-failure catch-up net, not duplicated. Precedent: REQ-HAZARD-DAEMON-STOP-REAP already ruled this reap principle at DAEMON scope; this is the ENDPOINT scope it was never extended to. Gate: doc — ADR-0045 + CONTEXT.md amendments (190 record-vs-process axis, 640 verb semantics, 647 stop echo exception) + KNOWN-HAZARDS entry; impl — the shared primitive + both verb call sites + topology gate + corrected comments; unit — topology routing table (controllable=true -> teardown, harness-hosted -> marker/address/status only), verb-difference table (ceremony + resulting intent), timeout posture (no cold stamp on survivor, failure line carries root pid), REWRITE shutdown_soft_stops_and_suspends (it asserts marker+intent only = it asserts the bug); int — real broker-hosted endpoint: after each verb, no broker session row + process subtree gone INCLUDING the descendant `spt api listen` + perch ready=false/alive=false/address unregistered/unbound=false + effective and advertised state correct + (shutdown) echo/cascade ran BEFORE the kill + wake/resume works from the recorded sid under the recorded adapter.",
2026-08-28T09:54:46.5036965Z       "requiredStages": [
2026-08-28T09:54:46.5037128Z         "doc",
2026-08-28T09:54:46.5037294Z         "impl",
2026-08-28T09:54:46.5037443Z         "unit",
2026-08-28T09:54:46.5037652Z         "int"
2026-08-28T09:54:46.5037795Z       ],
2026-08-28T09:54:46.5037953Z       "stages": {
2026-08-28T09:54:46.5038096Z         "doc": {
2026-08-28T09:54:46.5038262Z           "complete": true,
2026-08-28T09:54:46.5038416Z           "evidence": [
2026-08-28T09:54:46.5038567Z             {
2026-08-28T09:54:46.5038757Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.5038912Z               "line": 813
2026-08-28T09:54:46.5039141Z             },
2026-08-28T09:54:46.5039284Z             {
2026-08-28T09:54:46.5039532Z               "path": "docs/adr/0045-endpoint-teardown-authority.md",
2026-08-28T09:54:46.5039685Z               "line": 74
2026-08-28T09:54:46.5039846Z             }
2026-08-28T09:54:46.5039991Z           ]
2026-08-28T09:54:46.5040147Z         },
2026-08-28T09:54:46.5040301Z         "impl": {
2026-08-28T09:54:46.5040462Z           "complete": true,
2026-08-28T09:54:46.5040621Z           "evidence": [
2026-08-28T09:54:46.5040767Z             {
2026-08-28T09:54:46.5040977Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5041134Z               "line": 964
2026-08-28T09:54:46.5041288Z             },
2026-08-28T09:54:46.5041434Z             {
2026-08-28T09:54:46.5041640Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5041805Z               "line": 5806
2026-08-28T09:54:46.5041954Z             },
2026-08-28T09:54:46.5042105Z             {
2026-08-28T09:54:46.5042307Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5042469Z               "line": 9401
2026-08-28T09:54:46.5042612Z             },
2026-08-28T09:54:46.5042763Z             {
2026-08-28T09:54:46.5042960Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5043227Z               "line": 63
2026-08-28T09:54:46.5043388Z             },
2026-08-28T09:54:46.5043537Z             {
2026-08-28T09:54:46.5043717Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5043873Z               "line": 7738
2026-08-28T09:54:46.5044024Z             },
2026-08-28T09:54:46.5044168Z             {
2026-08-28T09:54:46.5044348Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5044507Z               "line": 7771
2026-08-28T09:54:46.5044653Z             },
2026-08-28T09:54:46.5044807Z             {
2026-08-28T09:54:46.5044982Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5045140Z               "line": 11878
2026-08-28T09:54:46.5045292Z             },
2026-08-28T09:54:46.5045446Z             {
2026-08-28T09:54:46.5045621Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5045780Z               "line": 12033
2026-08-28T09:54:46.5045931Z             },
2026-08-28T09:54:46.5046080Z             {
2026-08-28T09:54:46.5046265Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5046419Z               "line": 12058
2026-08-28T09:54:46.5046574Z             },
2026-08-28T09:54:46.5046722Z             {
2026-08-28T09:54:46.5046900Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5047054Z               "line": 24009
2026-08-28T09:54:46.5047205Z             },
2026-08-28T09:54:46.5047355Z             {
2026-08-28T09:54:46.5047525Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5047684Z               "line": 1040
2026-08-28T09:54:46.5047830Z             },
2026-08-28T09:54:46.5047979Z             {
2026-08-28T09:54:46.5048174Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5048332Z               "line": 139
2026-08-28T09:54:46.5048479Z             },
2026-08-28T09:54:46.5048633Z             {
2026-08-28T09:54:46.5048818Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5049051Z               "line": 167
2026-08-28T09:54:46.5049203Z             },
2026-08-28T09:54:46.5049463Z             {
2026-08-28T09:54:46.5049655Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5049801Z               "line": 179
2026-08-28T09:54:46.5049940Z             },
2026-08-28T09:54:46.5050101Z             {
2026-08-28T09:54:46.5050322Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5050479Z               "line": 201
2026-08-28T09:54:46.5050626Z             },
2026-08-28T09:54:46.5050778Z             {
2026-08-28T09:54:46.5050955Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5051113Z               "line": 256
2026-08-28T09:54:46.5051260Z             },
2026-08-28T09:54:46.5051418Z             {
2026-08-28T09:54:46.5051603Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5051758Z               "line": 270
2026-08-28T09:54:46.5051909Z             }
2026-08-28T09:54:46.5052055Z           ]
2026-08-28T09:54:46.5052210Z         },
2026-08-28T09:54:46.5052355Z         "int": {
2026-08-28T09:54:46.5052519Z           "complete": true,
2026-08-28T09:54:46.5052670Z           "evidence": [
2026-08-28T09:54:46.5052828Z             {
2026-08-28T09:54:46.5053092Z               "path": "crates/spt/tests/endpoint_teardown_authority_e2e.rs",
2026-08-28T09:54:46.5053252Z               "line": 527
2026-08-28T09:54:46.5053406Z             },
2026-08-28T09:54:46.5053553Z             {
2026-08-28T09:54:46.5053811Z               "path": "crates/spt/tests/endpoint_teardown_authority_e2e.rs",
2026-08-28T09:54:46.5053963Z               "line": 783
2026-08-28T09:54:46.5054111Z             }
2026-08-28T09:54:46.5054257Z           ]
2026-08-28T09:54:46.5054405Z         },
2026-08-28T09:54:46.5054556Z         "unit": {
2026-08-28T09:54:46.5054718Z           "complete": true,
2026-08-28T09:54:46.5054875Z           "evidence": [
2026-08-28T09:54:46.5055019Z             {
2026-08-28T09:54:46.5055209Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5055682Z               "line": 26188
2026-08-28T09:54:46.5055838Z             },
2026-08-28T09:54:46.5055973Z             {
2026-08-28T09:54:46.5056153Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5056316Z               "line": 32235
2026-08-28T09:54:46.5056463Z             },
2026-08-28T09:54:46.5056603Z             {
2026-08-28T09:54:46.5056783Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5056946Z               "line": 32277
2026-08-28T09:54:46.5057091Z             },
2026-08-28T09:54:46.5057244Z             {
2026-08-28T09:54:46.5057418Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5057580Z               "line": 32314
2026-08-28T09:54:46.5057733Z             },
2026-08-28T09:54:46.5057877Z             {
2026-08-28T09:54:46.5058062Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5058220Z               "line": 294
2026-08-28T09:54:46.5058372Z             },
2026-08-28T09:54:46.5058525Z             {
2026-08-28T09:54:46.5058710Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5058864Z               "line": 314
2026-08-28T09:54:46.5059106Z             },
2026-08-28T09:54:46.5059254Z             {
2026-08-28T09:54:46.5059441Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5059597Z               "line": 352
2026-08-28T09:54:46.5059743Z             },
2026-08-28T09:54:46.5059896Z             {
2026-08-28T09:54:46.5060075Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5060229Z               "line": 402
2026-08-28T09:54:46.5060366Z             },
2026-08-28T09:54:46.5060510Z             {
2026-08-28T09:54:46.5060700Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.5060857Z               "line": 439
2026-08-28T09:54:46.5061005Z             }
2026-08-28T09:54:46.5061149Z           ]
2026-08-28T09:54:46.5061301Z         }
2026-08-28T09:54:46.5061445Z       }
2026-08-28T09:54:46.5061591Z     },
2026-08-28T09:54:46.5061745Z     {
2026-08-28T09:54:46.5061930Z       "id": "REQ-ENDPOINT-UNBOUND-ATTACH",
2026-08-28T09:54:46.5066141Z       "title": "An spt-hosted endpoint is ATTACHABLE between spawn and bind: gate the attach on the broker SESSION being attachable (session+PTY+OutputLog exist at spawn, before bind), not on perch STATUS_ONLINE (bind). cmd_endpoint_run + `spt rc <id>` attach to a live broker session regardless of perch status (headless bringups too; lets an operator clear a bind-gating prompt) -- replaces await_endpoint_online; preserves REQ-HAZARD-RC-ATTACH-ONLINE-RACE's 'no attach before a session' intent at the earlier session-exists point; source = the broker sessions map (ADR-0025 W3a); local-only. New on-disk status STATUS_UNBOUND (spawn->unbound, bind->online, death->offline); lifecycle reuses the existing exit-waiter/reconcile (session death->offline); unbound is attachable but NOT message-addressable (messaging stays online/bound-gated). EpDisplay gains Unbound = HOLLOW (+ hollow-controlled variant) -- amber=HarnessOnly is taken + means not-controllable (the opposite of attachable). (ADR-0027)",
2026-08-28T09:54:46.5066318Z       "requiredStages": [
2026-08-28T09:54:46.5066465Z         "doc",
2026-08-28T09:54:46.5066618Z         "impl",
2026-08-28T09:54:46.5066760Z         "unit",
2026-08-28T09:54:46.5066914Z         "int"
2026-08-28T09:54:46.5067061Z       ],
2026-08-28T09:54:46.5067215Z       "stages": {
2026-08-28T09:54:46.5067372Z         "doc": {
2026-08-28T09:54:46.5067530Z           "complete": true,
2026-08-28T09:54:46.5067685Z           "evidence": [
2026-08-28T09:54:46.5067828Z             {
2026-08-28T09:54:46.5068002Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5068155Z               "line": 789
2026-08-28T09:54:46.5068307Z             },
2026-08-28T09:54:46.5068451Z             {
2026-08-28T09:54:46.5068757Z               "path": "docs/adr/0027-unbound-endpoint-state-and-attach-on-session.md",
2026-08-28T09:54:46.5068913Z               "line": 3
2026-08-28T09:54:46.5069247Z             }
2026-08-28T09:54:46.5069396Z           ]
2026-08-28T09:54:46.5069546Z         },
2026-08-28T09:54:46.5069701Z         "impl": {
2026-08-28T09:54:46.5069857Z           "complete": true,
2026-08-28T09:54:46.5070020Z           "evidence": [
2026-08-28T09:54:46.5070167Z             {
2026-08-28T09:54:46.5070380Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.5070545Z               "line": 891
2026-08-28T09:54:46.5070693Z             },
2026-08-28T09:54:46.5070836Z             {
2026-08-28T09:54:46.5071037Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.5071198Z               "line": 970
2026-08-28T09:54:46.5071342Z             },
2026-08-28T09:54:46.5071499Z             {
2026-08-28T09:54:46.5071699Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.5071856Z               "line": 45
2026-08-28T09:54:46.5072005Z             },
2026-08-28T09:54:46.5072152Z             {
2026-08-28T09:54:46.5072353Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.5072514Z               "line": 116
2026-08-28T09:54:46.5072672Z             },
2026-08-28T09:54:46.5072819Z             {
2026-08-28T09:54:46.5073025Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.5073180Z               "line": 160
2026-08-28T09:54:46.5073330Z             },
2026-08-28T09:54:46.5073476Z             {
2026-08-28T09:54:46.5073653Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5073815Z               "line": 4301
2026-08-28T09:54:46.5073954Z             },
2026-08-28T09:54:46.5074105Z             {
2026-08-28T09:54:46.5074282Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5074440Z               "line": 5113
2026-08-28T09:54:46.5074588Z             },
2026-08-28T09:54:46.5074740Z             {
2026-08-28T09:54:46.5074922Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5075074Z               "line": 5134
2026-08-28T09:54:46.5075227Z             },
2026-08-28T09:54:46.5075373Z             {
2026-08-28T09:54:46.5075662Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5075819Z               "line": 7027
2026-08-28T09:54:46.5075967Z             },
2026-08-28T09:54:46.5076115Z             {
2026-08-28T09:54:46.5076305Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.5076454Z               "line": 186
2026-08-28T09:54:46.5076587Z             },
2026-08-28T09:54:46.5076764Z             {
2026-08-28T09:54:46.5076949Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.5077103Z               "line": 231
2026-08-28T09:54:46.5077259Z             },
2026-08-28T09:54:46.5077408Z             {
2026-08-28T09:54:46.5077583Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5077742Z               "line": 997
2026-08-28T09:54:46.5077888Z             },
2026-08-28T09:54:46.5078033Z             {
2026-08-28T09:54:46.5078202Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5078364Z               "line": 1023
2026-08-28T09:54:46.5078519Z             },
2026-08-28T09:54:46.5078667Z             {
2026-08-28T09:54:46.5078848Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5079082Z               "line": 1937
2026-08-28T09:54:46.5079229Z             }
2026-08-28T09:54:46.5079402Z           ]
2026-08-28T09:54:46.5079549Z         },
2026-08-28T09:54:46.5079698Z         "int": {
2026-08-28T09:54:46.5079859Z           "complete": true,
2026-08-28T09:54:46.5080022Z           "evidence": [
2026-08-28T09:54:46.5080169Z             {
2026-08-28T09:54:46.5080365Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.5080527Z               "line": 635
2026-08-28T09:54:46.5080675Z             },
2026-08-28T09:54:46.5080826Z             {
2026-08-28T09:54:46.5081058Z               "path": "crates/spt/tests/multi_subnet_bringup_e2e.rs",
2026-08-28T09:54:46.5081215Z               "line": 353
2026-08-28T09:54:46.5081359Z             }
2026-08-28T09:54:46.5081611Z           ]
2026-08-28T09:54:46.5081758Z         },
2026-08-28T09:54:46.5081950Z         "unit": {
2026-08-28T09:54:46.5082106Z           "complete": true,
2026-08-28T09:54:46.5082264Z           "evidence": [
2026-08-28T09:54:46.5082411Z             {
2026-08-28T09:54:46.5082650Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.5082808Z               "line": 1862
2026-08-28T09:54:46.5082955Z             },
2026-08-28T09:54:46.5083104Z             {
2026-08-28T09:54:46.5083303Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.5083457Z               "line": 351
2026-08-28T09:54:46.5083599Z             },
2026-08-28T09:54:46.5083745Z             {
2026-08-28T09:54:46.5083956Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.5084194Z               "line": 389
2026-08-28T09:54:46.5084419Z             },
2026-08-28T09:54:46.5084586Z             {
2026-08-28T09:54:46.5084772Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5084938Z               "line": 27229
2026-08-28T09:54:46.5085087Z             },
2026-08-28T09:54:46.5085239Z             {
2026-08-28T09:54:46.5085435Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5085667Z               "line": 30839
2026-08-28T09:54:46.5085890Z             },
2026-08-28T09:54:46.5086119Z             {
2026-08-28T09:54:46.5086408Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.5086641Z               "line": 604
2026-08-28T09:54:46.5086860Z             },
2026-08-28T09:54:46.5087114Z             {
2026-08-28T09:54:46.5087462Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.5087752Z               "line": 2155
2026-08-28T09:54:46.5088002Z             },
2026-08-28T09:54:46.5088215Z             {
2026-08-28T09:54:46.5088496Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:46.5088729Z               "line": 1025
2026-08-28T09:54:46.5089042Z             }
2026-08-28T09:54:46.5089323Z           ]
2026-08-28T09:54:46.5089542Z         }
2026-08-28T09:54:46.5090000Z       }
2026-08-28T09:54:46.5090272Z     },
2026-08-28T09:54:46.5090511Z     {
2026-08-28T09:54:46.5090878Z       "id": "REQ-ENGINEROOM-ADMIN-BRINGUP-EMPOWERS",
2026-08-28T09:54:46.5104114Z       "title": "PASSING THE ENGINE-ROOM BRING-UP GATE WITH THE ADMIN TOTP EMPOWERS THE SEAT FOR ITS HOME SUBNET AT ATTACH (ratified 2026-08-01 bag grill, releases#102; CONTEXT.md empower entry amended). NO NEW CAPABILITY -- it collapses a double-entry of ONE credential: the human who just proved the admin key at bring-up had to prove the same key again through `empower` before touching a mode, which is friction that teaches nothing and protects nothing. GATE PARITY: attach OR take is the SAME gate and yields the same grant (a take already re-proves the gate, which is why it is allowed at all). LIFETIME IS IDENTICAL TO AN EXPLICIT EMPOWER -- until session end or controller detach, detach drops it, re-attach re-proves -- so this introduces no lifetime seam of its own and nothing about empowerment revocation changes. THE GRANT IS LOUD ON BOTH SURFACES A READER ACTUALLY READS: the attach output AND the session-start briefing each state that the seat is empowered for its home subnet via admin bring-up. A silent grant is the refused shape -- an empowered seat that never says so is indistinguishable from an unempowered one until a mode change succeeds unexpectedly. TWO NEGATIVES ARE PART OF THE REQUIREMENT AND MUST BE ASSERTED RATHER THAN IMPLIED BY THE POSITIVE, because both are satisfiable by a build that passes the positive row: a MEMBER-TOTP bring-up NEVER auto-empowers (the discriminant is WHICH seed verified, not that the gate passed -- a grant keyed on the gate would empower every member bring-up), and any subnet OTHER than the home subnet still requires an explicit `empower` (a build granting the seat authority everywhere passes an admin-empowers-home assertion unchanged). TERMINOLOGY, ruled with the feature: the engine-room's subnet is its HOME subnet -- 'anchor subnet' is retired and must not appear in code, docs or help in that sense. Gate: doc -- the docs-site engine-room page states the auto-grant, its scope and its lifetime; impl -- the credential-discriminating grant at the bring-up seam (attach and take) plus both loud surfaces; unit -- an admin bring-up empowers the home subnet, a member bring-up empowers nothing, no bring-up empowers a non-home subnet, both loud statements are present in the surfaces they ride, and the grant is recorded through the same seam an explicit empower uses so its lifetime is the same by construction rather than by a parallel implementation.",
2026-08-28T09:54:46.5104519Z       "requiredStages": [
2026-08-28T09:54:46.5104677Z         "doc",
2026-08-28T09:54:46.5104832Z         "impl",
2026-08-28T09:54:46.5104977Z         "unit"
2026-08-28T09:54:46.5105128Z       ],
2026-08-28T09:54:46.5105277Z       "stages": {
2026-08-28T09:54:46.5105438Z         "doc": {
2026-08-28T09:54:46.5105601Z           "complete": true,
2026-08-28T09:54:46.5105772Z           "evidence": [
2026-08-28T09:54:46.5105920Z             {
2026-08-28T09:54:46.5106178Z               "path": "docs-site/src/networking/engine-room-setup.md",
2026-08-28T09:54:46.5106330Z               "line": 55
2026-08-28T09:54:46.5106478Z             },
2026-08-28T09:54:46.5106630Z             {
2026-08-28T09:54:46.5106875Z               "path": "docs-site/src/networking/engine-room-setup.md",
2026-08-28T09:54:46.5107030Z               "line": 97
2026-08-28T09:54:46.5107177Z             },
2026-08-28T09:54:46.5107323Z             {
2026-08-28T09:54:46.5107562Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5107718Z               "line": 339
2026-08-28T09:54:46.5107868Z             }
2026-08-28T09:54:46.5108014Z           ]
2026-08-28T09:54:46.5108163Z         },
2026-08-28T09:54:46.5108315Z         "impl": {
2026-08-28T09:54:46.5108478Z           "complete": true,
2026-08-28T09:54:46.5108634Z           "evidence": [
2026-08-28T09:54:46.5108788Z             {
2026-08-28T09:54:46.5109250Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.5109408Z               "line": 705
2026-08-28T09:54:46.5109559Z             },
2026-08-28T09:54:46.5109704Z             {
2026-08-28T09:54:46.5109916Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5110073Z               "line": 198
2026-08-28T09:54:46.5110228Z             },
2026-08-28T09:54:46.5110381Z             {
2026-08-28T09:54:46.5110619Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5110787Z               "line": 1634
2026-08-28T09:54:46.5110924Z             },
2026-08-28T09:54:46.5111059Z             {
2026-08-28T09:54:46.5111253Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5111416Z               "line": 1669
2026-08-28T09:54:46.5111554Z             },
2026-08-28T09:54:46.5111726Z             {
2026-08-28T09:54:46.5111941Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5112092Z               "line": 1963
2026-08-28T09:54:46.5112252Z             },
2026-08-28T09:54:46.5112397Z             {
2026-08-28T09:54:46.5112597Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5112752Z               "line": 2198
2026-08-28T09:54:46.5112905Z             },
2026-08-28T09:54:46.5113044Z             {
2026-08-28T09:54:46.5113244Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5113405Z               "line": 2275
2026-08-28T09:54:46.5113569Z             },
2026-08-28T09:54:46.5113725Z             {
2026-08-28T09:54:46.5113917Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5114087Z               "line": 2835
2026-08-28T09:54:46.5114232Z             },
2026-08-28T09:54:46.5114387Z             {
2026-08-28T09:54:46.5114631Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5114789Z               "line": 4170
2026-08-28T09:54:46.5115051Z             },
2026-08-28T09:54:46.5115200Z             {
2026-08-28T09:54:46.5115406Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5115561Z               "line": 4200
2026-08-28T09:54:46.5115712Z             },
2026-08-28T09:54:46.5115856Z             {
2026-08-28T09:54:46.5116060Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5116218Z               "line": 670
2026-08-28T09:54:46.5116370Z             },
2026-08-28T09:54:46.5116518Z             {
2026-08-28T09:54:46.5116719Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:46.5116895Z               "line": 167
2026-08-28T09:54:46.5117068Z             },
2026-08-28T09:54:46.5117224Z             {
2026-08-28T09:54:46.5117425Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5117580Z               "line": 494
2026-08-28T09:54:46.5117738Z             },
2026-08-28T09:54:46.5117884Z             {
2026-08-28T09:54:46.5118079Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5118241Z               "line": 591
2026-08-28T09:54:46.5118399Z             },
2026-08-28T09:54:46.5118555Z             {
2026-08-28T09:54:46.5118747Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.5118898Z               "line": 107
2026-08-28T09:54:46.5119161Z             },
2026-08-28T09:54:46.5119310Z             {
2026-08-28T09:54:46.5119514Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.5119672Z               "line": 124
2026-08-28T09:54:46.5119820Z             },
2026-08-28T09:54:46.5119968Z             {
2026-08-28T09:54:46.5120167Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5120331Z               "line": 394
2026-08-28T09:54:46.5120481Z             },
2026-08-28T09:54:46.5120628Z             {
2026-08-28T09:54:46.5120812Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5120966Z               "line": 3173
2026-08-28T09:54:46.5121117Z             }
2026-08-28T09:54:46.5121271Z           ]
2026-08-28T09:54:46.5121566Z         },
2026-08-28T09:54:46.5121719Z         "int": {
2026-08-28T09:54:46.5121891Z           "complete": false,
2026-08-28T09:54:46.5122052Z           "evidence": []
2026-08-28T09:54:46.5122196Z         },
2026-08-28T09:54:46.5122347Z         "unit": {
2026-08-28T09:54:46.5122511Z           "complete": true,
2026-08-28T09:54:46.5122671Z           "evidence": [
2026-08-28T09:54:46.5122821Z             {
2026-08-28T09:54:46.5123024Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5123181Z               "line": 12690
2026-08-28T09:54:46.5123336Z             },
2026-08-28T09:54:46.5123489Z             {
2026-08-28T09:54:46.5123684Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5123847Z               "line": 12729
2026-08-28T09:54:46.5123994Z             },
2026-08-28T09:54:46.5124143Z             {
2026-08-28T09:54:46.5124337Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5124500Z               "line": 12811
2026-08-28T09:54:46.5124652Z             },
2026-08-28T09:54:46.5124811Z             {
2026-08-28T09:54:46.5125024Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5125200Z               "line": 12857
2026-08-28T09:54:46.5125349Z             },
2026-08-28T09:54:46.5125487Z             {
2026-08-28T09:54:46.5125684Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5125844Z               "line": 13037
2026-08-28T09:54:46.5125996Z             },
2026-08-28T09:54:46.5126145Z             {
2026-08-28T09:54:46.5126344Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5126501Z               "line": 14296
2026-08-28T09:54:46.5126650Z             },
2026-08-28T09:54:46.5126798Z             {
2026-08-28T09:54:46.5126993Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5127155Z               "line": 644
2026-08-28T09:54:46.5127303Z             },
2026-08-28T09:54:46.5127564Z             {
2026-08-28T09:54:46.5127769Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.5127937Z               "line": 415
2026-08-28T09:54:46.5128089Z             },
2026-08-28T09:54:46.5128236Z             {
2026-08-28T09:54:46.5128439Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.5128596Z               "line": 583
2026-08-28T09:54:46.5128749Z             }
2026-08-28T09:54:46.5128896Z           ]
2026-08-28T09:54:46.5129153Z         }
2026-08-28T09:54:46.5129302Z       }
2026-08-28T09:54:46.5129459Z     },
2026-08-28T09:54:46.5129607Z     {
2026-08-28T09:54:46.5129797Z       "id": "REQ-ENSURE-DAEMON-STOP-INHIBIT",
2026-08-28T09:54:46.5137076Z       "title": "An operator stop outranks every implicit daemon ensure. (ADR-0047 decision 2, AMENDING REQ-DAEMON-3's anchor; hertz v0.39.4 field bug 2, RCA accepted 2026-07-22.) TODAY: every `spt api` invocation runs unconditional ensure_daemon() (api/mod.rs run()), so on a box with live adapter sessions a `daemon stop --force` loses the race to hook-driven api calls — respawn convoy (5-10 ephemeral spawner windows), several stops to stay down; the rc-side twins were fixed earlier, the api anchor stayed armed. FIX: `daemon stop` records a durable machine-scoped STOP INHIBIT before teardown begins; ensure_daemon()/ensure_running() consult it and DECLINE with one honest line naming the remedy ('daemon stopped by operator — spt daemon start to resume'); cleared by intent verbs ONLY (explicit `daemon start`; update paths that restart by design) — NO TTL (rejected: a timeout is the surprise respawn again, later); implicit autostart additionally takes a machine-wide lock around probe-and-spawn so N concurrent callers never launch N daemons. Gate: doc — the stop/start contract on the daemon CLI docs (stop now sticks; the refusal line + remedy named); impl — inhibit mint in cmd_stop + consult in both implicit anchors + clear in daemon start/update-finish + the spawn serialization lock; unit — inhibit present -> ensure declines with the message, absent -> spawns, intent verbs clear, non-intent paths never clear; int — the convoy rig: stop under a concurrent api-call storm -> daemon stays down + zero respawns + refusal printed, then explicit start clears and exactly ONE daemon comes up under the same storm (RED-first against today's anchor).",
2026-08-28T09:54:46.5137395Z       "requiredStages": [
2026-08-28T09:54:46.5137553Z         "doc",
2026-08-28T09:54:46.5137810Z         "impl",
2026-08-28T09:54:46.5137963Z         "unit",
2026-08-28T09:54:46.5138110Z         "int"
2026-08-28T09:54:46.5138259Z       ],
2026-08-28T09:54:46.5138411Z       "stages": {
2026-08-28T09:54:46.5138569Z         "doc": {
2026-08-28T09:54:46.5138729Z           "complete": true,
2026-08-28T09:54:46.5138896Z           "evidence": [
2026-08-28T09:54:46.5139156Z             {
2026-08-28T09:54:46.5139375Z               "path": "docs-site/src/concepts/overview.md",
2026-08-28T09:54:46.5139533Z               "line": 59
2026-08-28T09:54:46.5139690Z             },
2026-08-28T09:54:46.5139853Z             {
2026-08-28T09:54:46.5140144Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:46.5140305Z               "line": 79
2026-08-28T09:54:46.5140464Z             }
2026-08-28T09:54:46.5140610Z           ]
2026-08-28T09:54:46.5140764Z         },
2026-08-28T09:54:46.5140915Z         "impl": {
2026-08-28T09:54:46.5141084Z           "complete": true,
2026-08-28T09:54:46.5141240Z           "evidence": [
2026-08-28T09:54:46.5141394Z             {
2026-08-28T09:54:46.5141596Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5141754Z               "line": 599
2026-08-28T09:54:46.5141909Z             },
2026-08-28T09:54:46.5142057Z             {
2026-08-28T09:54:46.5142256Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5142415Z               "line": 630
2026-08-28T09:54:46.5142571Z             },
2026-08-28T09:54:46.5142720Z             {
2026-08-28T09:54:46.5143039Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5143201Z               "line": 637
2026-08-28T09:54:46.5143354Z             },
2026-08-28T09:54:46.5143506Z             {
2026-08-28T09:54:46.5143703Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5143864Z               "line": 727
2026-08-28T09:54:46.5144008Z             },
2026-08-28T09:54:46.5144168Z             {
2026-08-28T09:54:46.5144381Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5144542Z               "line": 35
2026-08-28T09:54:46.5144686Z             },
2026-08-28T09:54:46.5144837Z             {
2026-08-28T09:54:46.5145053Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5145195Z               "line": 88
2026-08-28T09:54:46.5145348Z             },
2026-08-28T09:54:46.5145535Z             {
2026-08-28T09:54:46.5145772Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5145954Z               "line": 100
2026-08-28T09:54:46.5146111Z             },
2026-08-28T09:54:46.5146260Z             {
2026-08-28T09:54:46.5146474Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5146640Z               "line": 119
2026-08-28T09:54:46.5146789Z             },
2026-08-28T09:54:46.5146941Z             {
2026-08-28T09:54:46.5147155Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5147317Z               "line": 146
2026-08-28T09:54:46.5147465Z             },
2026-08-28T09:54:46.5147622Z             {
2026-08-28T09:54:46.5147808Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5147970Z               "line": 8026
2026-08-28T09:54:46.5148123Z             }
2026-08-28T09:54:46.5148275Z           ]
2026-08-28T09:54:46.5148428Z         },
2026-08-28T09:54:46.5148580Z         "int": {
2026-08-28T09:54:46.5148748Z           "complete": true,
2026-08-28T09:54:46.5148908Z           "evidence": [
2026-08-28T09:54:46.5149190Z             {
2026-08-28T09:54:46.5149564Z               "path": "crates/spt/tests/daemon_stop_convoy_e2e.rs",
2026-08-28T09:54:46.5149721Z               "line": 118
2026-08-28T09:54:46.5149878Z             }
2026-08-28T09:54:46.5150026Z           ]
2026-08-28T09:54:46.5150179Z         },
2026-08-28T09:54:46.5150332Z         "unit": {
2026-08-28T09:54:46.5150522Z           "complete": true,
2026-08-28T09:54:46.5150775Z           "evidence": [
2026-08-28T09:54:46.5150951Z             {
2026-08-28T09:54:46.5151204Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5151363Z               "line": 2994
2026-08-28T09:54:46.5151514Z             },
2026-08-28T09:54:46.5151659Z             {
2026-08-28T09:54:46.5151857Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5152002Z               "line": 3027
2026-08-28T09:54:46.5152152Z             },
2026-08-28T09:54:46.5152300Z             {
2026-08-28T09:54:46.5156313Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.5156519Z               "line": 3036
2026-08-28T09:54:46.5156681Z             },
2026-08-28T09:54:46.5156834Z             {
2026-08-28T09:54:46.5157059Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5157229Z               "line": 156
2026-08-28T09:54:46.5157378Z             },
2026-08-28T09:54:46.5157538Z             {
2026-08-28T09:54:46.5157768Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5157928Z               "line": 180
2026-08-28T09:54:46.5158083Z             },
2026-08-28T09:54:46.5158234Z             {
2026-08-28T09:54:46.5158449Z               "path": "crates/spt-store/src/daemon_inhibit.rs",
2026-08-28T09:54:46.5158611Z               "line": 193
2026-08-28T09:54:46.5158764Z             }
2026-08-28T09:54:46.5158911Z           ]
2026-08-28T09:54:46.5159183Z         }
2026-08-28T09:54:46.5159332Z       }
2026-08-28T09:54:46.5159483Z     },
2026-08-28T09:54:46.5159783Z     {
2026-08-28T09:54:46.5159945Z       "id": "REQ-EP-1",
2026-08-28T09:54:46.5160176Z       "title": "Day-one endpoint types; open type system",
2026-08-28T09:54:46.5160339Z       "requiredStages": [
2026-08-28T09:54:46.5160495Z         "impl",
2026-08-28T09:54:46.5160640Z         "unit"
2026-08-28T09:54:46.5160786Z       ],
2026-08-28T09:54:46.5160935Z       "stages": {
2026-08-28T09:54:46.5161087Z         "doc": {
2026-08-28T09:54:46.5161255Z           "complete": false,
2026-08-28T09:54:46.5161411Z           "evidence": []
2026-08-28T09:54:46.5161560Z         },
2026-08-28T09:54:46.5161712Z         "impl": {
2026-08-28T09:54:46.5161880Z           "complete": true,
2026-08-28T09:54:46.5162036Z           "evidence": [
2026-08-28T09:54:46.5162189Z             {
2026-08-28T09:54:46.5162393Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5162552Z               "line": 77
2026-08-28T09:54:46.5162707Z             },
2026-08-28T09:54:46.5162850Z             {
2026-08-28T09:54:46.5163058Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5163249Z               "line": 94
2026-08-28T09:54:46.5163401Z             }
2026-08-28T09:54:46.5163545Z           ]
2026-08-28T09:54:46.5163701Z         },
2026-08-28T09:54:46.5163845Z         "int": {
2026-08-28T09:54:46.5164011Z           "complete": false,
2026-08-28T09:54:46.5164169Z           "evidence": []
2026-08-28T09:54:46.5164316Z         },
2026-08-28T09:54:46.5164456Z         "unit": {
2026-08-28T09:54:46.5164612Z           "complete": true,
2026-08-28T09:54:46.5164776Z           "evidence": [
2026-08-28T09:54:46.5164927Z             {
2026-08-28T09:54:46.5165137Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5165288Z               "line": 161
2026-08-28T09:54:46.5165441Z             },
2026-08-28T09:54:46.5165596Z             {
2026-08-28T09:54:46.5165797Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5165957Z               "line": 178
2026-08-28T09:54:46.5166107Z             }
2026-08-28T09:54:46.5166258Z           ]
2026-08-28T09:54:46.5166521Z         }
2026-08-28T09:54:46.5166675Z       }
2026-08-28T09:54:46.5166816Z     },
2026-08-28T09:54:46.5166969Z     {
2026-08-28T09:54:46.5167131Z       "id": "REQ-EP-2",
2026-08-28T09:54:46.5167403Z       "title": "Agent endpoints vs Shells distinction in the type model",
2026-08-28T09:54:46.5167580Z       "requiredStages": [
2026-08-28T09:54:46.5167727Z         "impl",
2026-08-28T09:54:46.5167880Z         "unit"
2026-08-28T09:54:46.5168047Z       ],
2026-08-28T09:54:46.5168308Z       "stages": {
2026-08-28T09:54:46.5168498Z         "doc": {
2026-08-28T09:54:46.5168667Z           "complete": false,
2026-08-28T09:54:46.5168822Z           "evidence": []
2026-08-28T09:54:46.5169048Z         },
2026-08-28T09:54:46.5169214Z         "impl": {
2026-08-28T09:54:46.5169371Z           "complete": true,
2026-08-28T09:54:46.5169529Z           "evidence": [
2026-08-28T09:54:46.5169672Z             {
2026-08-28T09:54:46.5169887Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5170043Z               "line": 114
2026-08-28T09:54:46.5170178Z             },
2026-08-28T09:54:46.5170330Z             {
2026-08-28T09:54:46.5170524Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5170679Z               "line": 131
2026-08-28T09:54:46.5170827Z             },
2026-08-28T09:54:46.5170980Z             {
2026-08-28T09:54:46.5171185Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5171337Z               "line": 138
2026-08-28T09:54:46.5171486Z             }
2026-08-28T09:54:46.5171638Z           ]
2026-08-28T09:54:46.5171791Z         },
2026-08-28T09:54:46.5171943Z         "int": {
2026-08-28T09:54:46.5172101Z           "complete": false,
2026-08-28T09:54:46.5172258Z           "evidence": []
2026-08-28T09:54:46.5172406Z         },
2026-08-28T09:54:46.5172553Z         "unit": {
2026-08-28T09:54:46.5172721Z           "complete": true,
2026-08-28T09:54:46.5173021Z           "evidence": [
2026-08-28T09:54:46.5173174Z             {
2026-08-28T09:54:46.5173382Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5173533Z               "line": 190
2026-08-28T09:54:46.5173680Z             },
2026-08-28T09:54:46.5173829Z             {
2026-08-28T09:54:46.5174033Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5174186Z               "line": 208
2026-08-28T09:54:46.5174334Z             },
2026-08-28T09:54:46.5174487Z             {
2026-08-28T09:54:46.5174682Z               "path": "crates/spt-proto/src/endpoint.rs",
2026-08-28T09:54:46.5174839Z               "line": 221
2026-08-28T09:54:46.5174987Z             }
2026-08-28T09:54:46.5175148Z           ]
2026-08-28T09:54:46.5175307Z         }
2026-08-28T09:54:46.5175463Z       }
2026-08-28T09:54:46.5175603Z     },
2026-08-28T09:54:46.5175758Z     {
2026-08-28T09:54:46.5175915Z       "id": "REQ-EP-3",
2026-08-28T09:54:46.5176222Z       "title": "Messaging payloads carry typed operation commands + file blobs",
2026-08-28T09:54:46.5176390Z       "requiredStages": [
2026-08-28T09:54:46.5176537Z         "impl",
2026-08-28T09:54:46.5176686Z         "unit"
2026-08-28T09:54:46.5176828Z       ],
2026-08-28T09:54:46.5176981Z       "stages": {
2026-08-28T09:54:46.5177128Z         "doc": {
2026-08-28T09:54:46.5177291Z           "complete": false,
2026-08-28T09:54:46.5177453Z           "evidence": []
2026-08-28T09:54:46.5177602Z         },
2026-08-28T09:54:46.5177753Z         "impl": {
2026-08-28T09:54:46.5177907Z           "complete": true,
2026-08-28T09:54:46.5178063Z           "evidence": [
2026-08-28T09:54:46.5178213Z             {
2026-08-28T09:54:46.5178416Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5178570Z               "line": 31
2026-08-28T09:54:46.5178716Z             },
2026-08-28T09:54:46.5178873Z             {
2026-08-28T09:54:46.5179207Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5179364Z               "line": 49
2026-08-28T09:54:46.5179517Z             }
2026-08-28T09:54:46.5179779Z           ]
2026-08-28T09:54:46.5179927Z         },
2026-08-28T09:54:46.5180080Z         "int": {
2026-08-28T09:54:46.5180242Z           "complete": false,
2026-08-28T09:54:46.5180395Z           "evidence": []
2026-08-28T09:54:46.5180542Z         },
2026-08-28T09:54:46.5180690Z         "unit": {
2026-08-28T09:54:46.5180843Z           "complete": true,
2026-08-28T09:54:46.5180994Z           "evidence": [
2026-08-28T09:54:46.5181183Z             {
2026-08-28T09:54:46.5181378Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5181535Z               "line": 156
2026-08-28T09:54:46.5181678Z             },
2026-08-28T09:54:46.5181817Z             {
2026-08-28T09:54:46.5182017Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5182170Z               "line": 164
2026-08-28T09:54:46.5182322Z             },
2026-08-28T09:54:46.5182460Z             {
2026-08-28T09:54:46.5182666Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5182823Z               "line": 177
2026-08-28T09:54:46.5182971Z             },
2026-08-28T09:54:46.5183113Z             {
2026-08-28T09:54:46.5183320Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5183480Z               "line": 200
2026-08-28T09:54:46.5183625Z             },
2026-08-28T09:54:46.5183771Z             {
2026-08-28T09:54:46.5183966Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5184121Z               "line": 216
2026-08-28T09:54:46.5184269Z             },
2026-08-28T09:54:46.5184417Z             {
2026-08-28T09:54:46.5184613Z               "path": "crates/spt-proto/src/payload.rs",
2026-08-28T09:54:46.5184769Z               "line": 233
2026-08-28T09:54:46.5184918Z             }
2026-08-28T09:54:46.5185061Z           ]
2026-08-28T09:54:46.5185228Z         }
2026-08-28T09:54:46.5185375Z       }
2026-08-28T09:54:46.5185523Z     },
2026-08-28T09:54:46.5185770Z     {
2026-08-28T09:54:46.5185939Z       "id": "REQ-EP-4",
2026-08-28T09:54:46.5186196Z       "title": "PresenceChannel broker endpoint (seam day-one)",
2026-08-28T09:54:46.5186356Z       "requiredStages": [
2026-08-28T09:54:46.5186509Z         "impl",
2026-08-28T09:54:46.5186659Z         "unit"
2026-08-28T09:54:46.5186802Z       ],
2026-08-28T09:54:46.5186946Z       "stages": {
2026-08-28T09:54:46.5187097Z         "doc": {
2026-08-28T09:54:46.5187255Z           "complete": false,
2026-08-28T09:54:46.5187412Z           "evidence": []
2026-08-28T09:54:46.5187560Z         },
2026-08-28T09:54:46.5187712Z         "impl": {
2026-08-28T09:54:46.5187875Z           "complete": true,
2026-08-28T09:54:46.5188032Z           "evidence": [
2026-08-28T09:54:46.5188185Z             {
2026-08-28T09:54:46.5188380Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5188547Z               "line": 1327
2026-08-28T09:54:46.5188690Z             },
2026-08-28T09:54:46.5188834Z             {
2026-08-28T09:54:46.5189177Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5189347Z               "line": 2274
2026-08-28T09:54:46.5189501Z             },
2026-08-28T09:54:46.5189647Z             {
2026-08-28T09:54:46.5189848Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5190006Z               "line": 9347
2026-08-28T09:54:46.5190154Z             },
2026-08-28T09:54:46.5190306Z             {
2026-08-28T09:54:46.5190497Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5190649Z               "line": 236
2026-08-28T09:54:46.5190792Z             },
2026-08-28T09:54:46.5191013Z             {
2026-08-28T09:54:46.5191289Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5191516Z               "line": 1657
2026-08-28T09:54:46.5191748Z             },
2026-08-28T09:54:46.5191962Z             {
2026-08-28T09:54:46.5192229Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5192467Z               "line": 1859
2026-08-28T09:54:46.5192706Z             },
2026-08-28T09:54:46.5193130Z             {
2026-08-28T09:54:46.5193463Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.5193721Z               "line": 636
2026-08-28T09:54:46.5194012Z             },
2026-08-28T09:54:46.5194237Z             {
2026-08-28T09:54:46.5194583Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.5194790Z               "line": 1046
2026-08-28T09:54:46.5194944Z             },
2026-08-28T09:54:46.5195091Z             {
2026-08-28T09:54:46.5195348Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.5195507Z               "line": 2233
2026-08-28T09:54:46.5195658Z             }
2026-08-28T09:54:46.5195892Z           ]
2026-08-28T09:54:46.5196108Z         },
2026-08-28T09:54:46.5196355Z         "int": {
2026-08-28T09:54:46.5196560Z           "complete": false,
2026-08-28T09:54:46.5196756Z           "evidence": []
2026-08-28T09:54:46.5196907Z         },
2026-08-28T09:54:46.5197069Z         "unit": {
2026-08-28T09:54:46.5197229Z           "complete": true,
2026-08-28T09:54:46.5197391Z           "evidence": [
2026-08-28T09:54:46.5197544Z             {
2026-08-28T09:54:46.5197740Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5197896Z               "line": 2027
2026-08-28T09:54:46.5198035Z             },
2026-08-28T09:54:46.5198192Z             {
2026-08-28T09:54:46.5198412Z               "path": "crates/spt-daemon/tests/presence.rs",
2026-08-28T09:54:46.5198563Z               "line": 76
2026-08-28T09:54:46.5198722Z             },
2026-08-28T09:54:46.5198864Z             {
2026-08-28T09:54:46.5199188Z               "path": "crates/spt-daemon/tests/presence.rs",
2026-08-28T09:54:46.5199394Z               "line": 147
2026-08-28T09:54:46.5199541Z             }
2026-08-28T09:54:46.5199686Z           ]
2026-08-28T09:54:46.5199841Z         }
2026-08-28T09:54:46.5199994Z       }
2026-08-28T09:54:46.5200141Z     },
2026-08-28T09:54:46.5200294Z     {
2026-08-28T09:54:46.5200600Z       "id": "REQ-EP-5",
2026-08-28T09:54:46.5201685Z       "title": "Concrete shell instantiation model: spawn-mints-instance (vs relink/online), registered-on-node permission + broadcast-is-discovery, per-shell require_approval gate, max_instances_per_owner + over_cap, instance aliasing, discovery scope",
2026-08-28T09:54:46.5201849Z       "requiredStages": [
2026-08-28T09:54:46.5202000Z         "impl",
2026-08-28T09:54:46.5202157Z         "unit",
2026-08-28T09:54:46.5202294Z         "int"
2026-08-28T09:54:46.5202440Z       ],
2026-08-28T09:54:46.5202589Z       "stages": {
2026-08-28T09:54:46.5202769Z         "doc": {
2026-08-28T09:54:46.5202956Z           "complete": false,
2026-08-28T09:54:46.5203147Z           "evidence": []
2026-08-28T09:54:46.5203299Z         },
2026-08-28T09:54:46.5203452Z         "impl": {
2026-08-28T09:54:46.5203619Z           "complete": true,
2026-08-28T09:54:46.5203771Z           "evidence": [
2026-08-28T09:54:46.5203929Z             {
2026-08-28T09:54:46.5204158Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5204324Z               "line": 488
2026-08-28T09:54:46.5204468Z             },
2026-08-28T09:54:46.5204625Z             {
2026-08-28T09:54:46.5204835Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5204990Z               "line": 18
2026-08-28T09:54:46.5205138Z             },
2026-08-28T09:54:46.5205279Z             {
2026-08-28T09:54:46.5205499Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5205675Z               "line": 63
2026-08-28T09:54:46.5205819Z             },
2026-08-28T09:54:46.5205965Z             {
2026-08-28T09:54:46.5206162Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5206319Z               "line": 106
2026-08-28T09:54:46.5206448Z             },
2026-08-28T09:54:46.5206600Z             {
2026-08-28T09:54:46.5206810Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5206968Z               "line": 181
2026-08-28T09:54:46.5207120Z             },
2026-08-28T09:54:46.5207388Z             {
2026-08-28T09:54:46.5207590Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5207747Z               "line": 193
2026-08-28T09:54:46.5207898Z             },
2026-08-28T09:54:46.5208042Z             {
2026-08-28T09:54:46.5208241Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.5208395Z               "line": 114
2026-08-28T09:54:46.5208547Z             },
2026-08-28T09:54:46.5208695Z             {
2026-08-28T09:54:46.5208901Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5209177Z               "line": 22
2026-08-28T09:54:46.5209329Z             },
2026-08-28T09:54:46.5209482Z             {
2026-08-28T09:54:46.5209681Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5209835Z               "line": 280
2026-08-28T09:54:46.5209982Z             },
2026-08-28T09:54:46.5210140Z             {
2026-08-28T09:54:46.5210344Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5210506Z               "line": 309
2026-08-28T09:54:46.5210654Z             },
2026-08-28T09:54:46.5210806Z             {
2026-08-28T09:54:46.5211006Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5211160Z               "line": 331
2026-08-28T09:54:46.5211312Z             },
2026-08-28T09:54:46.5211455Z             {
2026-08-28T09:54:46.5211659Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5211813Z               "line": 356
2026-08-28T09:54:46.5211965Z             },
2026-08-28T09:54:46.5212109Z             {
2026-08-28T09:54:46.5212312Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5212477Z               "line": 382
2026-08-28T09:54:46.5212622Z             },
2026-08-28T09:54:46.5212779Z             {
2026-08-28T09:54:46.5212972Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5213249Z               "line": 405
2026-08-28T09:54:46.5213402Z             },
2026-08-28T09:54:46.5213559Z             {
2026-08-28T09:54:46.5213764Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.5213921Z               "line": 231
2026-08-28T09:54:46.5214070Z             },
2026-08-28T09:54:46.5214226Z             {
2026-08-28T09:54:46.5214408Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5214560Z               "line": 22309
2026-08-28T09:54:46.5214709Z             },
2026-08-28T09:54:46.5214856Z             {
2026-08-28T09:54:46.5215089Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5215320Z               "line": 22465
2026-08-28T09:54:46.5215470Z             },
2026-08-28T09:54:46.5215617Z             {
2026-08-28T09:54:46.5215801Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5215964Z               "line": 22661
2026-08-28T09:54:46.5216111Z             },
2026-08-28T09:54:46.5216259Z             {
2026-08-28T09:54:46.5216445Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5216608Z               "line": 23292
2026-08-28T09:54:46.5216769Z             }
2026-08-28T09:54:46.5216913Z           ]
2026-08-28T09:54:46.5217060Z         },
2026-08-28T09:54:46.5217208Z         "int": {
2026-08-28T09:54:46.5217375Z           "complete": true,
2026-08-28T09:54:46.5217533Z           "evidence": [
2026-08-28T09:54:46.5217689Z             {
2026-08-28T09:54:46.5217901Z               "path": "crates/spt/tests/notify_shell_e2e.rs",
2026-08-28T09:54:46.5218060Z               "line": 16
2026-08-28T09:54:46.5218213Z             },
2026-08-28T09:54:46.5218359Z             {
2026-08-28T09:54:46.5218569Z               "path": "crates/spt/tests/shell_e2e.rs",
2026-08-28T09:54:46.5218720Z               "line": 15
2026-08-28T09:54:46.5218869Z             }
2026-08-28T09:54:46.5219131Z           ]
2026-08-28T09:54:46.5219298Z         },
2026-08-28T09:54:46.5219446Z         "unit": {
2026-08-28T09:54:46.5219617Z           "complete": true,
2026-08-28T09:54:46.5219775Z           "evidence": [
2026-08-28T09:54:46.5220056Z             {
2026-08-28T09:54:46.5220265Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5220429Z               "line": 260
2026-08-28T09:54:46.5220575Z             },
2026-08-28T09:54:46.5220725Z             {
2026-08-28T09:54:46.5220932Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5221085Z               "line": 369
2026-08-28T09:54:46.5221242Z             },
2026-08-28T09:54:46.5221391Z             {
2026-08-28T09:54:46.5221594Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.5221749Z               "line": 432
2026-08-28T09:54:46.5221891Z             },
2026-08-28T09:54:46.5222044Z             {
2026-08-28T09:54:46.5222238Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5222397Z               "line": 569
2026-08-28T09:54:46.5222549Z             },
2026-08-28T09:54:46.5222702Z             {
2026-08-28T09:54:46.5222901Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.5223060Z               "line": 621
2026-08-28T09:54:46.5223216Z             },
2026-08-28T09:54:46.5223368Z             {
2026-08-28T09:54:46.5223575Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.5223739Z               "line": 1539
2026-08-28T09:54:46.5223890Z             },
2026-08-28T09:54:46.5224043Z             {
2026-08-28T09:54:46.5224223Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5224381Z               "line": 31813
2026-08-28T09:54:46.5224524Z             },
2026-08-28T09:54:46.5224677Z             {
2026-08-28T09:54:46.5224853Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5225010Z               "line": 31976
2026-08-28T09:54:46.5225158Z             },
2026-08-28T09:54:46.5225307Z             {
2026-08-28T09:54:46.5225492Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5225769Z               "line": 32693
2026-08-28T09:54:46.5225923Z             },
2026-08-28T09:54:46.5226073Z             {
2026-08-28T09:54:46.5226259Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5226414Z               "line": 32809
2026-08-28T09:54:46.5226567Z             }
2026-08-28T09:54:46.5226714Z           ]
2026-08-28T09:54:46.5226868Z         }
2026-08-28T09:54:46.5227014Z       }
2026-08-28T09:54:46.5227159Z     },
2026-08-28T09:54:46.5227310Z     {
2026-08-28T09:54:46.5227473Z       "id": "REQ-EP-6",
2026-08-28T09:54:46.5229992Z       "title": "Gateway type acceptance: a Gateway-typed perch binds (api bind --type, open type system — un-hardcode the live_agent default), advertises/addressable like any endpoint, owns shells (owner validation not agent-family-gated), subscribes to digests, and is the user-msg identity gate's user-backed origin (REQ-MSG-5); in-tree mock-gateway fixture (R-DOCS-2 pattern, no downstream adapter code). Cross-node WAN Gateway-origin (registry endpoint_type trust) tracked by REQ-MSG-6",
2026-08-28T09:54:46.5230177Z       "requiredStages": [
2026-08-28T09:54:46.5230335Z         "doc",
2026-08-28T09:54:46.5230488Z         "impl",
2026-08-28T09:54:46.5230640Z         "unit"
2026-08-28T09:54:46.5230793Z       ],
2026-08-28T09:54:46.5230946Z       "stages": {
2026-08-28T09:54:46.5231102Z         "doc": {
2026-08-28T09:54:46.5231261Z           "complete": true,
2026-08-28T09:54:46.5231427Z           "evidence": [
2026-08-28T09:54:46.5231583Z             {
2026-08-28T09:54:46.5231760Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5231926Z               "line": 265
2026-08-28T09:54:46.5232075Z             }
2026-08-28T09:54:46.5232222Z           ]
2026-08-28T09:54:46.5232375Z         },
2026-08-28T09:54:46.5232532Z         "impl": {
2026-08-28T09:54:46.5232722Z           "complete": true,
2026-08-28T09:54:46.5232885Z           "evidence": [
2026-08-28T09:54:46.5233037Z             {
2026-08-28T09:54:46.5233234Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.5233399Z               "line": 636
2026-08-28T09:54:46.5233676Z             }
2026-08-28T09:54:46.5233827Z           ]
2026-08-28T09:54:46.5233970Z         },
2026-08-28T09:54:46.5234126Z         "int": {
2026-08-28T09:54:46.5234284Z           "complete": true,
2026-08-28T09:54:46.5234445Z           "evidence": [
2026-08-28T09:54:46.5234598Z             {
2026-08-28T09:54:46.5234803Z               "path": "crates/spt/tests/gateway_e2e.rs",
2026-08-28T09:54:46.5234966Z               "line": 18
2026-08-28T09:54:46.5235113Z             }
2026-08-28T09:54:46.5235261Z           ]
2026-08-28T09:54:46.5235409Z         },
2026-08-28T09:54:46.5235562Z         "unit": {
2026-08-28T09:54:46.5235714Z           "complete": true,
2026-08-28T09:54:46.5235872Z           "evidence": [
2026-08-28T09:54:46.5236014Z             {
2026-08-28T09:54:46.5236215Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.5236382Z               "line": 1251
2026-08-28T09:54:46.5236520Z             },
2026-08-28T09:54:46.5236671Z             {
2026-08-28T09:54:46.5236866Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.5237026Z               "line": 2446
2026-08-28T09:54:46.5237175Z             }
2026-08-28T09:54:46.5237326Z           ]
2026-08-28T09:54:46.5237475Z         }
2026-08-28T09:54:46.5237622Z       }
2026-08-28T09:54:46.5237871Z     },
2026-08-28T09:54:46.5238014Z     {
2026-08-28T09:54:46.5238176Z       "id": "REQ-EP-7",
2026-08-28T09:54:46.5240967Z       "title": "Durable live-role.md: a per-agent broad-purpose statement in tracked/agents/<id>/ beside live-context.md (replicates with the mind on the same a-<id> branch); renders FIRST at start-transition context injection (role -> live-context -> project-context); SOLE writer `spt endpoint role --overwrite <file>` — mechanical no-automated-writer guarantee (echo-commune ingest / signoff / Psyche reconcile structurally exclude it). The user-backed-origin hard gate on the writer is a deferred later tightening (rides the user-msg identity plumbing)",
2026-08-28T09:54:46.5241282Z       "requiredStages": [
2026-08-28T09:54:46.5241434Z         "doc",
2026-08-28T09:54:46.5241588Z         "impl",
2026-08-28T09:54:46.5241739Z         "unit"
2026-08-28T09:54:46.5241888Z       ],
2026-08-28T09:54:46.5242043Z       "stages": {
2026-08-28T09:54:46.5242191Z         "doc": {
2026-08-28T09:54:46.5242358Z           "complete": true,
2026-08-28T09:54:46.5242506Z           "evidence": [
2026-08-28T09:54:46.5242654Z             {
2026-08-28T09:54:46.5242826Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5242978Z               "line": 642
2026-08-28T09:54:46.5243130Z             }
2026-08-28T09:54:46.5243274Z           ]
2026-08-28T09:54:46.5243421Z         },
2026-08-28T09:54:46.5243565Z         "impl": {
2026-08-28T09:54:46.5243726Z           "complete": true,
2026-08-28T09:54:46.5243889Z           "evidence": [
2026-08-28T09:54:46.5244036Z             {
2026-08-28T09:54:46.5244236Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:46.5244397Z               "line": 556
2026-08-28T09:54:46.5244554Z             },
2026-08-28T09:54:46.5244700Z             {
2026-08-28T09:54:46.5244901Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:46.5245053Z               "line": 159
2026-08-28T09:54:46.5245211Z             },
2026-08-28T09:54:46.5245368Z             {
2026-08-28T09:54:46.5245583Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.5245741Z               "line": 81
2026-08-28T09:54:46.5245893Z             },
2026-08-28T09:54:46.5246041Z             {
2026-08-28T09:54:46.5246240Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.5246409Z               "line": 185
2026-08-28T09:54:46.5246541Z             },
2026-08-28T09:54:46.5246709Z             {
2026-08-28T09:54:46.5246898Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5247053Z               "line": 5369
2026-08-28T09:54:46.5247208Z             }
2026-08-28T09:54:46.5247350Z           ]
2026-08-28T09:54:46.5247620Z         },
2026-08-28T09:54:46.5247773Z         "int": {
2026-08-28T09:54:46.5247940Z           "complete": false,
2026-08-28T09:54:46.5248093Z           "evidence": []
2026-08-28T09:54:46.5248240Z         },
2026-08-28T09:54:46.5248393Z         "unit": {
2026-08-28T09:54:46.5248550Z           "complete": true,
2026-08-28T09:54:46.5248712Z           "evidence": [
2026-08-28T09:54:46.5248864Z             {
2026-08-28T09:54:46.5249156Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:46.5249313Z               "line": 674
2026-08-28T09:54:46.5249470Z             },
2026-08-28T09:54:46.5249619Z             {
2026-08-28T09:54:46.5249816Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.5249974Z               "line": 537
2026-08-28T09:54:46.5250119Z             },
2026-08-28T09:54:46.5250273Z             {
2026-08-28T09:54:46.5250463Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:46.5250631Z               "line": 372
2026-08-28T09:54:46.5250777Z             },
2026-08-28T09:54:46.5250926Z             {
2026-08-28T09:54:46.5251112Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5251303Z               "line": 28299
2026-08-28T09:54:46.5251441Z             },
2026-08-28T09:54:46.5251584Z             {
2026-08-28T09:54:46.5251761Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5251908Z               "line": 28403
2026-08-28T09:54:46.5252061Z             }
2026-08-28T09:54:46.5252213Z           ]
2026-08-28T09:54:46.5252361Z         }
2026-08-28T09:54:46.5252519Z       }
2026-08-28T09:54:46.5252660Z     },
2026-08-28T09:54:46.5252814Z     {
2026-08-28T09:54:46.5252975Z       "id": "REQ-EP-8",
2026-08-28T09:54:46.5257326Z       "title": "AlwaysOnEndpoint: a resident, addressable, mindless endpoint whose adapter binary the daemon supervises continuously — register-triggered by an adapter-option's `[always-on]` manifest section, one supervised binary per `<adapter>[:profile]`, running independent of agent liveness. It self-manages its `#`-addressed channel endpoints via the existing `api bind` (one connection fronts many). The SECOND class of spt-core-boot-launched third-party binary (after the shell wake-watcher); supervision reuses the wake-watcher scaffolding (backoff / give-up latch / one-per-instance lock / orphan-kill / brain-side reconcile) MINUS the offline-only flip — always online, never resting (no dormant/suspended states). Two-way: agents message it; it may call `endpoint wake <id>`, target-side authorized (REQ-INST-3/6 wake resolution + access whitelist + shell_wake_spawn_anywhere — no caller-ownership gate). First consumer downstream: spt-discord.",
2026-08-28T09:54:46.5257617Z       "requiredStages": [],
2026-08-28T09:54:46.5257768Z       "stages": {
2026-08-28T09:54:46.5257925Z         "doc": {
2026-08-28T09:54:46.5258089Z           "complete": true,
2026-08-28T09:54:46.5258248Z           "evidence": [
2026-08-28T09:54:46.5258404Z             {
2026-08-28T09:54:46.5258844Z               "path": "docs/adr/0023-always-on-endpoints-resident-supervised-binary-sigil-addressing.md",
2026-08-28T09:54:46.5259091Z               "line": 5
2026-08-28T09:54:46.5259244Z             }
2026-08-28T09:54:46.5259391Z           ]
2026-08-28T09:54:46.5259526Z         },
2026-08-28T09:54:46.5259691Z         "impl": {
2026-08-28T09:54:46.5259855Z           "complete": false,
2026-08-28T09:54:46.5260016Z           "evidence": []
2026-08-28T09:54:46.5260160Z         },
2026-08-28T09:54:46.5260311Z         "int": {
2026-08-28T09:54:46.5260482Z           "complete": false,
2026-08-28T09:54:46.5260628Z           "evidence": []
2026-08-28T09:54:46.5260776Z         },
2026-08-28T09:54:46.5260918Z         "unit": {
2026-08-28T09:54:46.5261086Z           "complete": false,
2026-08-28T09:54:46.5261238Z           "evidence": []
2026-08-28T09:54:46.5261386Z         }
2026-08-28T09:54:46.5261539Z       }
2026-08-28T09:54:46.5261682Z     },
2026-08-28T09:54:46.5261839Z     {
2026-08-28T09:54:46.5261991Z       "id": "REQ-EP-9",
2026-08-28T09:54:46.5264493Z       "title": "`#` always-on address sigil: a reserved LEADING sigil marking an AlwaysOnEndpoint, extending the REQ-INST-10 grammar to `[subnet:]#id[@node]`. Mandatory + bijective — `#name` ⟺ always-on endpoint, bare `name` ⟺ agent endpoint — so the router resolves endpoint class from the address alone, before any registry lookup. Sits ABOVE REQ-HAZARD-ID-CHARSET: the address parser strips the single leading `#` before id validation, so the bare/stored id stays charset-clean and a mid-id `#` remains rejected (the charset contract is unchanged).",
2026-08-28T09:54:46.5264675Z       "requiredStages": [],
2026-08-28T09:54:46.5264823Z       "stages": {
2026-08-28T09:54:46.5264981Z         "doc": {
2026-08-28T09:54:46.5265142Z           "complete": true,
2026-08-28T09:54:46.5265300Z           "evidence": [
2026-08-28T09:54:46.5265451Z             {
2026-08-28T09:54:46.5265868Z               "path": "docs/adr/0023-always-on-endpoints-resident-supervised-binary-sigil-addressing.md",
2026-08-28T09:54:46.5266035Z               "line": 5
2026-08-28T09:54:46.5266188Z             }
2026-08-28T09:54:46.5266336Z           ]
2026-08-28T09:54:46.5266484Z         },
2026-08-28T09:54:46.5266632Z         "impl": {
2026-08-28T09:54:46.5266774Z           "complete": false,
2026-08-28T09:54:46.5266932Z           "evidence": []
2026-08-28T09:54:46.5267074Z         },
2026-08-28T09:54:46.5267218Z         "int": {
2026-08-28T09:54:46.5267380Z           "complete": false,
2026-08-28T09:54:46.5267538Z           "evidence": []
2026-08-28T09:54:46.5267676Z         },
2026-08-28T09:54:46.5267829Z         "unit": {
2026-08-28T09:54:46.5268000Z           "complete": false,
2026-08-28T09:54:46.5268153Z           "evidence": []
2026-08-28T09:54:46.5268332Z         }
2026-08-28T09:54:46.5268480Z       }
2026-08-28T09:54:46.5268635Z     },
2026-08-28T09:54:46.5268779Z     {
2026-08-28T09:54:46.5269045Z       "id": "REQ-ER-BRIEFING-PRESENTED",
2026-08-28T09:54:46.5286945Z       "title": "The engine-room session briefing is PRESENTED, not merely spooled: it reaches the session's input before its first actionable turn (releases#164, doyle's five ruled clauses; root restated from measurement and ACCEPTED 2026-08-19). REQ-ER-SESSION-BRIEFING is satisfiable by an INSERT that nobody reads, which is the false confidence #164 names — this requirement is the consuming half, and the two are only meaningful together. THE DEFECT IS TIMING, NOT ELIGIBILITY, and that distinction was measured rather than argued: at the seat the ER perch is already a fully eligible spt-hosted inject target (controllable=Some(true), online, no relay — all three legs of is_spt_hosted_no_relay true), the row is spooled non-deferred and claimable, and the EXISTING idle-inject leg takes and delivers it correctly the moment the session declares idle (audited taken_leg=idle-inject, pending 1->0). Nothing is unreachable and no new taker is needed. What is wrong is WHEN: the row's only taker fires at the session's FIRST IDLE, which by construction is AFTER the first actionable turn, while clause 5's bar is BEFORE it. A window-gated arm cannot meet that bar. TWO EARLIER ROOTS ARE FALSIFIED and must not be rebuilt on: the `.idle` sentinel HAS a production writer (the `spt api state idle` seam), and the engine room is NOT adapter-less (its bring-up refuses outright unless its bound adapter is a registered HARNESS adapter). The remedy rides the NATIVE arm, which this codebase already defines as exactly this case — the window owns WHEN, native owns THROUGH WHAT — and which was proven to carry into a never-yet-idle ACTIVE ER session on the EXISTING surface before a line of the fix was written. Riding native satisfies every ruled clause by REUSE rather than new machinery: the same delivery path and the same single renderer (clause 2 forbids a second renderer), the same BEGIN IMMEDIATE claim kernel and taken_* stamping so a poll race cannot double-present (clause 3 — exactly-one-taker by claim, not by timing), and miss => release => row retained pending plus a loud post-seat notice, with the attach NEVER refused (clause 4, extending the denial-of-governance doctrine already at the spool-failure arm). Clause 1 is untouched: #142 post-seat composition is not relitigated. Gate: impl — the post-seat native drive of the briefing through the existing spt-hosted inject leg, reusing the audited claim and the single renderer, with the loud-notice-and-retain arm on presentation failure and no refusal path added to attach; int — a real mock ER session in which the briefing reaches session input BEFORE the first actionable turn, the spool audit shows exactly one taker, and the never-seated arm shows zero, driven end to end through the real verbs; AND the MISS half of clause 4 witnessed on the same real verbs, because a fence that only ever sees the happy path is not the fence that was ruled — a seat whose harness never binds must make the failure LOUD (and only after the drive's bounded wait is honestly spent, since an early give-up turns a merely slow bind into a lost briefing: the same defect, rarer and harder to see), must leave the row RETAINED and pending with its taker columns UNSTAMPED, and must NOT refuse the attach; and then the next seat-taking attach WITHIN THE SAME SESSION must RE-OFFER that retained row and deliver IT — asserted on the row's own id rather than on the arrival of any briefing. At a SESSION boundary the retained row is instead SUPERSEDED under REQ-ER-BRIEFING-SESSION-SCOPED: swept loudly at the new session's open, with the new session's own briefing delivered at that same attach — the chain proven cross-session is miss => release => retained => superseded-with-delivery, never a silent loss. The eligible-but-inject-FAILS shape is a DECLARED residual (doyle's ruling 2026-08-19): its only unique witness is the second loud branch, the claim-then-release it would exercise is the same shared drain path the arms above already walk, and it earns a cell if that branch ever fires unwitnessed in the field.",
2026-08-28T09:54:46.5287574Z       "requiredStages": [
2026-08-28T09:54:46.5287776Z         "impl",
2026-08-28T09:54:46.5287924Z         "int"
2026-08-28T09:54:46.5288076Z       ],
2026-08-28T09:54:46.5288223Z       "stages": {
2026-08-28T09:54:46.5288376Z         "doc": {
2026-08-28T09:54:46.5288538Z           "complete": false,
2026-08-28T09:54:46.5288705Z           "evidence": []
2026-08-28T09:54:46.5288853Z         },
2026-08-28T09:54:46.5289091Z         "impl": {
2026-08-28T09:54:46.5289260Z           "complete": true,
2026-08-28T09:54:46.5289415Z           "evidence": [
2026-08-28T09:54:46.5289567Z             {
2026-08-28T09:54:46.5289779Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5289938Z               "line": 2059
2026-08-28T09:54:46.5290089Z             },
2026-08-28T09:54:46.5290233Z             {
2026-08-28T09:54:46.5290432Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5290600Z               "line": 2359
2026-08-28T09:54:46.5290761Z             },
2026-08-28T09:54:46.5290905Z             {
2026-08-28T09:54:46.5291110Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:46.5291267Z               "line": 128
2026-08-28T09:54:46.5291420Z             }
2026-08-28T09:54:46.5291568Z           ]
2026-08-28T09:54:46.5291720Z         },
2026-08-28T09:54:46.5291874Z         "int": {
2026-08-28T09:54:46.5292038Z           "complete": true,
2026-08-28T09:54:46.5292195Z           "evidence": [
2026-08-28T09:54:46.5292341Z             {
2026-08-28T09:54:46.5292585Z               "path": "crates/spt/tests/er_briefing_presented_e2e.rs",
2026-08-28T09:54:46.5292742Z               "line": 388
2026-08-28T09:54:46.5292900Z             }
2026-08-28T09:54:46.5293042Z           ]
2026-08-28T09:54:46.5293195Z         },
2026-08-28T09:54:46.5293353Z         "unit": {
2026-08-28T09:54:46.5293524Z           "complete": false,
2026-08-28T09:54:46.5293686Z           "evidence": []
2026-08-28T09:54:46.5293839Z         }
2026-08-28T09:54:46.5293992Z       }
2026-08-28T09:54:46.5294134Z     },
2026-08-28T09:54:46.5294407Z     {
2026-08-28T09:54:46.5294597Z       "id": "REQ-ER-BRIEFING-SESSION-SCOPED",
2026-08-28T09:54:46.5307392Z       "title": "An engine-room briefing is SESSION-SCOPED: it states one session's weather, so a briefing that outlives the session it was minted for is stale by construction and must never be delivered (releases#208, doyle ruling 2026-08-21). The scope is enforced at SESSION OPEN, not at drain — the same predicate brief-once (REQ-ER-SESSION-BRIEFING, releases#177) already computes when it decides 'new session, enqueue a briefing' ALSO drops the undelivered briefing rows earlier sessions left behind, ordered immediately before this session's own spool so it cannot take the row it is about to mint. One site, one predicate; the drain stays dumb and learns nothing about sessions. SCOPE: UNDELIVERED rows of the reserved briefing author only — a DELIVERED row is history, cannot participate in a burst, and deleting it would be a retention change nobody filed; another author's pending mail is never touched. The count is reported, never a silent deletion, and a sweep that fails is LOUD but never blocking (stale rows reachable is a condition to state, not a reason to deny a proven human their controls). TWO MECHANISMS ARE RULED OUT WITH REASONS. (1) The `ephemeral` persistence axis: its deletion set IS the retention set of the releases#164 retained-row rescue — evaporation fires on the rows the drain RELEASED, i.e. the briefing whose presentation MISSED, which is the single case that rescue was built for; the native drive arm never evaporates at all, so the two arms would disagree about whether a briefing survives its own miss (measured at c62904e7: claim, deliver, release, then evaporate, idle arm only). (2) A time TTL: DEFAULT_TTL_SECONDS stays 0 — a time bound would evaporate a live session's own undelivered briefing on a slow attach AND still leak a stale one on a fast restart, wrong in both directions, because the honest scope is a SESSION and not a duration. The releases#164 intra-session rescue is UNCHANGED: the sweep fires only when the session is NEW, never between seats of one session, and presentation stays unconditional — this changes RETENTION, not presentation. Field measurement that opened it: six briefings minted across sixteen days on one node, delivered in a single burst oldest-first, three of them asserting an EMPTY ruleset in vocabulary the tree had already retired. Gate: doc — the CONTEXT.md engine-room briefing-retention sentence; impl — the sweep seam and its call at the session-open predicate; unit — the seam drops one author's undelivered rows and leaves that author's DELIVERED rows and every other author's pending rows intact, and an empty sweep is a zero rather than a failure; int — rows minted under session N then session N+1 opens: exactly ONE briefing delivers and it is the NEW one (the positive control is required — a fix that deletes everything satisfies the negative alone), and a seat that fails to present in ONE session still has its row re-offered to the next seat of that SAME session.",
2026-08-28T09:54:46.5307706Z       "requiredStages": [
2026-08-28T09:54:46.5307859Z         "doc",
2026-08-28T09:54:46.5308009Z         "impl",
2026-08-28T09:54:46.5308167Z         "unit",
2026-08-28T09:54:46.5308309Z         "int"
2026-08-28T09:54:46.5308462Z       ],
2026-08-28T09:54:46.5308614Z       "stages": {
2026-08-28T09:54:46.5308763Z         "doc": {
2026-08-28T09:54:46.5308924Z           "complete": true,
2026-08-28T09:54:46.5309173Z           "evidence": [
2026-08-28T09:54:46.5309320Z             {
2026-08-28T09:54:46.5309515Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5309673Z               "line": 859
2026-08-28T09:54:46.5309821Z             }
2026-08-28T09:54:46.5309974Z           ]
2026-08-28T09:54:46.5310122Z         },
2026-08-28T09:54:46.5310279Z         "impl": {
2026-08-28T09:54:46.5310446Z           "complete": true,
2026-08-28T09:54:46.5310611Z           "evidence": [
2026-08-28T09:54:46.5314282Z             {
2026-08-28T09:54:46.5314573Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5314897Z               "line": 2160
2026-08-28T09:54:46.5315050Z             },
2026-08-28T09:54:46.5315208Z             {
2026-08-28T09:54:46.5315437Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5315641Z               "line": 2332
2026-08-28T09:54:46.5315785Z             },
2026-08-28T09:54:46.5315936Z             {
2026-08-28T09:54:46.5316136Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.5316298Z               "line": 841
2026-08-28T09:54:46.5316456Z             }
2026-08-28T09:54:46.5316603Z           ]
2026-08-28T09:54:46.5316752Z         },
2026-08-28T09:54:46.5316899Z         "int": {
2026-08-28T09:54:46.5317066Z           "complete": true,
2026-08-28T09:54:46.5317218Z           "evidence": [
2026-08-28T09:54:46.5317376Z             {
2026-08-28T09:54:46.5317637Z               "path": "crates/spt/tests/er_briefing_session_scoped_e2e.rs",
2026-08-28T09:54:46.5317805Z               "line": 230
2026-08-28T09:54:46.5317957Z             }
2026-08-28T09:54:46.5318101Z           ]
2026-08-28T09:54:46.5318252Z         },
2026-08-28T09:54:46.5318399Z         "unit": {
2026-08-28T09:54:46.5318564Z           "complete": true,
2026-08-28T09:54:46.5318717Z           "evidence": [
2026-08-28T09:54:46.5318874Z             {
2026-08-28T09:54:46.5319184Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5319347Z               "line": 13224
2026-08-28T09:54:46.5319504Z             },
2026-08-28T09:54:46.5319647Z             {
2026-08-28T09:54:46.5319856Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5320010Z               "line": 13476
2026-08-28T09:54:46.5320157Z             },
2026-08-28T09:54:46.5320301Z             {
2026-08-28T09:54:46.5320504Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.5320659Z               "line": 914
2026-08-28T09:54:46.5320921Z             },
2026-08-28T09:54:46.5321067Z             {
2026-08-28T09:54:46.5321267Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.5321422Z               "line": 960
2026-08-28T09:54:46.5321570Z             }
2026-08-28T09:54:46.5321713Z           ]
2026-08-28T09:54:46.5321861Z         }
2026-08-28T09:54:46.5322014Z       }
2026-08-28T09:54:46.5322166Z     },
2026-08-28T09:54:46.5322304Z     {
2026-08-28T09:54:46.5322495Z       "id": "REQ-ER-BRIEFING-SURFACE-VOCAB",
2026-08-28T09:54:46.5331270Z       "title": "The engine room is made aware of the surface vocabulary in the same words the CLI teaches it: the surface section is composed FROM THE SAME TABLE AND THE SAME COMPOSER the CLI help uses, WHEREVER THE ENGINE ROOM RECEIVES IT, rather than restating the vocabulary in prose. AMENDED BY REPLACEMENT in the KEYSTONE #182 W3 lane (doyle ruling on releases#179, 2026-08-19): the surface section moved from the bring-up briefing to the engine room's durable in-core role (REQ-ER-ROLE-STATIC-IMMUTABLE), so this requirement names the PROPERTY rather than one carrier — single-source is preserved across the carrier move, and role, briefing and CLI help remain unable to diverge. Before this section existed the engine room saw surfaces only as the SURFACE column of the ruleset table — a rendering of what rules already say, which tells an engine room what is configured but never what the words mean or what granting one costs. The single-source property IS the requirement: an engine room taught at seat time and an operator reading --help must be unable to receive different vocabularies, and a surface added to the table must reach BOTH renderings with no second edit — which is why the composer is table-PARAMETERIZED, and why a hardcoded surface list, in the role or anywhere else, is a defect this requirement refuses (the carrier of the role is a function and not a const for exactly this reason). The engine room must also not be sent to a verb that no longer exists: a section that teaches the vocabulary while prescribing a dead command teaches half a lie. Gate: doc — the CONTEXT.md engine-room entry naming the surface section as table-composed wherever it is served; impl — the role composer and the briefing both calling the shared composer, never a literal surface list; unit — a fixture table carrying an INVENTED row reaches the engine room exactly as it reaches the help, the section text is identical to the CLI's for the same table, and no prescribed subcommand is one the CLI does not parse.",
2026-08-28T09:54:46.5331590Z       "requiredStages": [
2026-08-28T09:54:46.5331736Z         "doc",
2026-08-28T09:54:46.5331879Z         "impl",
2026-08-28T09:54:46.5332034Z         "unit"
2026-08-28T09:54:46.5332188Z       ],
2026-08-28T09:54:46.5332339Z       "stages": {
2026-08-28T09:54:46.5332488Z         "doc": {
2026-08-28T09:54:46.5332654Z           "complete": true,
2026-08-28T09:54:46.5332808Z           "evidence": [
2026-08-28T09:54:46.5332959Z             {
2026-08-28T09:54:46.5333122Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5333288Z               "line": 859
2026-08-28T09:54:46.5333437Z             }
2026-08-28T09:54:46.5333589Z           ]
2026-08-28T09:54:46.5333738Z         },
2026-08-28T09:54:46.5333889Z         "impl": {
2026-08-28T09:54:46.5334057Z           "complete": true,
2026-08-28T09:54:46.5334203Z           "evidence": [
2026-08-28T09:54:46.5334351Z             {
2026-08-28T09:54:46.5334544Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.5334706Z               "line": 430
2026-08-28T09:54:46.5334849Z             },
2026-08-28T09:54:46.5334997Z             {
2026-08-28T09:54:46.5335187Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.5335341Z               "line": 445
2026-08-28T09:54:46.5335507Z             },
2026-08-28T09:54:46.5335675Z             {
2026-08-28T09:54:46.5335874Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5336032Z               "line": 71
2026-08-28T09:54:46.5336285Z             },
2026-08-28T09:54:46.5336432Z             {
2026-08-28T09:54:46.5336629Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5336780Z               "line": 91
2026-08-28T09:54:46.5336925Z             }
2026-08-28T09:54:46.5337080Z           ]
2026-08-28T09:54:46.5337223Z         },
2026-08-28T09:54:46.5337371Z         "int": {
2026-08-28T09:54:46.5337533Z           "complete": false,
2026-08-28T09:54:46.5337700Z           "evidence": []
2026-08-28T09:54:46.5337986Z         },
2026-08-28T09:54:46.5338138Z         "unit": {
2026-08-28T09:54:46.5338305Z           "complete": true,
2026-08-28T09:54:46.5338457Z           "evidence": [
2026-08-28T09:54:46.5338615Z             {
2026-08-28T09:54:46.5338811Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5339049Z               "line": 211
2026-08-28T09:54:46.5339203Z             },
2026-08-28T09:54:46.5339353Z             {
2026-08-28T09:54:46.5339534Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5339694Z               "line": 36370
2026-08-28T09:54:46.5339852Z             },
2026-08-28T09:54:46.5339999Z             {
2026-08-28T09:54:46.5340181Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5340333Z               "line": 36411
2026-08-28T09:54:46.5340486Z             },
2026-08-28T09:54:46.5340633Z             {
2026-08-28T09:54:46.5340815Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5340967Z               "line": 36613
2026-08-28T09:54:46.5341116Z             }
2026-08-28T09:54:46.5341268Z           ]
2026-08-28T09:54:46.5341417Z         }
2026-08-28T09:54:46.5341563Z       }
2026-08-28T09:54:46.5341712Z     },
2026-08-28T09:54:46.5341859Z     {
2026-08-28T09:54:46.5342061Z       "id": "REQ-ER-BRINGUP-ABSENT-CODE-UNCOUNTED",
2026-08-28T09:54:46.5352700Z       "title": "An engine-room attach that presents NO bring-up code is refused WITHOUT spending a unit of the human's attempt budget (releases#197; ADR-0052 section 2a, second uncounted class). The ledger bounds GUESSES at a human-held TOTP, and an absent code is not a guess: it carries no candidate, can never admit, and is the truthful answer from every attach path on this box that has no human at a keyboard to read a code off. Counting it handed any local process the exact ratchet REQ-ER-BRINGUP-ATTEMPT-BOUND already forbids for in-backoff attempts — N codeless attaches shut the gate a human needs to take the controls back — which is why this MOVES that requirement's text rather than sharpening it, and why the two name the pair together. It is the same fact-about-this-node's-own-configuration shape that already makes a missing bound adapter uncounted (REQ-ER-BRINGUP-TOTP-GATE), applied one input later, and it costs the brute-force bound NOTHING: the bound is over PRESENTED candidates, every one of which still counts exactly as before. The distinction is presented-versus-absent and NEVER which-key-matched, so ADR-0051's indistinguishability is untouched — an absent code carries zero member-versus-admin bits and refusal uniformity binds codes that are neither key. The ORDER is load-bearing and unchanged: the backoff is evaluated FIRST, so a codeless attempt arriving at a shut gate is answered Throttled exactly as a wrong code is and gate state stays unreadable. The ledger is NOT WRITTEN for this outcome, extending the missing-adapter write-skip rather than writing it back unchanged, because a write that failed would turn a benign codeless attach into a ledger-unwritable refusal — a worse lie than the one being fixed. Gate: doc — the ADR-0052 section 2a bullet naming the absent-code class, its ADR-0051 reading, and the throttle-first order; impl — the presentation-typed gate input (absent versus code-with-one-verified-bit), the uncounted outcome that folds into the ledger as a no-op, its own refusal sentence and label, and the extended ledger write-skip; unit — an absent code is uncounted with the ledger struct byte-unchanged, a wrong code still counts and still shuts the gate on the same schedule, a codeless attempt DURING a backoff is still Throttled (the throttle-first order pinned by test rather than by reading order), and an absent code at a shut gate answers identically to a wrong code at a shut gate.",
2026-08-28T09:54:46.5353270Z       "requiredStages": [
2026-08-28T09:54:46.5353450Z         "doc",
2026-08-28T09:54:46.5353632Z         "impl",
2026-08-28T09:54:46.5353779Z         "unit"
2026-08-28T09:54:46.5353913Z       ],
2026-08-28T09:54:46.5354051Z       "stages": {
2026-08-28T09:54:46.5354195Z         "doc": {
2026-08-28T09:54:46.5354357Z           "complete": true,
2026-08-28T09:54:46.5354510Z           "evidence": [
2026-08-28T09:54:46.5354657Z             {
2026-08-28T09:54:46.5354910Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5355067Z               "line": 77
2026-08-28T09:54:46.5355230Z             }
2026-08-28T09:54:46.5355390Z           ]
2026-08-28T09:54:46.5355542Z         },
2026-08-28T09:54:46.5355697Z         "impl": {
2026-08-28T09:54:46.5355856Z           "complete": true,
2026-08-28T09:54:46.5356021Z           "evidence": [
2026-08-28T09:54:46.5356171Z             {
2026-08-28T09:54:46.5356370Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5356528Z               "line": 1809
2026-08-28T09:54:46.5356670Z             },
2026-08-28T09:54:46.5356819Z             {
2026-08-28T09:54:46.5357009Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5357167Z               "line": 1901
2026-08-28T09:54:46.5357319Z             },
2026-08-28T09:54:46.5357463Z             {
2026-08-28T09:54:46.5357672Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5357824Z               "line": 354
2026-08-28T09:54:46.5357973Z             },
2026-08-28T09:54:46.5358121Z             {
2026-08-28T09:54:46.5358329Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5358482Z               "line": 546
2026-08-28T09:54:46.5358629Z             },
2026-08-28T09:54:46.5358782Z             {
2026-08-28T09:54:46.5359082Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5359374Z               "line": 583
2026-08-28T09:54:46.5359520Z             },
2026-08-28T09:54:46.5359670Z             {
2026-08-28T09:54:46.5359878Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5360046Z               "line": 611
2026-08-28T09:54:46.5360188Z             }
2026-08-28T09:54:46.5360337Z           ]
2026-08-28T09:54:46.5360493Z         },
2026-08-28T09:54:46.5360640Z         "int": {
2026-08-28T09:54:46.5360810Z           "complete": false,
2026-08-28T09:54:46.5360963Z           "evidence": []
2026-08-28T09:54:46.5361119Z         },
2026-08-28T09:54:46.5361268Z         "unit": {
2026-08-28T09:54:46.5361424Z           "complete": true,
2026-08-28T09:54:46.5361578Z           "evidence": [
2026-08-28T09:54:46.5361734Z             {
2026-08-28T09:54:46.5361936Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5362097Z               "line": 14102
2026-08-28T09:54:46.5362251Z             },
2026-08-28T09:54:46.5362397Z             {
2026-08-28T09:54:46.5362593Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5362750Z               "line": 14176
2026-08-28T09:54:46.5362904Z             },
2026-08-28T09:54:46.5363051Z             {
2026-08-28T09:54:46.5363256Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5363421Z               "line": 710
2026-08-28T09:54:46.5363573Z             },
2026-08-28T09:54:46.5363724Z             {
2026-08-28T09:54:46.5363925Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5364082Z               "line": 762
2026-08-28T09:54:46.5364226Z             },
2026-08-28T09:54:46.5364372Z             {
2026-08-28T09:54:46.5364574Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5364731Z               "line": 974
2026-08-28T09:54:46.5364883Z             }
2026-08-28T09:54:46.5365151Z           ]
2026-08-28T09:54:46.5365298Z         }
2026-08-28T09:54:46.5365447Z       }
2026-08-28T09:54:46.5365623Z     },
2026-08-28T09:54:46.5365766Z     {
2026-08-28T09:54:46.5365959Z       "id": "REQ-ER-BRINGUP-ANCHORS-PERCH",
2026-08-28T09:54:46.5382278Z       "title": "A BRING-UP THAT KNOWS THE ROOM'S ANCHOR CREATES THE ROOM'S PERCH WITH IT, so the harness bind it is about to launch inherits that anchor instead of re-resolving one it is not allowed to guess. An endpoint's anchor subnet is its DEFAULT-SCOPE subnet, so `stamp_creation_fields` refuses to invent one at creation on a node holding more than one subnet (ANCHOR_REFUSED / MULTI_SUBNET_HOME) — a deliberate explicit-choice seam that this requirement PRESERVES rather than relaxes: a caller with no anchor still cannot create a record, and the bind path still refuses exactly as before. The defect was that the engine-room bring-up HELD the answer and dropped it — `room.home_subnet` is the very value the same handler prints as ENGINE_ROOM_ADMIN_BRINGUP_EMPOWERED — so on every multi-subnet node the room's own perch was uncreatable. Measured end to end on HFENDULEAM at v0.58.0 (releases#204): no `info.json` was ever written for engine-room (the perch dir held only `spool.db` and `.has-messages`), the harness's first act `spt api bind engine-room` met the creation arm with prior=None and was refused naming all three subnets (BIGNET, SPT_MANTLE, SPT_DEV) — loudly, but only into the adapter's `hook-trace.log` — the endpoint therefore never entered any roster, `spt send engine-room` answered NO_PERCH three times across fifteen minutes, and the retained briefing row could never be delivered to a target that does not exist. The skeleton is written beside the in-flight ledger, before the launch thread fires, for the reason that entry is there: both are facts about a bring-up this broker started and both must be true before the harness exists to observe them. It is IDEMPOTENT BY REFUSAL — an existing record is left untouched, so a second bring-up cannot reset a live perch — and LOUD BUT NEVER A REFUSAL, the same denial-of-governance rule `empower_home_for_bringup` follows: a record that could not be written costs the operator the briefing, not the room, and degrades to exactly the known pre-fix path rather than inventing a new failure. SECOND SURFACE, SAME REQUIREMENT: the UNPRESENTED alarm splits, because one text was covering two events and promising what only one of them can keep. Perch-ABSENT (no record — in no roster, no inject can ever target it, the retained row waits forever) must NOT tell the operator the briefing arrives at the session's first idle; perch-SLOW (record exists, not yet a deliverable inject target) keeps today's promise, which it can honor. The absent arm fires only on a POSITIVE measurement of absence — the record file is not there — so an unreadable or unparseable record takes the promising arm (an absent answer is not a zero), and the predicate is record-EXISTENCE rather than liveness so a re-attach to a merely idle room can never false-fire it. Gate: doc — the published harness-contract sentence that the identity brief's perch claim is valid only after successful registration, and that on a refused bind the adapter emits the no-perch shape carrying the refusal (the sentence the adapter and omp-spt build against); impl — the anchored-skeleton writer in spt-store called from the bring-up path with the room's own home_subnet, plus the two-arm alarm; unit — the skeleton writer anchors a fresh record and seeds its scope, refuses to overwrite an existing one, and the alarm predicate distinguishes absent from slow with the unreadable case failing OPEN to slow; int — a REAL bring-up on a multi-subnet node leaves a rostered perch record (the pre-fix red: the record is absent and the bind is refused), which is the witness the pre-existing multi-subnet cell could never be, because its rig pre-creates the anchored skeleton that is exactly the condition the real path failed to establish.",
2026-08-28T09:54:46.5382616Z       "requiredStages": [
2026-08-28T09:54:46.5382869Z         "doc",
2026-08-28T09:54:46.5383027Z         "impl",
2026-08-28T09:54:46.5383179Z         "unit",
2026-08-28T09:54:46.5383323Z         "int"
2026-08-28T09:54:46.5383475Z       ],
2026-08-28T09:54:46.5383624Z       "stages": {
2026-08-28T09:54:46.5383775Z         "doc": {
2026-08-28T09:54:46.5383929Z           "complete": true,
2026-08-28T09:54:46.5384080Z           "evidence": [
2026-08-28T09:54:46.5384229Z             {
2026-08-28T09:54:46.5384451Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:46.5384608Z               "line": 183
2026-08-28T09:54:46.5384754Z             }
2026-08-28T09:54:46.5384902Z           ]
2026-08-28T09:54:46.5385046Z         },
2026-08-28T09:54:46.5385202Z         "impl": {
2026-08-28T09:54:46.5385361Z           "complete": true,
2026-08-28T09:54:46.5385522Z           "evidence": [
2026-08-28T09:54:46.5385690Z             {
2026-08-28T09:54:46.5385899Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5386060Z               "line": 2054
2026-08-28T09:54:46.5386210Z             },
2026-08-28T09:54:46.5386351Z             {
2026-08-28T09:54:46.5386553Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5386747Z               "line": 6302
2026-08-28T09:54:46.5386910Z             },
2026-08-28T09:54:46.5387061Z             {
2026-08-28T09:54:46.5387246Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.5387406Z               "line": 872
2026-08-28T09:54:46.5387555Z             }
2026-08-28T09:54:46.5387693Z           ]
2026-08-28T09:54:46.5387832Z         },
2026-08-28T09:54:46.5387988Z         "int": {
2026-08-28T09:54:46.5388147Z           "complete": true,
2026-08-28T09:54:46.5388303Z           "evidence": [
2026-08-28T09:54:46.5388447Z             {
2026-08-28T09:54:46.5388675Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5388833Z               "line": 2014
2026-08-28T09:54:46.5389134Z             }
2026-08-28T09:54:46.5389285Z           ]
2026-08-28T09:54:46.5389610Z         },
2026-08-28T09:54:46.5389759Z         "unit": {
2026-08-28T09:54:46.5389923Z           "complete": true,
2026-08-28T09:54:46.5390076Z           "evidence": [
2026-08-28T09:54:46.5390228Z             {
2026-08-28T09:54:46.5390420Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5390581Z               "line": 9645
2026-08-28T09:54:46.5390735Z             },
2026-08-28T09:54:46.5390886Z             {
2026-08-28T09:54:46.5391087Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:46.5391239Z               "line": 354
2026-08-28T09:54:46.5391393Z             },
2026-08-28T09:54:46.5391540Z             {
2026-08-28T09:54:46.5391736Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.5391888Z               "line": 978
2026-08-28T09:54:46.5392051Z             },
2026-08-28T09:54:46.5392202Z             {
2026-08-28T09:54:46.5392391Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.5392561Z               "line": 1019
2026-08-28T09:54:46.5392711Z             }
2026-08-28T09:54:46.5392862Z           ]
2026-08-28T09:54:46.5393010Z         }
2026-08-28T09:54:46.5393157Z       }
2026-08-28T09:54:46.5393302Z     },
2026-08-28T09:54:46.5393453Z     {
2026-08-28T09:54:46.5393645Z       "id": "REQ-ER-BRINGUP-ATTEMPT-BOUND",
2026-08-28T09:54:46.5402747Z       "title": "The engine-room bring-up gate is bounded by ONE shared failure ledger with exponential backoff, not by a per-secret count (doyle ruling 2026-07-29 on ADR-0052 decision 2). Accepting either the member or the admin TOTP would otherwise hand an attacker a doubled online-guess budget (the ADR-0051 section 1a shape); a SINGLE persisted counter covering BOTH secrets removes that arithmetic entirely — the budget is the ledger's, not the keyring's. Backoff starts at one second and doubles to a one-hour cap. TWO classes of attempt are refused WITHOUT counting, named together here so the pair cannot drift apart: attempts arriving DURING a backoff, and attempts presenting NO code at all (whose own properties are owned by REQ-ER-BRINGUP-ABSENT-CODE-UNCOUNTED, minted 2026-08-19 for releases#197). Both classes exist for one reason: in this threat model the adversary is an agent on the same box, and any countable attempt it can produce WITHOUT holding subnet material lets it ratchet the human into permanent lockout — denial of governance is the attack, not merely a nuisance. The ledger resets on success and PERSISTS ACROSS DAEMON RESTARTS: a bounce that cleared it would restore the full budget on demand (the per-process-mint defect class the access-model spec found). Failures past the third raise a notification, so brute force is loud and silence buys the attacker nothing. This local bound is explicitly NOT ADR-0051 section 1a's network rate-limit argument, which does not apply on a local path with no round trip. Gate: doc — the ADR-0052 amendment naming ledger-plus-backoff as the local bound and distinguishing it from the network argument; impl — the persisted shared ledger, the backoff schedule, the refuse-without-counting rule in BOTH its classes, and the loud notification; unit — the schedule (one second doubling to the one-hour cap), one ledger for both secrets, an in-backoff attempt refused and NOT counted, a codeless attempt refused and NOT counted, reset on success, survival across a restart, and the notification threshold.",
2026-08-28T09:54:46.5403041Z       "requiredStages": [
2026-08-28T09:54:46.5403193Z         "doc",
2026-08-28T09:54:46.5403346Z         "impl",
2026-08-28T09:54:46.5403494Z         "unit"
2026-08-28T09:54:46.5403642Z       ],
2026-08-28T09:54:46.5403790Z       "stages": {
2026-08-28T09:54:46.5403937Z         "doc": {
2026-08-28T09:54:46.5404105Z           "complete": true,
2026-08-28T09:54:46.5404262Z           "evidence": [
2026-08-28T09:54:46.5404419Z             {
2026-08-28T09:54:46.5404657Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5404825Z               "line": 62
2026-08-28T09:54:46.5404967Z             }
2026-08-28T09:54:46.5405234Z           ]
2026-08-28T09:54:46.5405383Z         },
2026-08-28T09:54:46.5405549Z         "impl": {
2026-08-28T09:54:46.5405743Z           "complete": true,
2026-08-28T09:54:46.5405898Z           "evidence": [
2026-08-28T09:54:46.5406051Z             {
2026-08-28T09:54:46.5406250Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5406409Z               "line": 1575
2026-08-28T09:54:46.5406556Z             },
2026-08-28T09:54:46.5406705Z             {
2026-08-28T09:54:46.5406899Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5407063Z               "line": 1808
2026-08-28T09:54:46.5407219Z             },
2026-08-28T09:54:46.5407363Z             {
2026-08-28T09:54:46.5407558Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5407707Z               "line": 1999
2026-08-28T09:54:46.5407858Z             },
2026-08-28T09:54:46.5408012Z             {
2026-08-28T09:54:46.5408210Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5408371Z               "line": 4223
2026-08-28T09:54:46.5408522Z             },
2026-08-28T09:54:46.5408675Z             {
2026-08-28T09:54:46.5408880Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5409151Z               "line": 497
2026-08-28T09:54:46.5409305Z             },
2026-08-28T09:54:46.5409456Z             {
2026-08-28T09:54:46.5409662Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5409819Z               "line": 582
2026-08-28T09:54:46.5409972Z             },
2026-08-28T09:54:46.5410120Z             {
2026-08-28T09:54:46.5410324Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5410473Z               "line": 610
2026-08-28T09:54:46.5410621Z             },
2026-08-28T09:54:46.5410769Z             {
2026-08-28T09:54:46.5410968Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.5411225Z               "line": 279
2026-08-28T09:54:46.5411377Z             },
2026-08-28T09:54:46.5411526Z             {
2026-08-28T09:54:46.5411725Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5411883Z               "line": 330
2026-08-28T09:54:46.5412035Z             },
2026-08-28T09:54:46.5412193Z             {
2026-08-28T09:54:46.5412388Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5412541Z               "line": 720
2026-08-28T09:54:46.5412689Z             }
2026-08-28T09:54:46.5412837Z           ]
2026-08-28T09:54:46.5412984Z         },
2026-08-28T09:54:46.5413133Z         "int": {
2026-08-28T09:54:46.5413293Z           "complete": false,
2026-08-28T09:54:46.5413451Z           "evidence": []
2026-08-28T09:54:46.5413606Z         },
2026-08-28T09:54:46.5413759Z         "unit": {
2026-08-28T09:54:46.5413925Z           "complete": true,
2026-08-28T09:54:46.5414083Z           "evidence": [
2026-08-28T09:54:46.5414240Z             {
2026-08-28T09:54:46.5414450Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5414602Z               "line": 13092
2026-08-28T09:54:46.5414765Z             },
2026-08-28T09:54:46.5414907Z             {
2026-08-28T09:54:46.5415108Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5415265Z               "line": 14101
2026-08-28T09:54:46.5415417Z             },
2026-08-28T09:54:46.5415565Z             {
2026-08-28T09:54:46.5415780Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5415943Z               "line": 642
2026-08-28T09:54:46.5416089Z             },
2026-08-28T09:54:46.5416246Z             {
2026-08-28T09:54:46.5416449Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5416612Z               "line": 656
2026-08-28T09:54:46.5416764Z             },
2026-08-28T09:54:46.5416917Z             {
2026-08-28T09:54:46.5417121Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5417279Z               "line": 682
2026-08-28T09:54:46.5417561Z             },
2026-08-28T09:54:46.5417708Z             {
2026-08-28T09:54:46.5417914Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5418075Z               "line": 711
2026-08-28T09:54:46.5418224Z             },
2026-08-28T09:54:46.5418375Z             {
2026-08-28T09:54:46.5418576Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5418741Z               "line": 787
2026-08-28T09:54:46.5418884Z             },
2026-08-28T09:54:46.5419125Z             {
2026-08-28T09:54:46.5419331Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5419493Z               "line": 803
2026-08-28T09:54:46.5419641Z             },
2026-08-28T09:54:46.5419789Z             {
2026-08-28T09:54:46.5419988Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5420151Z               "line": 824
2026-08-28T09:54:46.5420303Z             }
2026-08-28T09:54:46.5420452Z           ]
2026-08-28T09:54:46.5420614Z         }
2026-08-28T09:54:46.5420762Z       }
2026-08-28T09:54:46.5420908Z     },
2026-08-28T09:54:46.5421053Z     {
2026-08-28T09:54:46.5421252Z       "id": "REQ-ER-BRINGUP-INFLIGHT-LEDGER",
2026-08-28T09:54:46.5432531Z       "title": "THE BROKER RECORDS A BRING-UP WHEN IT STARTS ONE, and the reserved-id bind gate reads that record as well as the sessions table. The gate's premise is that the reserved id passes only as THE COMPLETION OF A BRING-UP THE BROKER STARTED (REQ-ER-RESERVED-ID-SPAWN-REFUSAL), but the only fact it can consult is the sessions table, which records COMPLETED-ness — so between the broker creating the harness child and the session row being inserted there is a window in which the broker's OWN spawned harness asks the gate whether a bring-up it is itself completing exists, and is told no. Measured end to end on releases#199: the child's first act is `spt api bind engine-room`, the arm that answers is `ER_HOSTED_PROBE:no-row sessions=0` (dial OK, query OK, table EMPTY — named 3/3 in a channel proven to speak), the bind is refused RESERVED_ID, the harness exits bind-failed, no session ever registers, the ready-wait burns its full bound and the operator is told the engine room is not up. THE DEFECT IS A MISSING FACT, NOT A TOLERANT READER: the fix writes started-ness where it happens instead of teaching every reader of the sessions table to tolerate a counterfeit of its consequence, so the ledger lives OUTSIDE that table and the wake gate, the zombie verdict, every process-id reader and the rollback path are untouched by construction rather than by discipline. The record is endpoint-keyed with a deadline, written before the launch thread fires, swept on insert like the admit tickets, removed the moment the session row appears, and expiring harmlessly when a spawn fails so no phantom entry can outlive the bring-up that wrote it. Its TTL is the bring-up's own ready-wait, because the window it covers is exactly the window the bring-up is willing to wait through. It reaches the gate as one additive field on the brain's sessions reply — internal IPC, no P2P wire change. THE RESIDUAL IS STATED RATHER THAN ABSORBED: the added arm admits a hand-run bind of the reserved id during a live in-flight window, which satisfies the same not-as-a-first-mover premise (the broker did start a bring-up), is bounded by the TTL, and collides into the existing CONFLICT arm. Gate: impl — the endpoint-keyed in-flight ledger written pre-spawn on the bring-up path and cleared at registration, carried on the sessions reply, and the hosted predicate answering row-OR-in-flight; unit — a bring-up recorded before its session exists answers the predicate true, a registration clears the entry, an expired entry answers false, a sweep on insert drops what is no longer live, and an ordinary spawn writes no entry at all.",
2026-08-28T09:54:46.5432841Z       "requiredStages": [
2026-08-28T09:54:46.5432994Z         "impl",
2026-08-28T09:54:46.5433141Z         "unit"
2026-08-28T09:54:46.5433299Z       ],
2026-08-28T09:54:46.5433441Z       "stages": {
2026-08-28T09:54:46.5433699Z         "doc": {
2026-08-28T09:54:46.5433877Z           "complete": false,
2026-08-28T09:54:46.5434032Z           "evidence": []
2026-08-28T09:54:46.5434187Z         },
2026-08-28T09:54:46.5434342Z         "impl": {
2026-08-28T09:54:46.5434514Z           "complete": true,
2026-08-28T09:54:46.5434669Z           "evidence": [
2026-08-28T09:54:46.5434817Z             {
2026-08-28T09:54:46.5435021Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5435184Z               "line": 5153
2026-08-28T09:54:46.5435340Z             },
2026-08-28T09:54:46.5435490Z             {
2026-08-28T09:54:46.5435698Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5435894Z               "line": 6006
2026-08-28T09:54:46.5436047Z             },
2026-08-28T09:54:46.5436190Z             {
2026-08-28T09:54:46.5436390Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5436590Z               "line": 6278
2026-08-28T09:54:46.5436739Z             },
2026-08-28T09:54:46.5436890Z             {
2026-08-28T09:54:46.5437073Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5437229Z               "line": 7661
2026-08-28T09:54:46.5437381Z             },
2026-08-28T09:54:46.5437574Z             {
2026-08-28T09:54:46.5437765Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5438022Z               "line": 7672
2026-08-28T09:54:46.5438184Z             },
2026-08-28T09:54:46.5438333Z             {
2026-08-28T09:54:46.5438527Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5438681Z               "line": 7684
2026-08-28T09:54:46.5438833Z             },
2026-08-28T09:54:46.5439072Z             {
2026-08-28T09:54:46.5439277Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5439429Z               "line": 7694
2026-08-28T09:54:46.5439582Z             },
2026-08-28T09:54:46.5439833Z             {
2026-08-28T09:54:46.5440033Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5440197Z               "line": 8213
2026-08-28T09:54:46.5440347Z             },
2026-08-28T09:54:46.5440503Z             {
2026-08-28T09:54:46.5440694Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5440860Z               "line": 1570
2026-08-28T09:54:46.5441009Z             },
2026-08-28T09:54:46.5441160Z             {
2026-08-28T09:54:46.5441366Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5441524Z               "line": 241
2026-08-28T09:54:46.5441667Z             },
2026-08-28T09:54:46.5441814Z             {
2026-08-28T09:54:46.5442019Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5442168Z               "line": 250
2026-08-28T09:54:46.5442319Z             },
2026-08-28T09:54:46.5442473Z             {
2026-08-28T09:54:46.5442672Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5442829Z               "line": 264
2026-08-28T09:54:46.5442982Z             }
2026-08-28T09:54:46.5443134Z           ]
2026-08-28T09:54:46.5443278Z         },
2026-08-28T09:54:46.5443430Z         "int": {
2026-08-28T09:54:46.5443592Z           "complete": false,
2026-08-28T09:54:46.5443754Z           "evidence": []
2026-08-28T09:54:46.5443907Z         },
2026-08-28T09:54:46.5444054Z         "unit": {
2026-08-28T09:54:46.5444222Z           "complete": true,
2026-08-28T09:54:46.5444379Z           "evidence": [
2026-08-28T09:54:46.5444527Z             {
2026-08-28T09:54:46.5444722Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5444884Z               "line": 13649
2026-08-28T09:54:46.5445035Z             },
2026-08-28T09:54:46.5445183Z             {
2026-08-28T09:54:46.5445377Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5445530Z               "line": 13726
2026-08-28T09:54:46.5445677Z             },
2026-08-28T09:54:46.5445830Z             {
2026-08-28T09:54:46.5446031Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5446441Z               "line": 938
2026-08-28T09:54:46.5446592Z             },
2026-08-28T09:54:46.5446741Z             {
2026-08-28T09:54:46.5446941Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5447103Z               "line": 965
2026-08-28T09:54:46.5447251Z             }
2026-08-28T09:54:46.5447399Z           ]
2026-08-28T09:54:46.5447546Z         }
2026-08-28T09:54:46.5447700Z       }
2026-08-28T09:54:46.5447846Z     },
2026-08-28T09:54:46.5447993Z     {
2026-08-28T09:54:46.5448182Z       "id": "REQ-ER-BRINGUP-LAUNCH-PHASE-TRACE",
2026-08-28T09:54:46.5458539Z       "title": "A BRING-UP THAT FAILS NAMES THE PHASE IT REACHED, in a record that outlives the operator's terminal. The bring-up handler waits on ONE fact — a row in the broker's own sessions table — and the launch that produces that row runs on a DETACHED THREAD which, pre-fix, said nothing at all unless it returned Err. So the only account of a failure was the refusal sentence `the code was accepted, but the engine room's harness did not come up within 30s`, which reaches the operator's terminal and dies with it, and which is IDENTICALLY produced by four different mechanisms: a launch that returned Err (loud, but only in a channel nobody read against the timeout), a launch still waiting UNBOUNDED on the broker's reply (`Brain::cold_start` carries `io_timeout: None`), a ConPTY create that overran the bound, and a harness that SPAWNED AND DIED so that its row existed and then did not. THE POLL CANNOT TELL THESE APART BY CONSTRUCTION — it reads a row, and every one of them is a missing row. The requirement is that each side stamps its own phases into the persisted daemon stderr sink (REQ-DAEMON-STDERR-PERSIST): the launch thread stamps enter/prepared/connecting/connected/requested/spawned and its three failure arms, the shared spawn choke stamps received/gate_claimed/pty_creating/pty_created and each step between the PTY existing and the row being inserted, the exit waiter stamps the row's REMOVAL, and the poll stamps the instant it starts waiting and the instant it gives up. Every span is read MONOTONICALLY off one `Instant` per side (`elapsed`), never as a difference between two clocks, so a near-boot reading cannot underflow. AN ABSENCE IS NEVER A VERDICT: a missing outcome stamp whose PRECEDING stamps stand is a wait still in flight, while a missing outcome whose predecessors are ALSO missing is an unreadable instrument and must be reported as that — which is why the integration stage asserts every rung renders end to end through the diagnostics panel on a GREEN bring-up, before any silence on a cold run is read as a fact about the launch. Gate: impl — the phase stamps on the brokered launch path, in the shared spawn choke, at the exit waiter's row removal, and either side of the bring-up ready-wait; int — a successful bring-up whose panel carries every rung of both ladders, so the instrument's silence is falsifiable rather than assumed.",
2026-08-28T09:54:46.5458856Z       "requiredStages": [
2026-08-28T09:54:46.5459085Z         "impl",
2026-08-28T09:54:46.5459234Z         "int"
2026-08-28T09:54:46.5459380Z       ],
2026-08-28T09:54:46.5459558Z       "stages": {
2026-08-28T09:54:46.5459714Z         "doc": {
2026-08-28T09:54:46.5459873Z           "complete": false,
2026-08-28T09:54:46.5460029Z           "evidence": []
2026-08-28T09:54:46.5460178Z         },
2026-08-28T09:54:46.5460325Z         "impl": {
2026-08-28T09:54:46.5460488Z           "complete": true,
2026-08-28T09:54:46.5460640Z           "evidence": [
2026-08-28T09:54:46.5460779Z             {
2026-08-28T09:54:46.5460987Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5461149Z               "line": 6340
2026-08-28T09:54:46.5461299Z             },
2026-08-28T09:54:46.5461448Z             {
2026-08-28T09:54:46.5461656Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5461810Z               "line": 7718
2026-08-28T09:54:46.5461966Z             },
2026-08-28T09:54:46.5462233Z             {
2026-08-28T09:54:46.5462434Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5462601Z               "line": 8057
2026-08-28T09:54:46.5462749Z             },
2026-08-28T09:54:46.5462901Z             {
2026-08-28T09:54:46.5463111Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:46.5463274Z               "line": 232
2026-08-28T09:54:46.5463421Z             }
2026-08-28T09:54:46.5463569Z           ]
2026-08-28T09:54:46.5463712Z         },
2026-08-28T09:54:46.5463868Z         "int": {
2026-08-28T09:54:46.5464031Z           "complete": true,
2026-08-28T09:54:46.5464187Z           "evidence": [
2026-08-28T09:54:46.5464336Z             {
2026-08-28T09:54:46.5464574Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5464732Z               "line": 737
2026-08-28T09:54:46.5464880Z             }
2026-08-28T09:54:46.5465037Z           ]
2026-08-28T09:54:46.5465179Z         },
2026-08-28T09:54:46.5465337Z         "unit": {
2026-08-28T09:54:46.5465586Z           "complete": false,
2026-08-28T09:54:46.5465766Z           "evidence": []
2026-08-28T09:54:46.5465934Z         }
2026-08-28T09:54:46.5466103Z       }
2026-08-28T09:54:46.5466256Z     },
2026-08-28T09:54:46.5466392Z     {
2026-08-28T09:54:46.5466579Z       "id": "REQ-ER-BRINGUP-PROMPT",
2026-08-28T09:54:46.5471873Z       "title": "Bare `spt rc engine-room` prompts interactively for the bring-up TOTP instead of attaching straight into the gate's refusal (ADR-0052 §2 entry UX, fast-follow grill 2026-07-30). The prompt is the preferred entry because argv is readable by other processes on the box while a code is still valid; `--code <CODE>` stays for scripted/non-interactive use with that caveat documented in its help. Prompt rules: Esc-cancel (the ceremony-overlay pattern) and ctrl-c both cancel with NO attach attempt even when the buffer holds digits; Enter submits a non-empty buffer and is inert on an empty one; only ASCII digits accumulate, length-bounded, so pasted garbage never rides into the gate and spends ledger budget; every other endpoint never sees a prompt; and a non-terminal stdin refuses with guidance naming --code rather than blocking on a pipe. Gate: doc — the ADR-0052 §2 entry-UX note; impl — the prompt behind the bare invocation, the pure key-fold kernel, and the non-terminal refusal; unit — the key-fold rules (digits-only accumulation, bound, backspace, inert-empty-Enter, submit, and both cancel paths beating a full buffer).",
2026-08-28T09:54:46.5472212Z       "requiredStages": [
2026-08-28T09:54:46.5472365Z         "doc",
2026-08-28T09:54:46.5472522Z         "impl",
2026-08-28T09:54:46.5472666Z         "unit"
2026-08-28T09:54:46.5472808Z       ],
2026-08-28T09:54:46.5472952Z       "stages": {
2026-08-28T09:54:46.5473103Z         "doc": {
2026-08-28T09:54:46.5473267Z           "complete": true,
2026-08-28T09:54:46.5473452Z           "evidence": [
2026-08-28T09:54:46.5473601Z             {
2026-08-28T09:54:46.5473849Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5474014Z               "line": 54
2026-08-28T09:54:46.5474159Z             }
2026-08-28T09:54:46.5474301Z           ]
2026-08-28T09:54:46.5474442Z         },
2026-08-28T09:54:46.5474606Z         "impl": {
2026-08-28T09:54:46.5474762Z           "complete": true,
2026-08-28T09:54:46.5474920Z           "evidence": [
2026-08-28T09:54:46.5475095Z             {
2026-08-28T09:54:46.5475283Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5475444Z               "line": 4164
2026-08-28T09:54:46.5475592Z             },
2026-08-28T09:54:46.5475749Z             {
2026-08-28T09:54:46.5475930Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5476089Z               "line": 1560
2026-08-28T09:54:46.5476235Z             },
2026-08-28T09:54:46.5476388Z             {
2026-08-28T09:54:46.5476569Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5476730Z               "line": 1859
2026-08-28T09:54:46.5477014Z             },
2026-08-28T09:54:46.5477163Z             {
2026-08-28T09:54:46.5477343Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5477487Z               "line": 1891
2026-08-28T09:54:46.5477633Z             }
2026-08-28T09:54:46.5477768Z           ]
2026-08-28T09:54:46.5477910Z         },
2026-08-28T09:54:46.5478064Z         "int": {
2026-08-28T09:54:46.5478225Z           "complete": false,
2026-08-28T09:54:46.5478388Z           "evidence": []
2026-08-28T09:54:46.5478535Z         },
2026-08-28T09:54:46.5478685Z         "unit": {
2026-08-28T09:54:46.5478845Z           "complete": true,
2026-08-28T09:54:46.5479117Z           "evidence": [
2026-08-28T09:54:46.5479271Z             {
2026-08-28T09:54:46.5479455Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5479616Z               "line": 5196
2026-08-28T09:54:46.5479763Z             }
2026-08-28T09:54:46.5479915Z           ]
2026-08-28T09:54:46.5480058Z         }
2026-08-28T09:54:46.5480200Z       }
2026-08-28T09:54:46.5480354Z     },
2026-08-28T09:54:46.5480505Z     {
2026-08-28T09:54:46.5480745Z       "id": "REQ-ER-BRINGUP-PROMPT-NAMES-SEAT",
2026-08-28T09:54:46.5488809Z       "title": "THE BRING-UP PROMPT NAMES WHAT IT IS ASKING FOR: which node's engine room is being brought up, which subnet's code will be accepted, and that a MEMBER OR ADMIN code answers it. The shipped prompt asks for a 'bring-up code for engine-room (member or admin)' and names neither the node nor the subnet (releases#71, operator-reported), which leaves the human holding an authenticator app with no way to tell WHICH of the subnets they belong to this prompt means — and on a multi-subnet node that is not a cosmetic gap, it is a guess that spends a unit of a deliberately small attempt budget. The facts are always available where the prompt runs: bare `spt rc engine-room` is LOCAL-ONLY by ratification, so the node is this node and the home subnet is on the local engine-room record. The prompt reads them THERE rather than asking the daemon, because the record is the ceremony's own output and a prompt that cannot render without a round trip is a prompt that hangs when the daemon is down. THE WORDING KEEPS BOTH KEYS: an admin seed IS a membership key (ADR-0051), so 'member or admin' is the truth and narrowing it to 'member' would make the prompt lie about a code that works. This REFINES the interaction contract in REQ-ER-BRINGUP-PROMPT rather than replacing it — Esc/ctrl-c cancel, digits-only accumulation, the bound, the inert empty Enter and the non-terminal refusal all stand unchanged and are not re-litigated here. Gate: doc — the engine-room setup guide's bring-up walkthrough showing the prompt as it renders; impl — the prompt composing node and home subnet from the local engine-room record with the member-or-admin wording; unit — the composed prompt names the node and the home subnet read from the record, an unprovisioned node's prompt still refuses honestly rather than rendering an empty subnet, and the member-or-admin wording is asserted so a later narrowing fails here.",
2026-08-28T09:54:46.5489230Z       "requiredStages": [
2026-08-28T09:54:46.5489396Z         "impl",
2026-08-28T09:54:46.5489564Z         "unit"
2026-08-28T09:54:46.5489705Z       ],
2026-08-28T09:54:46.5489864Z       "stages": {
2026-08-28T09:54:46.5490010Z         "doc": {
2026-08-28T09:54:46.5490176Z           "complete": false,
2026-08-28T09:54:46.5490337Z           "evidence": []
2026-08-28T09:54:46.5490489Z         },
2026-08-28T09:54:46.5490638Z         "impl": {
2026-08-28T09:54:46.5490813Z           "complete": true,
2026-08-28T09:54:46.5490981Z           "evidence": [
2026-08-28T09:54:46.5491128Z             {
2026-08-28T09:54:46.5491314Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5491472Z               "line": 1842
2026-08-28T09:54:46.5491624Z             },
2026-08-28T09:54:46.5491772Z             {
2026-08-28T09:54:46.5491962Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5492121Z               "line": 1860
2026-08-28T09:54:46.5492393Z             }
2026-08-28T09:54:46.5492535Z           ]
2026-08-28T09:54:46.5492681Z         },
2026-08-28T09:54:46.5492834Z         "int": {
2026-08-28T09:54:46.5492998Z           "complete": false,
2026-08-28T09:54:46.5493157Z           "evidence": []
2026-08-28T09:54:46.5493303Z         },
2026-08-28T09:54:46.5493476Z         "unit": {
2026-08-28T09:54:46.5493642Z           "complete": true,
2026-08-28T09:54:46.5493805Z           "evidence": [
2026-08-28T09:54:46.5493961Z             {
2026-08-28T09:54:46.5494153Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5494310Z               "line": 5236
2026-08-28T09:54:46.5494449Z             }
2026-08-28T09:54:46.5494601Z           ]
2026-08-28T09:54:46.5494754Z         }
2026-08-28T09:54:46.5494901Z       }
2026-08-28T09:54:46.5495055Z     },
2026-08-28T09:54:46.5495206Z     {
2026-08-28T09:54:46.5495389Z       "id": "REQ-ER-BRINGUP-SPAWNS-SESSION",
2026-08-28T09:54:46.5531890Z       "title": "Passing the engine room's bring-up gate BRINGS THE ENGINE ROOM UP: the node spawns its session through the adapter bound at the ceremony, and the operator's attach then lands on it. Today it does not, and the endpoint is entirely inaccessible (releases#71, operator-reported): the ceremony provisions a record, the gate is complete and correct, and NOTHING ANYWHERE SPAWNS THE SESSION — `BringUp::Admitted` briefs and returns proceed, and the attach falls through to the ordinary no-live-session refusal. THE SPAWN LIVES DAEMON-SIDE (ruled): the broker owns hosting, so a client-side spawn would replicate hosting logic in the CLI and race the attach that follows it; the daemon already launches harnesses on its own behalf at autostart, which is the shipped precedent for the mechanism and for its threading. The attach that follows the spawn WAITS FOR READY UNDER A BOUND — a wait with no bound turns a broken adapter into a hung terminal, and no wait at all reintroduces the same no-live-session refusal one race later. THE ENTRY POINT IS PART OF THIS REQUIREMENT AND IS STATED HERE BECAUSE IT IS WHERE THE DEFECT ACTUALLY BITES: with no session hosted, `spt rc engine-room` never subscribes at all — it resolves no local session, resolves no owning node for an endpoint that is deliberately never advertised, and returns the reported 'No live session' before any code reaches the daemon, so the typed code is verified NOWHERE and the Admitted arm is unreachable in exactly the flow the operator ran. A fix that adds a spawn leg to that arm without giving a session-less bring-up a way to reach the gate closes nothing. VERIFICATION STAYS DAEMON-SIDE WHEREVER THE ENTRY LANDS: the adversary in this threat model is an agent on the box, which can speak the broker's IPC and never run a line of the CLI, so a client-side check is a courtesy and the rule must be evaluated where the session is hosted. THE ENTRY IS AN ADDITIVE BROKER REQUEST carrying the code (ruled): the daemon runs the same classifier it already owns, spawns on admit, and replies the session the operator then attaches to. Additive is the ADR-0001-safe shape, and an N-1 broker that does not know the verb answers unknown — WHICH THE CLIENT REPORTS HONESTLY IN THE OPERATOR'S OWN WORDS, naming the version skew, and NEVER falls through silently to the resolve path that produces the very no-live-session refusal this requirement exists to kill. The spawn RUNS OFF THE REQUEST HANDLER on its own thread, following the autostart replay's shipped shape, because the launch dials the broker as a client and must not run inline inside the handler serving that request. THE GATE IS SPENT ONCE PER BRING-UP, and the deciding argument is NOT budget arithmetic but the TOTP WINDOW RACE: the bounded spawn wait can outlive the ±1 ceremony window, so a code re-presented at the following subscribe can be REFUSED by the same gate that just admitted it — charging the human a ledger failure and rebuilding gate-admits-then-attach-refuses one seam later, which is the exact shape #71 exists to kill. The admitted bring-up therefore mints a SINGLE-USE ADMIT TICKET for the subscribe that seats the controller: a random secret of at least 128 bits, returned in the reply, SCOPED TO THE SESSION ID the bring-up spawned, and EXPIRING 30 SECONDS AFTER THE REPLY. A CONNECTION-KEYED exemption was ruled first and is STRUCTURALLY UNREDEEMABLE at this topology, which is why the key is a ticket and why that is stated here rather than left as an implementation choice: an rc attach opens a net stream, and the subscribe that seats the controller is sent by the DISPATCHER'S OWN broker connection, never by the connection that asked for the bring-up, so the two connection ids can never match and a conn-keyed exemption could never fire at all. The key must be the thing that actually crosses the seam, and the attach's code field is already the end-to-end pipe for exactly this class of secret, so the ticket rides that field behind a reserved `admit:` prefix and no new wire field appears. THE PREFIX IS RESERVED OUT OF THE TOTP PATH STRUCTURALLY: a prefixed string is never evaluated as a code guess, because an expired ticket is not a wrong guess and must not spend a unit of the human's attempt budget — which also stops anyone on the box from ratcheting the human toward a backoff by replaying a dead ticket. The ticket is consumed BY PRESENTATION rather than by success, so a second presentation is refused even inside its window and a ticket presented for another session is spent as it is refused; expired, already-spent, wrong-session and never-minted all answer ONE uniform sentence, so a caller learns only that this string does not seat it and never whether an admit is outstanding. The TTL starts at the REPLY — after the spawn, after the bounded wait — so it covers only the client's attach turnaround and never a harness start. Entropy, TTL and single use are the ticket's whole defense, because the field it rides spends no ledger. EXEMPTION PRECEDENCE, ADDED FOR releases#203 (doyle ruling 2026-08-20): the seated-connection re-serve exemption is evaluated BEFORE the presented ticket, and that ORDER is part of the requirement rather than an implementation detail — because the ticket this requirement mints is SINGLE-USE and the connection it seats re-presents it on every re-subscribe. With the ticket matched first, a gap resume or dispatcher reconstruction of a ticket-seated controller answered `Unredeemed` and the refusal UNSEATED the human mid-session; the seat this requirement exists to establish was then lost to the very credential that established it, and the exemption was structurally unreachable for any re-serve carrying its spent ticket. Measured on golden 32341702157 (Linux leg): seat on a redeemed ticket, the SAME conn re-serving ~700ms later with `req_gen` unchanged, `engine-room-admit-unredeemed`, `session-detach was_controller=true`. Latent since the ticket shipped and first witnessed by a new e2e, not by a report — the availability half of this requirement had no same-connection witness at all. THE ORDER IS NOT A WIDENING, and the reason belongs in the requirement because it is what makes the precedence safe to state: the exemption's discriminant is the seated CONNECTION id, which belongs to another process's socket and cannot be claimed by asking, so the only attach it admits on a spent ticket is one arriving on the connection ALREADY SEATED — granted nothing it does not already hold, and dying with that connection. A ticket presented by any other connection still meets the match and is refused on its own merits, ledger untouched. Gate: doc — the engine-room setup guide's bring-up section, stating that the first bring-up spawns the session and what a bounded wait failing looks like; impl — the daemon-side spawn on admit through the ceremony-bound adapter, the bounded wait-for-ready, and the session-less entry path that carries the code to the gate; unit — an admitted bring-up spawns exactly once through the BOUND adapter, a refused one spawns nothing, a bring-up over an already-live session spawns no second session, the wait's bound is proven to be a bound (an adapter that never reports ready ends in a typed failure rather than a hang), one bring-up spends exactly one ledger attempt, the admit ticket is proven to seat the controller ACROSS THE REAL TWO-CONNECTION TOPOLOGY (the row that would have caught a conn-keyed exemption before it shipped), a SECOND presentation of the same ticket is refused, an EXPIRED ticket is refused WITH THE ATTEMPT LEDGER UNTOUCHED, a ticket presented for a DIFFERENT session is refused, and every non-redeeming presentation answers the SAME sentence so the refusal discloses nothing, a SPENT ticket re-presented by the connection that is ALREADY SEATED keeps that seat (the same-connection gap-resume row, pinned by an explicit conn-id assertion and a FIXED attach generation so a fresh-connection re-serve cannot masquerade as it), and that same spent ticket presented by a DIFFERENT connection is still refused with the ledger untouched (the non-widening control, without which deleting the refusal arm outright would satisfy the row above); int — a provisioned engine room with a registered adapter comes up end to end from the invocation the operator runs and the controller is seated on the session that was spawned.",
2026-08-28T09:54:46.5532531Z       "requiredStages": [
2026-08-28T09:54:46.5532696Z         "impl",
2026-08-28T09:54:46.5532849Z         "unit",
2026-08-28T09:54:46.5532996Z         "int"
2026-08-28T09:54:46.5533150Z       ],
2026-08-28T09:54:46.5533301Z       "stages": {
2026-08-28T09:54:46.5533456Z         "doc": {
2026-08-28T09:54:46.5533621Z           "complete": false,
2026-08-28T09:54:46.5533789Z           "evidence": []
2026-08-28T09:54:46.5533945Z         },
2026-08-28T09:54:46.5534099Z         "impl": {
2026-08-28T09:54:46.5534265Z           "complete": true,
2026-08-28T09:54:46.5534424Z           "evidence": [
2026-08-28T09:54:46.5534575Z             {
2026-08-28T09:54:46.5534776Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5534936Z               "line": 135
2026-08-28T09:54:46.5535210Z             },
2026-08-28T09:54:46.5535464Z             {
2026-08-28T09:54:46.5535679Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5535864Z               "line": 608
2026-08-28T09:54:46.5536026Z             },
2026-08-28T09:54:46.5536173Z             {
2026-08-28T09:54:46.5536374Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5536522Z               "line": 1135
2026-08-28T09:54:46.5536680Z             },
2026-08-28T09:54:46.5536832Z             {
2026-08-28T09:54:46.5537037Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5537200Z               "line": 1608
2026-08-28T09:54:46.5537342Z             },
2026-08-28T09:54:46.5537495Z             {
2026-08-28T09:54:46.5537694Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5537909Z               "line": 1633
2026-08-28T09:54:46.5538052Z             },
2026-08-28T09:54:46.5542173Z             {
2026-08-28T09:54:46.5542468Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5542636Z               "line": 1651
2026-08-28T09:54:46.5542793Z             },
2026-08-28T09:54:46.5542939Z             {
2026-08-28T09:54:46.5543162Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5543319Z               "line": 1687
2026-08-28T09:54:46.5543476Z             },
2026-08-28T09:54:46.5543629Z             {
2026-08-28T09:54:46.5543833Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5544001Z               "line": 1810
2026-08-28T09:54:46.5544143Z             },
2026-08-28T09:54:46.5544297Z             {
2026-08-28T09:54:46.5544491Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5544650Z               "line": 2787
2026-08-28T09:54:46.5544797Z             },
2026-08-28T09:54:46.5544955Z             {
2026-08-28T09:54:46.5545251Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5545406Z               "line": 5124
2026-08-28T09:54:46.5545559Z             },
2026-08-28T09:54:46.5546029Z             {
2026-08-28T09:54:46.5546230Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5546376Z               "line": 5261
2026-08-28T09:54:46.5546525Z             },
2026-08-28T09:54:46.5546658Z             {
2026-08-28T09:54:46.5546873Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5547029Z               "line": 5753
2026-08-28T09:54:46.5547183Z             },
2026-08-28T09:54:46.5547335Z             {
2026-08-28T09:54:46.5547527Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5547687Z               "line": 6141
2026-08-28T09:54:46.5547837Z             },
2026-08-28T09:54:46.5547983Z             {
2026-08-28T09:54:46.5548185Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5548345Z               "line": 6154
2026-08-28T09:54:46.5548503Z             },
2026-08-28T09:54:46.5548650Z             {
2026-08-28T09:54:46.5548860Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5549132Z               "line": 7583
2026-08-28T09:54:46.5549284Z             },
2026-08-28T09:54:46.5549433Z             {
2026-08-28T09:54:46.5549637Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5549799Z               "line": 7594
2026-08-28T09:54:46.5549947Z             },
2026-08-28T09:54:46.5550105Z             {
2026-08-28T09:54:46.5550300Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5550461Z               "line": 7624
2026-08-28T09:54:46.5550604Z             },
2026-08-28T09:54:46.5550760Z             {
2026-08-28T09:54:46.5550954Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5551113Z               "line": 7631
2026-08-28T09:54:46.5551269Z             },
2026-08-28T09:54:46.5551413Z             {
2026-08-28T09:54:46.5551612Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5551879Z               "line": 8276
2026-08-28T09:54:46.5552032Z             },
2026-08-28T09:54:46.5552184Z             {
2026-08-28T09:54:46.5552385Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5552547Z               "line": 300
2026-08-28T09:54:46.5552709Z             },
2026-08-28T09:54:46.5552862Z             {
2026-08-28T09:54:46.5553057Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5553220Z               "line": 323
2026-08-28T09:54:46.5553371Z             },
2026-08-28T09:54:46.5553523Z             {
2026-08-28T09:54:46.5553717Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5553884Z               "line": 1316
2026-08-28T09:54:46.5554031Z             },
2026-08-28T09:54:46.5554189Z             {
2026-08-28T09:54:46.5554370Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5554533Z               "line": 2392
2026-08-28T09:54:46.5554685Z             },
2026-08-28T09:54:46.5554828Z             {
2026-08-28T09:54:46.5555009Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5555163Z               "line": 2422
2026-08-28T09:54:46.5555313Z             }
2026-08-28T09:54:46.5555458Z           ]
2026-08-28T09:54:46.5555614Z         },
2026-08-28T09:54:46.5555773Z         "int": {
2026-08-28T09:54:46.5555934Z           "complete": true,
2026-08-28T09:54:46.5556095Z           "evidence": [
2026-08-28T09:54:46.5556232Z             {
2026-08-28T09:54:46.5556489Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5556645Z               "line": 266
2026-08-28T09:54:46.5556799Z             }
2026-08-28T09:54:46.5556951Z           ]
2026-08-28T09:54:46.5557114Z         },
2026-08-28T09:54:46.5557275Z         "unit": {
2026-08-28T09:54:46.5557438Z           "complete": true,
2026-08-28T09:54:46.5557590Z           "evidence": [
2026-08-28T09:54:46.5557739Z             {
2026-08-28T09:54:46.5557947Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5558110Z               "line": 13536
2026-08-28T09:54:46.5558383Z             },
2026-08-28T09:54:46.5558534Z             {
2026-08-28T09:54:46.5558736Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5558895Z               "line": 13753
2026-08-28T09:54:46.5559130Z             },
2026-08-28T09:54:46.5559281Z             {
2026-08-28T09:54:46.5559477Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5559635Z               "line": 13858
2026-08-28T09:54:46.5559783Z             },
2026-08-28T09:54:46.5559930Z             {
2026-08-28T09:54:46.5560130Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5560284Z               "line": 13982
2026-08-28T09:54:46.5560436Z             },
2026-08-28T09:54:46.5560575Z             {
2026-08-28T09:54:46.5560764Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5560923Z               "line": 14092
2026-08-28T09:54:46.5561074Z             },
2026-08-28T09:54:46.5561226Z             {
2026-08-28T09:54:46.5561429Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5561601Z               "line": 14435
2026-08-28T09:54:46.5561748Z             }
2026-08-28T09:54:46.5561901Z           ]
2026-08-28T09:54:46.5562053Z         }
2026-08-28T09:54:46.5562207Z       }
2026-08-28T09:54:46.5562354Z     },
2026-08-28T09:54:46.5562502Z     {
2026-08-28T09:54:46.5562687Z       "id": "REQ-ER-BRINGUP-TOTP-GATE",
2026-08-28T09:54:46.5568289Z       "title": "Bringing the engine room online — and attaching a controller to it — requires a same-node CLI call PLUS a member-or-admin TOTP for its home subnet, and never OS elevation (ADR-0052 decision 2). The gate proves 'a human holding this subnet's material is at the controls', which is the question that matters for a surface that sets access posture; elevation proves only 'a process on this machine ran elevated', which every agent-spawned installer path can arrange and which says nothing about subnet authority. Either seed passes because an admin key IS a membership key (ADR-0051), and the two-acceptable-secrets budget is answered by REQ-ER-BRINGUP-ATTEMPT-BOUND rather than by refusing the admin key. Bring-up FAILS CLOSED when the bound harness adapter is missing — an engine room that cannot host its own mind must not come online half-formed (ADR-0053 spirit). Gate: doc — ADR-0052 decision 2 and the CONTEXT.md engine-room bring-up sentence; impl — the same-node CLI bring-up path, local verification of the member and admin TOTP against the replicated seeds, and the missing-adapter refusal; unit — a member code brings it up, an admin code brings it up, a wrong code refuses, elevation alone never substitutes, and a missing bound adapter refuses.",
2026-08-28T09:54:46.5568595Z       "requiredStages": [
2026-08-28T09:54:46.5568750Z         "doc",
2026-08-28T09:54:46.5568905Z         "impl",
2026-08-28T09:54:46.5569128Z         "unit"
2026-08-28T09:54:46.5569276Z       ],
2026-08-28T09:54:46.5569436Z       "stages": {
2026-08-28T09:54:46.5569589Z         "doc": {
2026-08-28T09:54:46.5569765Z           "complete": true,
2026-08-28T09:54:46.5569924Z           "evidence": [
2026-08-28T09:54:46.5570075Z             {
2026-08-28T09:54:46.5570334Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5570485Z               "line": 40
2026-08-28T09:54:46.5570642Z             }
2026-08-28T09:54:46.5570790Z           ]
2026-08-28T09:54:46.5570943Z         },
2026-08-28T09:54:46.5571091Z         "impl": {
2026-08-28T09:54:46.5571254Z           "complete": true,
2026-08-28T09:54:46.5571420Z           "evidence": [
2026-08-28T09:54:46.5571564Z             {
2026-08-28T09:54:46.5571767Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.5571923Z               "line": 397
2026-08-28T09:54:46.5572074Z             },
2026-08-28T09:54:46.5572219Z             {
2026-08-28T09:54:46.5572423Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.5572581Z               "line": 924
2026-08-28T09:54:46.5572738Z             },
2026-08-28T09:54:46.5572999Z             {
2026-08-28T09:54:46.5573200Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.5573362Z               "line": 1424
2026-08-28T09:54:46.5573505Z             },
2026-08-28T09:54:46.5573658Z             {
2026-08-28T09:54:46.5573853Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5574012Z               "line": 1574
2026-08-28T09:54:46.5574162Z             },
2026-08-28T09:54:46.5574307Z             {
2026-08-28T09:54:46.5574515Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5574667Z               "line": 1609
2026-08-28T09:54:46.5574822Z             },
2026-08-28T09:54:46.5574966Z             {
2026-08-28T09:54:46.5575166Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5575314Z               "line": 1807
2026-08-28T09:54:46.5575466Z             },
2026-08-28T09:54:46.5575619Z             {
2026-08-28T09:54:46.5575823Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5575982Z               "line": 4199
2026-08-28T09:54:46.5576124Z             },
2026-08-28T09:54:46.5576321Z             {
2026-08-28T09:54:46.5576588Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5576749Z               "line": 8286
2026-08-28T09:54:46.5576893Z             },
2026-08-28T09:54:46.5577049Z             {
2026-08-28T09:54:46.5577249Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.5577409Z               "line": 608
2026-08-28T09:54:46.5577561Z             },
2026-08-28T09:54:46.5577709Z             {
2026-08-28T09:54:46.5577914Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:46.5578099Z               "line": 120
2026-08-28T09:54:46.5578253Z             },
2026-08-28T09:54:46.5578395Z             {
2026-08-28T09:54:46.5578610Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:46.5578901Z               "line": 182
2026-08-28T09:54:46.5579135Z             },
2026-08-28T09:54:46.5579292Z             {
2026-08-28T09:54:46.5579498Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5579649Z               "line": 353
2026-08-28T09:54:46.5579799Z             },
2026-08-28T09:54:46.5579954Z             {
2026-08-28T09:54:46.5580154Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5580316Z               "line": 383
2026-08-28T09:54:46.5580464Z             },
2026-08-28T09:54:46.5580612Z             {
2026-08-28T09:54:46.5580803Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5580955Z               "line": 4183
2026-08-28T09:54:46.5581103Z             },
2026-08-28T09:54:46.5581251Z             {
2026-08-28T09:54:46.5581433Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5581599Z               "line": 1533
2026-08-28T09:54:46.5581738Z             }
2026-08-28T09:54:46.5581894Z           ]
2026-08-28T09:54:46.5582048Z         },
2026-08-28T09:54:46.5582199Z         "int": {
2026-08-28T09:54:46.5582361Z           "complete": false,
2026-08-28T09:54:46.5582520Z           "evidence": []
2026-08-28T09:54:46.5582664Z         },
2026-08-28T09:54:46.5582816Z         "unit": {
2026-08-28T09:54:46.5582983Z           "complete": true,
2026-08-28T09:54:46.5583136Z           "evidence": [
2026-08-28T09:54:46.5583283Z             {
2026-08-28T09:54:46.5583484Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5583642Z               "line": 13082
2026-08-28T09:54:46.5583789Z             },
2026-08-28T09:54:46.5583937Z             {
2026-08-28T09:54:46.5584132Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5584295Z               "line": 14448
2026-08-28T09:54:46.5584447Z             },
2026-08-28T09:54:46.5584591Z             {
2026-08-28T09:54:46.5584790Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:46.5584944Z               "line": 502
2026-08-28T09:54:46.5585104Z             },
2026-08-28T09:54:46.5585360Z             {
2026-08-28T09:54:46.5585574Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5585731Z               "line": 922
2026-08-28T09:54:46.5585884Z             },
2026-08-28T09:54:46.5586036Z             {
2026-08-28T09:54:46.5586237Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5586393Z               "line": 983
2026-08-28T09:54:46.5586542Z             }
2026-08-28T09:54:46.5586689Z           ]
2026-08-28T09:54:46.5586833Z         }
2026-08-28T09:54:46.5586980Z       }
2026-08-28T09:54:46.5587124Z     },
2026-08-28T09:54:46.5587271Z     {
2026-08-28T09:54:46.5587453Z       "id": "REQ-ER-CEREMONY-VERB",
2026-08-28T09:54:46.5594401Z       "title": "The engine-room ceremony is invocable: `spt endpoint engine-room <subnet> --adapter <id>` runs the one create/reset code path (`provision_at`), reporting Created against an absent record and Reset against a present one (ADR-0052 §4a, fast-follow grill 2026-07-30). Before this verb the ceremony had ZERO production call sites — a user could not set an engine room up at all. Its gates, in refusal order: BOTH arms refuse invocation by an SPT agent, detected on env markers AND on process ancestry against the broker-hosted sessions' recorded pids (defense-in-depth in front of both arms, never a substitute for the reset elevation gate; ancestry powers only this REFUSAL, never a grant — the direction that keeps the F-024 ancestry-for-auth parking intact); an unjoined subnet refuses (no seeds to verify a bring-up code against later); an unregistered adapter refuses (bring-up fails closed on it anyway — fail at bind time instead); then creation (absent record) proceeds UNELEVATED — bootstrap friction ruled to outweigh pre-emption, the window closes permanently at the first run, docs say run the ceremony early — while reset (present record) requires confirmed OS elevation, with Unknown refusing like the purge gate. Gate: doc — ADR-0052 §4a; impl — the verb, the pure ceremony decision, the two-layer agent detection, and the provision_at call; unit — the decision table pinning agent-deny-beats-elevation on both arms, bind-time refusals before the arm split, create-unelevated across every elevation, and reset refusing on NotElevated and Unknown alike.",
2026-08-28T09:54:46.5594721Z       "requiredStages": [
2026-08-28T09:54:46.5594874Z         "doc",
2026-08-28T09:54:46.5595036Z         "impl",
2026-08-28T09:54:46.5595180Z         "unit"
2026-08-28T09:54:46.5595336Z       ],
2026-08-28T09:54:46.5595485Z       "stages": {
2026-08-28T09:54:46.5595635Z         "doc": {
2026-08-28T09:54:46.5595798Z           "complete": true,
2026-08-28T09:54:46.5595957Z           "evidence": [
2026-08-28T09:54:46.5596101Z             {
2026-08-28T09:54:46.5596353Z               "path": "docs-site/src/networking/engine-room-setup.md",
2026-08-28T09:54:46.5596506Z               "line": 3
2026-08-28T09:54:46.5596653Z             },
2026-08-28T09:54:46.5596812Z             {
2026-08-28T09:54:46.5597049Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5597211Z               "line": 297
2026-08-28T09:54:46.5597359Z             }
2026-08-28T09:54:46.5597516Z           ]
2026-08-28T09:54:46.5597664Z         },
2026-08-28T09:54:46.5597822Z         "impl": {
2026-08-28T09:54:46.5597984Z           "complete": true,
2026-08-28T09:54:46.5598137Z           "evidence": [
2026-08-28T09:54:46.5598292Z             {
2026-08-28T09:54:46.5598472Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5598638Z               "line": 23726
2026-08-28T09:54:46.5598787Z             },
2026-08-28T09:54:46.5599040Z             {
2026-08-28T09:54:46.5599215Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5599378Z               "line": 23814
2026-08-28T09:54:46.5599525Z             },
2026-08-28T09:54:46.5599669Z             {
2026-08-28T09:54:46.5599849Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5600003Z               "line": 23828
2026-08-28T09:54:46.5600270Z             }
2026-08-28T09:54:46.5600416Z           ]
2026-08-28T09:54:46.5600566Z         },
2026-08-28T09:54:46.5600712Z         "int": {
2026-08-28T09:54:46.5600876Z           "complete": false,
2026-08-28T09:54:46.5601041Z           "evidence": []
2026-08-28T09:54:46.5601193Z         },
2026-08-28T09:54:46.5601347Z         "unit": {
2026-08-28T09:54:46.5601508Z           "complete": true,
2026-08-28T09:54:46.5601661Z           "evidence": [
2026-08-28T09:54:46.5601807Z             {
2026-08-28T09:54:46.5601990Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5602142Z               "line": 26289
2026-08-28T09:54:46.5602290Z             }
2026-08-28T09:54:46.5602437Z           ]
2026-08-28T09:54:46.5602581Z         }
2026-08-28T09:54:46.5602729Z       }
2026-08-28T09:54:46.5602873Z     },
2026-08-28T09:54:46.5603024Z     {
2026-08-28T09:54:46.5603211Z       "id": "REQ-ER-CONTROLLER-BOUND-POSTURE",
2026-08-28T09:54:46.5608910Z       "title": "The engine room is empowered ONLY while a controller is attached, and losing that controller drops its POSTURE — not its process (ADR-0052 decision 3, as amended 2026-07-29 on todlando's finding). Read literally, 'detach drops it offline' would kill a harness on detach and re-break the attach-lifecycle invariant (KNOWN-HAZARDS: an rc detach ends only the viewport, the harness keeps running and stays re-attachable — an invariant the broker's PTY ownership satisfies by construction). The buildable and equally strong reading is a posture: on detach the engine room refuses all inbound, drops every empowerment (REQ-SUBNET-EMPOWER-VERB), and stops being advertised, while the process lives and can be re-attached through the same TOTP gate. Empowerment is therefore session state with TWO named drop edges — detach and local take — each of which needs its own test; 'revoked by a restart' is not an available argument, because no restart happens (REQ-ER-RC-INTENT-LOCKS). Gate: doc — the ADR-0052 section 3a amendment; impl — the posture transition on detach and on take, covering inbound refusal, empowerment drop and de-advertisement, with no process teardown; unit — both drop edges revoke empowerments, a detached engine room refuses inbound, and neither edge terminates the hosted session.",
2026-08-28T09:54:46.5609299Z       "requiredStages": [
2026-08-28T09:54:46.5609456Z         "doc",
2026-08-28T09:54:46.5609605Z         "impl",
2026-08-28T09:54:46.5609751Z         "unit"
2026-08-28T09:54:46.5609896Z       ],
2026-08-28T09:54:46.5610052Z       "stages": {
2026-08-28T09:54:46.5610201Z         "doc": {
2026-08-28T09:54:46.5610362Z           "complete": true,
2026-08-28T09:54:46.5610510Z           "evidence": [
2026-08-28T09:54:46.5610663Z             {
2026-08-28T09:54:46.5610916Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5611068Z               "line": 161
2026-08-28T09:54:46.5611221Z             }
2026-08-28T09:54:46.5611368Z           ]
2026-08-28T09:54:46.5611522Z         },
2026-08-28T09:54:46.5611668Z         "impl": {
2026-08-28T09:54:46.5611840Z           "complete": true,
2026-08-28T09:54:46.5611996Z           "evidence": [
2026-08-28T09:54:46.5612140Z             {
2026-08-28T09:54:46.5612344Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5612498Z               "line": 1075
2026-08-28T09:54:46.5612649Z             },
2026-08-28T09:54:46.5612794Z             {
2026-08-28T09:54:46.5612993Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5613146Z               "line": 2409
2026-08-28T09:54:46.5613298Z             },
2026-08-28T09:54:46.5613452Z             {
2026-08-28T09:54:46.5613656Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5613814Z               "line": 254
2026-08-28T09:54:46.5613955Z             },
2026-08-28T09:54:46.5614107Z             {
2026-08-28T09:54:46.5614315Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5614478Z               "line": 266
2026-08-28T09:54:46.5614625Z             },
2026-08-28T09:54:46.5614887Z             {
2026-08-28T09:54:46.5615083Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5615239Z               "line": 421
2026-08-28T09:54:46.5615393Z             },
2026-08-28T09:54:46.5615545Z             {
2026-08-28T09:54:46.5615789Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5615942Z               "line": 437
2026-08-28T09:54:46.5616094Z             }
2026-08-28T09:54:46.5616223Z           ]
2026-08-28T09:54:46.5616375Z         },
2026-08-28T09:54:46.5616533Z         "int": {
2026-08-28T09:54:46.5616718Z           "complete": false,
2026-08-28T09:54:46.5616879Z           "evidence": []
2026-08-28T09:54:46.5617026Z         },
2026-08-28T09:54:46.5617182Z         "unit": {
2026-08-28T09:54:46.5617335Z           "complete": true,
2026-08-28T09:54:46.5617502Z           "evidence": [
2026-08-28T09:54:46.5617646Z             {
2026-08-28T09:54:46.5617860Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5618032Z               "line": 14675
2026-08-28T09:54:46.5618179Z             },
2026-08-28T09:54:46.5618327Z             {
2026-08-28T09:54:46.5618528Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5618694Z               "line": 1033
2026-08-28T09:54:46.5618843Z             },
2026-08-28T09:54:46.5619080Z             {
2026-08-28T09:54:46.5619285Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5619451Z               "line": 1052
2026-08-28T09:54:46.5619598Z             },
2026-08-28T09:54:46.5619744Z             {
2026-08-28T09:54:46.5619945Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5620102Z               "line": 1082
2026-08-28T09:54:46.5620260Z             }
2026-08-28T09:54:46.5620402Z           ]
2026-08-28T09:54:46.5620560Z         }
2026-08-28T09:54:46.5620712Z       }
2026-08-28T09:54:46.5620964Z     },
2026-08-28T09:54:46.5621109Z     {
2026-08-28T09:54:46.5621313Z       "id": "REQ-ER-GRANT-ANNOUNCE-AFTER-ATTACH",
2026-08-28T09:54:46.5631110Z       "title": "A GRANT LINE DESCRIBING A CONTROLLER THAT NEVER ATTACHED MUST BE IMPOSSIBLE (ratified 2026-08-04 bag grill, releases#142): the engine room's bring-up announces empowerment — and spools the briefing that states it — only AFTER the controller's attach is established, never at the moment the session merely exists. Field-reported: the operator read 'the engine room is up; taking its controls. <grant line>' and then, seconds later, 'no live session for engine-room' — nothing lied about the session, the sentence claimed a CONTROLLER. The seam is precise and is what this requirement is about: the bring-up waits for the broker's own session table (the fact the attach needs), which is necessary and NOT SUFFICIENT — the controller is seated later, by a subscribe carrying the single-use admit ticket, arriving on the dispatcher's connection. releases#102's below-the-grant move was the right direction with the wrong stop: it moved the briefing below the GRANT, not below the SEAT. THE BRIEFING IS NAMED EXPLICITLY AND NOT ONLY THE PRINTED LINE, because they fail together and a fix that defers only the visible sentence leaves the seat holding a briefing that describes an empowerment for a controller that never arrived — the worse half, since the session reads it as fact about itself. The post-seat settlement already exists for the OTHER entry (an attach or take against an already-hosted engine room settles after the seat ladder resolves, grants only for a taken seat, and returns its sentence as the seat note the human reads before any session output); this requirement makes the bring-up complete through THAT path rather than through a second one. Gate: doc — the CONTEXT.md engine-room lifecycle sentence, ratified 2026-08-04; impl — the bring-up's announce and briefing composed on the post-seat side of the attach seam; unit — bring-up admitted but the admit ticket never redeemed (subscribe never arrives, or its TTL expires) leaves NO empowerment written, NO briefing spooled and NO grant sentence anywhere, while a confirmed seat produces all three exactly once, and a MEMBER-credential bring-up seats its controller while granting nothing (the discrimination that must survive wherever the settlement moves).",
2026-08-28T09:54:46.5631425Z       "requiredStages": [
2026-08-28T09:54:46.5631583Z         "doc",
2026-08-28T09:54:46.5631731Z         "impl",
2026-08-28T09:54:46.5631883Z         "unit"
2026-08-28T09:54:46.5632031Z       ],
2026-08-28T09:54:46.5632178Z       "stages": {
2026-08-28T09:54:46.5632328Z         "doc": {
2026-08-28T09:54:46.5632488Z           "complete": true,
2026-08-28T09:54:46.5632642Z           "evidence": [
2026-08-28T09:54:46.5632788Z             {
2026-08-28T09:54:46.5632965Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5633121Z               "line": 859
2026-08-28T09:54:46.5633275Z             }
2026-08-28T09:54:46.5633431Z           ]
2026-08-28T09:54:46.5633580Z         },
2026-08-28T09:54:46.5633741Z         "impl": {
2026-08-28T09:54:46.5633900Z           "complete": true,
2026-08-28T09:54:46.5634061Z           "evidence": [
2026-08-28T09:54:46.5634205Z             {
2026-08-28T09:54:46.5634409Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5634568Z               "line": 1635
2026-08-28T09:54:46.5634723Z             },
2026-08-28T09:54:46.5634883Z             {
2026-08-28T09:54:46.5635080Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5635237Z               "line": 1718
2026-08-28T09:54:46.5635383Z             },
2026-08-28T09:54:46.5635541Z             {
2026-08-28T09:54:46.5635735Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5635894Z               "line": 1765
2026-08-28T09:54:46.5636046Z             },
2026-08-28T09:54:46.5636194Z             {
2026-08-28T09:54:46.5636394Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5636656Z               "line": 2277
2026-08-28T09:54:46.5636814Z             },
2026-08-28T09:54:46.5636966Z             {
2026-08-28T09:54:46.5637171Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5637324Z               "line": 6259
2026-08-28T09:54:46.5637477Z             },
2026-08-28T09:54:46.5637629Z             {
2026-08-28T09:54:46.5637820Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5638052Z               "line": 6414
2026-08-28T09:54:46.5638198Z             },
2026-08-28T09:54:46.5638350Z             {
2026-08-28T09:54:46.5638541Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5638709Z               "line": 6441
2026-08-28T09:54:46.5638855Z             }
2026-08-28T09:54:46.5639090Z           ]
2026-08-28T09:54:46.5639241Z         },
2026-08-28T09:54:46.5639395Z         "int": {
2026-08-28T09:54:46.5639561Z           "complete": true,
2026-08-28T09:54:46.5639715Z           "evidence": [
2026-08-28T09:54:46.5639871Z             {
2026-08-28T09:54:46.5640105Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5640268Z               "line": 1507
2026-08-28T09:54:46.5640415Z             }
2026-08-28T09:54:46.5640566Z           ]
2026-08-28T09:54:46.5640722Z         },
2026-08-28T09:54:46.5640879Z         "unit": {
2026-08-28T09:54:46.5641047Z           "complete": true,
2026-08-28T09:54:46.5641203Z           "evidence": [
2026-08-28T09:54:46.5641356Z             {
2026-08-28T09:54:46.5641547Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5641714Z               "line": 12858
2026-08-28T09:54:46.5641862Z             },
2026-08-28T09:54:46.5642014Z             {
2026-08-28T09:54:46.5642210Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5642367Z               "line": 12948
2026-08-28T09:54:46.5642516Z             },
2026-08-28T09:54:46.5642667Z             {
2026-08-28T09:54:46.5642873Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5643030Z               "line": 14297
2026-08-28T09:54:46.5643315Z             }
2026-08-28T09:54:46.5643467Z           ]
2026-08-28T09:54:46.5643616Z         }
2026-08-28T09:54:46.5643767Z       }
2026-08-28T09:54:46.5643911Z     },
2026-08-28T09:54:46.5644068Z     {
2026-08-28T09:54:46.5644240Z       "id": "REQ-ER-INBOUND-LOCK",
2026-08-28T09:54:46.5649330Z       "title": "The engine room refuses ALL inbound except replies to its own outbound, with a dormant knock exemption landed in the same seam (ADR-0052 decision 3; doyle ruling (f) 2026-07-29). The lock is what keeps a minded governance surface from being reachable — and therefore promptable — by the very agents whose access it governs; the reply exemption is the stateful-firewall correlation that already precedes the resolution chain, which the engine room itself depends on to hold a conversation it started. The knock hook lands NOW rather than in the knocking wave because accepting knocks is part of the lock's shape as specced, and a security-critical seam reworked twice is a seam whose second version is reviewed against the first instead of against the requirement; W3's hook default-refuses, W4 fills it with knock semantics. Gate: doc — ADR-0052 decision 3 and the CONTEXT.md engine-room entry; impl — the inbound lock riding the reply-exemption seam plus the dormant knock hook; unit — a reply to its own outbound passes, an unsolicited inbound of every other shape is refused, and the dormant hook refuses today without a knock surface.",
2026-08-28T09:54:46.5649526Z       "requiredStages": [
2026-08-28T09:54:46.5649679Z         "doc",
2026-08-28T09:54:46.5649831Z         "impl",
2026-08-28T09:54:46.5649974Z         "unit"
2026-08-28T09:54:46.5650117Z       ],
2026-08-28T09:54:46.5650265Z       "stages": {
2026-08-28T09:54:46.5650422Z         "doc": {
2026-08-28T09:54:46.5650585Z           "complete": true,
2026-08-28T09:54:46.5650737Z           "evidence": [
2026-08-28T09:54:46.5650890Z             {
2026-08-28T09:54:46.5651240Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5651405Z               "line": 135
2026-08-28T09:54:46.5651554Z             }
2026-08-28T09:54:46.5651696Z           ]
2026-08-28T09:54:46.5651850Z         },
2026-08-28T09:54:46.5652002Z         "impl": {
2026-08-28T09:54:46.5652164Z           "complete": true,
2026-08-28T09:54:46.5652326Z           "evidence": [
2026-08-28T09:54:46.5652479Z             {
2026-08-28T09:54:46.5652674Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5652836Z               "line": 415
2026-08-28T09:54:46.5652989Z             },
2026-08-28T09:54:46.5653137Z             {
2026-08-28T09:54:46.5653332Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5653485Z               "line": 441
2026-08-28T09:54:46.5653637Z             }
2026-08-28T09:54:46.5653786Z           ]
2026-08-28T09:54:46.5653936Z         },
2026-08-28T09:54:46.5654085Z         "int": {
2026-08-28T09:54:46.5654255Z           "complete": false,
2026-08-28T09:54:46.5654419Z           "evidence": []
2026-08-28T09:54:46.5654561Z         },
2026-08-28T09:54:46.5654715Z         "unit": {
2026-08-28T09:54:46.5654876Z           "complete": true,
2026-08-28T09:54:46.5655034Z           "evidence": [
2026-08-28T09:54:46.5655177Z             {
2026-08-28T09:54:46.5655377Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.5655534Z               "line": 864
2026-08-28T09:54:46.5655683Z             },
2026-08-28T09:54:46.5655835Z             {
2026-08-28T09:54:46.5656035Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.5656196Z               "line": 911
2026-08-28T09:54:46.5656344Z             },
2026-08-28T09:54:46.5656494Z             {
2026-08-28T09:54:46.5656685Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.5656842Z               "line": 943
2026-08-28T09:54:46.5656995Z             },
2026-08-28T09:54:46.5657151Z             {
2026-08-28T09:54:46.5657362Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.5657634Z               "line": 2302
2026-08-28T09:54:46.5657795Z             }
2026-08-28T09:54:46.5657944Z           ]
2026-08-28T09:54:46.5658096Z         }
2026-08-28T09:54:46.5658338Z       }
2026-08-28T09:54:46.5658488Z     },
2026-08-28T09:54:46.5658639Z     {
2026-08-28T09:54:46.5658836Z       "id": "REQ-ER-INBOUND-LOCK-ALL-PATHS",
2026-08-28T09:54:46.5686662Z       "title": "THE ENGINE ROOM'S INBOUND LOCK REACHES EVERY SPT-AUTHORED DELIVERY PATH, NOT ONLY THE WIRE. The lock itself (REQ-ER-INBOUND-LOCK) was never wrong: it sits at step 0 of the access chain, ahead of the same-node allow, and its own comment names an agent on this very node as the adversary it exists for. The defect was that no locally-authored delivery ever ASKED it. A census of every path terminating in a local delivery (releases#209, measured at c62904e7) found 17 paths and exactly 2 consulting the chain — `wan::receive_wan` and `dispatch::answer_presence_probe`, both wire-inbound — while `crates/spt/src` and `crates/spt-msg/src` between them contained ZERO occurrences of `access_check`, `InboundClass` or `classify_inbound`. The bypass was therefore WIDER than the filing's 'a same-node agent send': `spt ring`, the subnet notify, the API-side drain and the relay listener are each an independent arm to the same three termini (the shared PTY-inject leg, `deliver_tcp`, and the spool). THE FIX IS ONE GATE SITE, and it is a site rather than a restated rule because a rule with N call sites is a rule that will disagree with itself at the seam nobody re-read — this codebase already says so at `engineroom.rs`'s reserved-id predicate, for the same reason. `spt_store::gate::admit_local_delivery` is that site, and it LIVES IN `spt-store` FOR A STRUCTURAL REASON THAT IS PART OF THE REQUIREMENT: `spt-msg` authors local delivery and cannot see `spt-daemon`, so a function beside `wan::deliver_admitted` would have been unreachable from half the paths it exists to gate. THE GATE IS AT ADMISSION, NEVER AT DRAIN, and the engine room's own session briefing is what decides it: that briefing is daemon-authored and self-addressed, spooled straight onto the ER perch under a reserved author, so a drain-time gate would refuse the engine room its own briefing. Admission-time exempts it for free because that writer never crosses the function — AND THAT EXEMPTION IS THE CALL PATH, NEVER A ROW FIELD, so a send merely CLAIMING briefing authorship is gated on its merits like any other. Two further facts settle admission-vs-drain: a spooled row carries no admission stamp and a locally-spooled one has nothing to re-derive an origin from, and a WAN row is already claimed exactly-once by `op_id`, so re-checking at drain would re-open a settled decision and evaporate a row admitted while the posture was Online if the controller detached before the tick. THE GATE ASKS WHETHER THE TARGET RESOLVES TO THE ENGINE-ROOM PERCH, NOT WHETHER IT IS SPELLED LIKE IT. `is_engine_room` is an exact compare, correct for every caller asking about the NAME; it is the wrong question for a gate, because delivery routes by resolving an id to a perch. MEASURED on NTFS 2026-08-22: create `engine-room`, and `Engine-Room` names the same directory — that spelling misses the broker's session table (which does compare exactly), falls to the spool keyed by resolved perch path, and the drain delivers it, so the bypass would have survived its own fix. The predicate compares canonicalized paths and mints NO canonicalizer of its own: imitating the filesystem's case rule would be a second reading of one truth and would be WRONG on Linux, where the other spelling is a genuinely different perch with no engine room at it. The unresolvable arms are declared rather than left to fall out: the exact spelling is checked first and needs no filesystem, so the reserved id is caught with no perch on disk at all; a target that does not canonicalize is not the ER, because nothing is there for a delivery to land on; and an ER perch that does not canonicalize means no engine room is provisioned, for which the posture read behind the predicate is independently fail-closed. THE REPLY EXEMPTION MUST SURVIVE ON THE LOCAL PATH, and pre-fix it could not have: `classify_inbound` correlates against `RecentOutbound`, whose only production writer was `note_outbound` at ONE call site on the WAN outbound leg, so a locally-authored send recorded nothing and every local reply to the engine room would have classified Unsolicited and been refused — the engine room able to ask a local agent a question and structurally unable to hear the answer. The admission site records the local outbound half, on an ADMITTED send only: a refusal is not contact and must not earn a reply window. A LOCAL REFUSAL NAMES ITS ORIGIN IN WORDS rather than printing this node's own key hex, which on the local path reads as a wire arrival and sends the reader hunting a peer that does not exist. SCOPE, STATED RATHER THAN IMPLIED, and the published claim is amended to match: admission runs in the AUTHORING process, so an old or modified binary, a direct write into the spool database, or a raw TCP connect to a relay listener never meets it. Same-user local code is outside what any spt gate holds; the claim is scoped to spt-authored delivery paths, and the TOCTOU between the gate's path resolution and the delivery's own falls under the same boundary. UPGRADE BOUNDARY: rows spooled before the flip carry no admission stamp and drain ungated exactly once. Gate: impl — the admission function, the resolve-based ER predicate, the local `note_outbound` half, the local-origin refusal text, and the scope amendment on the published claim; unit — the resolution fact (both spellings reach one perch, asserted as RESOLUTION rather than as platform behaviour so the cell stays portable), the briefing-authorship forgery negative (a local send wearing the reserved author is still refused), and the unresolvable arms; int — an unsolicited local send to the engine room refused with the lock's own diagnostic where pre-fix it delivered, the engine room's question to a local agent answered (reply exemption alive on the local path, loud arm silent on it), and the hole-punch negatives: ordinary endpoint-to-endpoint local sends still deliver, and still deliver with a subnet-scoped DENY rule and a closed node mode in the store. Kin REQ-ER-INBOUND-LOCK (the lock this reaches), REQ-SEC-1 (the reply exemption it must not break), REQ-ACL-LOCAL-ORIGIN-TIERS (the axis it runs on).",
2026-08-28T09:54:46.5687262Z       "requiredStages": [
2026-08-28T09:54:46.5687424Z         "impl",
2026-08-28T09:54:46.5687558Z         "unit",
2026-08-28T09:54:46.5687716Z         "int"
2026-08-28T09:54:46.5687871Z       ],
2026-08-28T09:54:46.5688033Z       "stages": {
2026-08-28T09:54:46.5688179Z         "doc": {
2026-08-28T09:54:46.5688347Z           "complete": false,
2026-08-28T09:54:46.5688512Z           "evidence": []
2026-08-28T09:54:46.5688657Z         },
2026-08-28T09:54:46.5688808Z         "impl": {
2026-08-28T09:54:46.5689047Z           "complete": true,
2026-08-28T09:54:46.5689219Z           "evidence": [
2026-08-28T09:54:46.5689367Z             {
2026-08-28T09:54:46.5689582Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:46.5689743Z               "line": 219
2026-08-28T09:54:46.5689897Z             },
2026-08-28T09:54:46.5690053Z             {
2026-08-28T09:54:46.5690245Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.5690406Z               "line": 210
2026-08-28T09:54:46.5690550Z             },
2026-08-28T09:54:46.5690701Z             {
2026-08-28T09:54:46.5690900Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5691060Z               "line": 442
2026-08-28T09:54:46.5691204Z             },
2026-08-28T09:54:46.5691356Z             {
2026-08-28T09:54:46.5691553Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5691708Z               "line": 523
2026-08-28T09:54:46.5691862Z             },
2026-08-28T09:54:46.5692009Z             {
2026-08-28T09:54:46.5692219Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5692496Z               "line": 543
2026-08-28T09:54:46.5692653Z             },
2026-08-28T09:54:46.5692797Z             {
2026-08-28T09:54:46.5692996Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5693164Z               "line": 604
2026-08-28T09:54:46.5693310Z             },
2026-08-28T09:54:46.5693463Z             {
2026-08-28T09:54:46.5693641Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5693804Z               "line": 11221
2026-08-28T09:54:46.5693956Z             },
2026-08-28T09:54:46.5694110Z             {
2026-08-28T09:54:46.5694285Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5694453Z               "line": 11451
2026-08-28T09:54:46.5694604Z             },
2026-08-28T09:54:46.5694753Z             {
2026-08-28T09:54:46.5694934Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5695087Z               "line": 11759
2026-08-28T09:54:46.5695249Z             }
2026-08-28T09:54:46.5695392Z           ]
2026-08-28T09:54:46.5695544Z         },
2026-08-28T09:54:46.5695693Z         "int": {
2026-08-28T09:54:46.5695863Z           "complete": true,
2026-08-28T09:54:46.5696022Z           "evidence": [
2026-08-28T09:54:46.5696182Z             {
2026-08-28T09:54:46.5696463Z               "path": "crates/spt-daemon/tests/er_inbound_local_notify.rs",
2026-08-28T09:54:46.5696616Z               "line": 62
2026-08-28T09:54:46.5696768Z             },
2026-08-28T09:54:46.5696922Z             {
2026-08-28T09:54:46.5697164Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5697327Z               "line": 384
2026-08-28T09:54:46.5697474Z             },
2026-08-28T09:54:46.5697628Z             {
2026-08-28T09:54:46.5697837Z               "path": "crates/spt/tests/er_inbound_local.rs",
2026-08-28T09:54:46.5698003Z               "line": 112
2026-08-28T09:54:46.5698146Z             }
2026-08-28T09:54:46.5698417Z           ]
2026-08-28T09:54:46.5698565Z         },
2026-08-28T09:54:46.5698725Z         "unit": {
2026-08-28T09:54:46.5698897Z           "complete": true,
2026-08-28T09:54:46.5699135Z           "evidence": [
2026-08-28T09:54:46.5699288Z             {
2026-08-28T09:54:46.5699489Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5699654Z               "line": 636
2026-08-28T09:54:46.5699808Z             },
2026-08-28T09:54:46.5699964Z             {
2026-08-28T09:54:46.5700161Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.5700322Z               "line": 669
2026-08-28T09:54:46.5700476Z             }
2026-08-28T09:54:46.5700618Z           ]
2026-08-28T09:54:46.5700777Z         }
2026-08-28T09:54:46.5700918Z       }
2026-08-28T09:54:46.5701067Z     },
2026-08-28T09:54:46.5701223Z     {
2026-08-28T09:54:46.5701399Z       "id": "REQ-ER-NOT-ADVERTISED",
2026-08-28T09:54:46.5706472Z       "title": "The engine room is NOT registry-advertised by default, and is advertised only to endpoints it has whitelisted (ADR-0052 decision 3). An advertised governance surface is a discoverable one, and discoverability is the first half of every reach attempt the inbound lock then has to refuse; keeping it out of the feed means the agents on a node cannot even name the thing that governs them unless it has chosen to be nameable to them. This rides W1's DISCOVER gate rather than minting a parallel visibility notion — one advertisement filter, one place to reason about who sees what. De-advertisement is part of the posture drop (REQ-ER-CONTROLLER-BOUND-POSTURE): an engine room without an attached controller is not merely unreachable but unlisted. Gate: doc — ADR-0052 decision 3; impl — the advertisement filter excluding the engine room by default and honoring its whitelist, reached through the existing DISCOVER gate; unit — a default engine room is absent from the local advertisement, a whitelisted viewer sees it, a non-whitelisted viewer does not, and a posture-dropped engine room is absent regardless of whitelist.",
2026-08-28T09:54:46.5706671Z       "requiredStages": [
2026-08-28T09:54:46.5706958Z         "doc",
2026-08-28T09:54:46.5707114Z         "impl",
2026-08-28T09:54:46.5707262Z         "unit"
2026-08-28T09:54:46.5707414Z       ],
2026-08-28T09:54:46.5707567Z       "stages": {
2026-08-28T09:54:46.5707724Z         "doc": {
2026-08-28T09:54:46.5707882Z           "complete": true,
2026-08-28T09:54:46.5708049Z           "evidence": [
2026-08-28T09:54:46.5708193Z             {
2026-08-28T09:54:46.5708445Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5708601Z               "line": 136
2026-08-28T09:54:46.5708746Z             },
2026-08-28T09:54:46.5708892Z             {
2026-08-28T09:54:46.5709209Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5709366Z               "line": 213
2026-08-28T09:54:46.5709510Z             }
2026-08-28T09:54:46.5709661Z           ]
2026-08-28T09:54:46.5709810Z         },
2026-08-28T09:54:46.5709962Z         "impl": {
2026-08-28T09:54:46.5710124Z           "complete": true,
2026-08-28T09:54:46.5710281Z           "evidence": [
2026-08-28T09:54:46.5710430Z             {
2026-08-28T09:54:46.5710634Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.5710806Z               "line": 220
2026-08-28T09:54:46.5710954Z             },
2026-08-28T09:54:46.5711111Z             {
2026-08-28T09:54:46.5711322Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.5711478Z               "line": 242
2026-08-28T09:54:46.5711632Z             },
2026-08-28T09:54:46.5711778Z             {
2026-08-28T09:54:46.5712002Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5712157Z               "line": 508
2026-08-28T09:54:46.5712310Z             },
2026-08-28T09:54:46.5712457Z             {
2026-08-28T09:54:46.5712673Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5712834Z               "line": 523
2026-08-28T09:54:46.5713082Z             },
2026-08-28T09:54:46.5713240Z             {
2026-08-28T09:54:46.5713444Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5713612Z               "line": 530
2026-08-28T09:54:46.5713759Z             },
2026-08-28T09:54:46.5713913Z             {
2026-08-28T09:54:46.5714121Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5714284Z               "line": 149
2026-08-28T09:54:46.5714439Z             },
2026-08-28T09:54:46.5714583Z             {
2026-08-28T09:54:46.5714795Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5714949Z               "line": 160
2026-08-28T09:54:46.5715105Z             },
2026-08-28T09:54:46.5715244Z             {
2026-08-28T09:54:46.5715453Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5715606Z               "line": 298
2026-08-28T09:54:46.5715754Z             },
2026-08-28T09:54:46.5715897Z             {
2026-08-28T09:54:46.5716088Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5716254Z               "line": 311
2026-08-28T09:54:46.5716403Z             }
2026-08-28T09:54:46.5716555Z           ]
2026-08-28T09:54:46.5716698Z         },
2026-08-28T09:54:46.5716851Z         "int": {
2026-08-28T09:54:46.5717018Z           "complete": false,
2026-08-28T09:54:46.5717170Z           "evidence": []
2026-08-28T09:54:46.5717321Z         },
2026-08-28T09:54:46.5720469Z         "unit": {
2026-08-28T09:54:46.5720675Z           "complete": true,
2026-08-28T09:54:46.5720832Z           "evidence": [
2026-08-28T09:54:46.5720972Z             {
2026-08-28T09:54:46.5721194Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.5721356Z               "line": 1176
2026-08-28T09:54:46.5721514Z             },
2026-08-28T09:54:46.5721671Z             {
2026-08-28T09:54:46.5721897Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.5722058Z               "line": 431
2026-08-28T09:54:46.5722212Z             },
2026-08-28T09:54:46.5722510Z             {
2026-08-28T09:54:46.5722736Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5722899Z               "line": 1786
2026-08-28T09:54:46.5723051Z             },
2026-08-28T09:54:46.5723204Z             {
2026-08-28T09:54:46.5723408Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5723566Z               "line": 899
2026-08-28T09:54:46.5723713Z             },
2026-08-28T09:54:46.5723862Z             {
2026-08-28T09:54:46.5724081Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5724233Z               "line": 1005
2026-08-28T09:54:46.5724381Z             }
2026-08-28T09:54:46.5724539Z           ]
2026-08-28T09:54:46.5724682Z         }
2026-08-28T09:54:46.5724840Z       }
2026-08-28T09:54:46.5724981Z     },
2026-08-28T09:54:46.5725129Z     {
2026-08-28T09:54:46.5725321Z       "id": "REQ-ER-OFFLINE-BRINGUP-REACHABLE",
2026-08-28T09:54:46.5738843Z       "title": "A CLEANLY-OFFLINE ENGINE ROOM IS STILL BRINGABLE THROUGH ITS OWN CEREMONY: for the engine-room endpoint class with a bring-up code in hand, the rc offline fast-fail must not preempt the bring-up dispatch, because cleanly-offline is precisely the state whose ratified entry path IS a bring-up. Field-reported (releases#142, operator): after a harness exit the operator's third `spt rc engine-room` answered 'offline — nothing to attach to' for the same verb that had brought the room up on the first attempt, leaving the seat unrevivable through the only door it has. THE EXIT PATH IS CORRECT AND IS NOT WHAT CHANGES — a harness exit leaves the endpoint cleanly offline exactly as the ratified lifecycle entry requires (`mark_offline` → `terminal_normalize`); what is wrong is the reader's precedence, and the fix is a NARROWING of one gate rather than a change to any writer. REQ-HAZARD-RC-ATTACH-FAILFAST SURVIVES VERBATIM FOR THE GENERAL POPULATION and that survival is part of this requirement rather than a side note: the guard stops a real historical infinite-blank hang for every endpoint whose broker dance would end on a dead resolve, and the engine room is the one class whose dance does NOT end there — it would bring the seat up — so the guard's population was simply never narrowed to exclude the endpoint that has a revival path. Deleting the guard, or widening the exemption past (engine-room class AND a code presented), rebuilds that hang. THE ROW VALUE IS THE DISCRIMINATOR EVERY TEST MUST CARRY EXPLICITLY (hertz's one-field falsifier, ruled binding): a fixture whose `status` row happens to be ABSENT passes against this defect and proves nothing, so both arms — row PRESENT and offline, and the same fixture with the row cleared and nothing else changed — must be asserted, and they must reach the same outcome. RIDER, SAME LANE: every refusal arm reachable by the engine-room class names the ceremony surface (`spt rc <id>`, which prompts for a member-or-admin code) as its remediation, never `spt endpoint run` — that verb is not the engine room's entry surface and the reserved-id refusal already turns it away, so the printed line sends the operator (or a reasoning agent, which will invent a route from a bare no) at the wrong door. The zombie arm carries the same class-correctness bug and is swept with it. Gate: doc — the CONTEXT.md engine-room lifecycle sentence (a harness exit leaves the endpoint cleanly offline and re-bringable through the same TOTP gate), ratified 2026-08-04 and tagged rather than re-authored; impl — the narrowed gate and the two class-correct refusal remediations; unit — the gate table carrying the row value EXPLICITLY in both arms (engine room + code reaches the bring-up dispatch with the offline row present, and again with it cleared), the general population still fast-failing on an offline row (a non-engine-room endpoint, and the engine room WITHOUT a code — the code-less reconnect re-drive must not ratchet the attempt ledger), and each swept refusal naming the ceremony surface rather than `endpoint run`.",
2026-08-28T09:54:46.5739357Z       "requiredStages": [
2026-08-28T09:54:46.5739506Z         "doc",
2026-08-28T09:54:46.5739662Z         "impl",
2026-08-28T09:54:46.5739816Z         "unit"
2026-08-28T09:54:46.5739968Z       ],
2026-08-28T09:54:46.5740122Z       "stages": {
2026-08-28T09:54:46.5740273Z         "doc": {
2026-08-28T09:54:46.5740436Z           "complete": true,
2026-08-28T09:54:46.5740587Z           "evidence": [
2026-08-28T09:54:46.5740739Z             {
2026-08-28T09:54:46.5740909Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5741075Z               "line": 859
2026-08-28T09:54:46.5741223Z             }
2026-08-28T09:54:46.5741375Z           ]
2026-08-28T09:54:46.5741533Z         },
2026-08-28T09:54:46.5741681Z         "impl": {
2026-08-28T09:54:46.5741843Z           "complete": true,
2026-08-28T09:54:46.5742000Z           "evidence": [
2026-08-28T09:54:46.5742158Z             {
2026-08-28T09:54:46.5742334Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5742496Z               "line": 1156
2026-08-28T09:54:46.5742649Z             },
2026-08-28T09:54:46.5742792Z             {
2026-08-28T09:54:46.5742979Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5743135Z               "line": 1175
2026-08-28T09:54:46.5743289Z             },
2026-08-28T09:54:46.5743431Z             {
2026-08-28T09:54:46.5743616Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5743771Z               "line": 1199
2026-08-28T09:54:46.5743923Z             },
2026-08-28T09:54:46.5744072Z             {
2026-08-28T09:54:46.5744247Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5744406Z               "line": 2393
2026-08-28T09:54:46.5744557Z             }
2026-08-28T09:54:46.5744705Z           ]
2026-08-28T09:54:46.5744853Z         },
2026-08-28T09:54:46.5745006Z         "int": {
2026-08-28T09:54:46.5745168Z           "complete": true,
2026-08-28T09:54:46.5745326Z           "evidence": [
2026-08-28T09:54:46.5745579Z             {
2026-08-28T09:54:46.5745821Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5745993Z               "line": 1698
2026-08-28T09:54:46.5746153Z             }
2026-08-28T09:54:46.5746301Z           ]
2026-08-28T09:54:46.5746447Z         },
2026-08-28T09:54:46.5746600Z         "unit": {
2026-08-28T09:54:46.5746762Z           "complete": true,
2026-08-28T09:54:46.5746924Z           "evidence": [
2026-08-28T09:54:46.5747071Z             {
2026-08-28T09:54:46.5747248Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5747415Z               "line": 3659
2026-08-28T09:54:46.5747563Z             },
2026-08-28T09:54:46.5747715Z             {
2026-08-28T09:54:46.5747887Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5748049Z               "line": 3705
2026-08-28T09:54:46.5748198Z             },
2026-08-28T09:54:46.5748350Z             {
2026-08-28T09:54:46.5748536Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5748693Z               "line": 3730
2026-08-28T09:54:46.5748851Z             }
2026-08-28T09:54:46.5749073Z           ]
2026-08-28T09:54:46.5749221Z         }
2026-08-28T09:54:46.5749369Z       }
2026-08-28T09:54:46.5749518Z     },
2026-08-28T09:54:46.5749664Z     {
2026-08-28T09:54:46.5749842Z       "id": "REQ-ER-PURGE-RESETS",
2026-08-28T09:54:46.5754627Z       "title": "`endpoint purge` against the engine room RESETS it rather than deleting it, and requires OS elevation to do so (ADR-0052 decision 4). Reset-not-delete is what keeps 'one engine room per node' structural: a node from which the engine room can be deleted is a node that can be left with no governance surface at all, and the recovery path would then be a create verb — the very thing REQ-ER-RESERVED-ENDPOINT removes. Elevation is the right gate HERE (unlike bring-up, REQ-ER-BRINGUP-TOTP-GATE) because the ceremony sets node-scope facts — the home subnet and the bound harness adapter — and because it must work at bootstrap, when the node holds no subnet material to prove a TOTP against. The reset is the ONLY way to change either fact. Gate: doc — ADR-0052 decision 4; impl — the engine-room arm of the purge path, its elevation requirement, and the reset outcome distinct from the delete outcome; unit — the purge decision table (engine room plus elevation yields reset, engine room unelevated refuses, an ordinary endpoint is unaffected) and a reset record retaining its reserved identity.",
2026-08-28T09:54:46.5754932Z       "requiredStages": [
2026-08-28T09:54:46.5755079Z         "doc",
2026-08-28T09:54:46.5755233Z         "impl",
2026-08-28T09:54:46.5755375Z         "unit"
2026-08-28T09:54:46.5755524Z       ],
2026-08-28T09:54:46.5755666Z       "stages": {
2026-08-28T09:54:46.5755819Z         "doc": {
2026-08-28T09:54:46.5755990Z           "complete": true,
2026-08-28T09:54:46.5756139Z           "evidence": [
2026-08-28T09:54:46.5756290Z             {
2026-08-28T09:54:46.5756539Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5756704Z               "line": 285
2026-08-28T09:54:46.5756852Z             }
2026-08-28T09:54:46.5757007Z           ]
2026-08-28T09:54:46.5757151Z         },
2026-08-28T09:54:46.5757307Z         "impl": {
2026-08-28T09:54:46.5757470Z           "complete": true,
2026-08-28T09:54:46.5757627Z           "evidence": [
2026-08-28T09:54:46.5757780Z             {
2026-08-28T09:54:46.5757989Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5758151Z               "line": 187
2026-08-28T09:54:46.5758300Z             },
2026-08-28T09:54:46.5758448Z             {
2026-08-28T09:54:46.5758653Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5758858Z               "line": 216
2026-08-28T09:54:46.5759087Z             },
2026-08-28T09:54:46.5759234Z             {
2026-08-28T09:54:46.5759434Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5759585Z               "line": 226
2026-08-28T09:54:46.5760106Z             },
2026-08-28T09:54:46.5760244Z             {
2026-08-28T09:54:46.5760439Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5760588Z               "line": 23908
2026-08-28T09:54:46.5760740Z             },
2026-08-28T09:54:46.5760893Z             {
2026-08-28T09:54:46.5761074Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5761222Z               "line": 23917
2026-08-28T09:54:46.5761373Z             },
2026-08-28T09:54:46.5761522Z             {
2026-08-28T09:54:46.5761702Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5761859Z               "line": 23970
2026-08-28T09:54:46.5762010Z             },
2026-08-28T09:54:46.5762157Z             {
2026-08-28T09:54:46.5762362Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:46.5762515Z               "line": 222
2026-08-28T09:54:46.5762672Z             }
2026-08-28T09:54:46.5762816Z           ]
2026-08-28T09:54:46.5762964Z         },
2026-08-28T09:54:46.5763106Z         "int": {
2026-08-28T09:54:46.5763283Z           "complete": false,
2026-08-28T09:54:46.5763445Z           "evidence": []
2026-08-28T09:54:46.5763593Z         },
2026-08-28T09:54:46.5763750Z         "unit": {
2026-08-28T09:54:46.5763907Z           "complete": true,
2026-08-28T09:54:46.5764065Z           "evidence": [
2026-08-28T09:54:46.5764213Z             {
2026-08-28T09:54:46.5764400Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5764556Z               "line": 26350
2026-08-28T09:54:46.5764712Z             },
2026-08-28T09:54:46.5764863Z             {
2026-08-28T09:54:46.5765039Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5765197Z               "line": 26382
2026-08-28T09:54:46.5765344Z             }
2026-08-28T09:54:46.5765497Z           ]
2026-08-28T09:54:46.5765648Z         }
2026-08-28T09:54:46.5765802Z       }
2026-08-28T09:54:46.5765944Z     },
2026-08-28T09:54:46.5766098Z     {
2026-08-28T09:54:46.5766269Z       "id": "REQ-ER-RC-INTENT-LOCKS",
2026-08-28T09:54:46.5772000Z       "title": "The engine room's attach surface is locked by INTENT: rc --view is denied even same-node, remote attach of any intent is denied, and local --take is allowed (ADR-0052 decision 3). Viewing is denied because a read-only spectator on the surface that renders access rulesets is an information leak with no operator benefit — and because the same-node loopback allow precedes the resolution chain, this must be an explicit engine-room carve-out rather than a rule row that the loopback shortcut would skip past. Local take is allowed on two grounds, neither of them the original 'it forces a harness restart' (it does not — a take is a broker lease displacement and restarts nothing): the displacing controller must pass the same bring-up gate the incumbent passed, so a take is a gate attempt and is bounded by the same ledger (REQ-ER-BRINGUP-ATTEMPT-BOUND); and the displacement is LOUD, so an incumbent human cannot be silently unseated. Gate: doc — ADR-0052 decision 3 and the section 3a amendment; impl — the intent-keyed engine-room carve-out ahead of the chain, the remote-attach refusal, and the take path's gate pass plus empowerment revocation; unit — same-node view denied, remote attach denied for every intent, local take admitted only after a gate pass, and a take revoking empowerments.",
2026-08-28T09:54:46.5772320Z       "requiredStages": [
2026-08-28T09:54:46.5772477Z         "doc",
2026-08-28T09:54:46.5772622Z         "impl",
2026-08-28T09:54:46.5772780Z         "unit"
2026-08-28T09:54:46.5772922Z       ],
2026-08-28T09:54:46.5773080Z       "stages": {
2026-08-28T09:54:46.5773232Z         "doc": {
2026-08-28T09:54:46.5773395Z           "complete": true,
2026-08-28T09:54:46.5773557Z           "evidence": [
2026-08-28T09:54:46.5773705Z             {
2026-08-28T09:54:46.5773957Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5774110Z               "line": 162
2026-08-28T09:54:46.5774267Z             }
2026-08-28T09:54:46.5774411Z           ]
2026-08-28T09:54:46.5774678Z         },
2026-08-28T09:54:46.5774829Z         "impl": {
2026-08-28T09:54:46.5775003Z           "complete": true,
2026-08-28T09:54:46.5775163Z           "evidence": [
2026-08-28T09:54:46.5775315Z             {
2026-08-28T09:54:46.5775527Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.5775680Z               "line": 91
2026-08-28T09:54:46.5775832Z             },
2026-08-28T09:54:46.5775972Z             {
2026-08-28T09:54:46.5776185Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5776348Z               "line": 1504
2026-08-28T09:54:46.5776495Z             },
2026-08-28T09:54:46.5776648Z             {
2026-08-28T09:54:46.5776843Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5777011Z               "line": 2922
2026-08-28T09:54:46.5777153Z             },
2026-08-28T09:54:46.5777307Z             {
2026-08-28T09:54:46.5777517Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5777683Z               "line": 422
2026-08-28T09:54:46.5777839Z             },
2026-08-28T09:54:46.5777986Z             {
2026-08-28T09:54:46.5778170Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5778333Z               "line": 1239
2026-08-28T09:54:46.5778480Z             }
2026-08-28T09:54:46.5778629Z           ]
2026-08-28T09:54:46.5778781Z         },
2026-08-28T09:54:46.5778924Z         "int": {
2026-08-28T09:54:46.5779177Z           "complete": false,
2026-08-28T09:54:46.5779348Z           "evidence": []
2026-08-28T09:54:46.5779497Z         },
2026-08-28T09:54:46.5779644Z         "unit": {
2026-08-28T09:54:46.5779807Z           "complete": true,
2026-08-28T09:54:46.5779963Z           "evidence": [
2026-08-28T09:54:46.5780113Z             {
2026-08-28T09:54:46.5780317Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.5780479Z               "line": 1051
2026-08-28T09:54:46.5780625Z             },
2026-08-28T09:54:46.5780782Z             {
2026-08-28T09:54:46.5780982Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5781255Z               "line": 14610
2026-08-28T09:54:46.5781403Z             },
2026-08-28T09:54:46.5781560Z             {
2026-08-28T09:54:46.5781770Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5781936Z               "line": 1052
2026-08-28T09:54:46.5782095Z             },
2026-08-28T09:54:46.5782241Z             {
2026-08-28T09:54:46.5782428Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.5782584Z               "line": 3829
2026-08-28T09:54:46.5782734Z             }
2026-08-28T09:54:46.5782880Z           ]
2026-08-28T09:54:46.5783032Z         }
2026-08-28T09:54:46.5783177Z       }
2026-08-28T09:54:46.5783330Z     },
2026-08-28T09:54:46.5783478Z     {
2026-08-28T09:54:46.5783659Z       "id": "REQ-ER-RESERVED-ENDPOINT",
2026-08-28T09:54:46.5788564Z       "title": "A node has exactly ONE engine-room endpoint, and 'exactly one' is STRUCTURAL rather than policed: the engine room lives at a reserved per-node endpoint id, so a second one cannot be created any more than a directory can hold two entries of the same name (ADR-0052 decision 1). It is an ordinary agent endpoint in substrate — harness-adapter-backed, spt-hosted, minded, so it can be briefed on and reason about the node's access posture — and an extraordinary one in lifecycle: its home subnet and its bound harness adapter are settable ONLY through the create/reset ceremony (REQ-ER-PURGE-RESETS), never by an ordinary endpoint edit. Creation IS that ceremony run against an empty record — one code path, so a creation that skipped a lock a reset applies cannot exist. Gate: doc — ADR-0052 decision 1 and the CONTEXT.md engine-room entry; impl — the reserved id, the engine-room record with its home subnet and bound adapter, and the single create/reset code path; unit — the reserved id resolves to at most one record, creation and reset run the same path, and an ordinary endpoint mutation cannot change the bound adapter or home subnet.",
2026-08-28T09:54:46.5788860Z       "requiredStages": [
2026-08-28T09:54:46.5789099Z         "doc",
2026-08-28T09:54:46.5789260Z         "impl",
2026-08-28T09:54:46.5789409Z         "unit"
2026-08-28T09:54:46.5789561Z       ],
2026-08-28T09:54:46.5789714Z       "stages": {
2026-08-28T09:54:46.5789861Z         "doc": {
2026-08-28T09:54:46.5790023Z           "complete": true,
2026-08-28T09:54:46.5790176Z           "evidence": [
2026-08-28T09:54:46.5790324Z             {
2026-08-28T09:54:46.5790566Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5790725Z               "line": 26
2026-08-28T09:54:46.5790867Z             }
2026-08-28T09:54:46.5791021Z           ]
2026-08-28T09:54:46.5791171Z         },
2026-08-28T09:54:46.5791324Z         "impl": {
2026-08-28T09:54:46.5791481Z           "complete": true,
2026-08-28T09:54:46.5791639Z           "evidence": [
2026-08-28T09:54:46.5791791Z             {
2026-08-28T09:54:46.5791997Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5792163Z               "line": 47
2026-08-28T09:54:46.5792306Z             },
2026-08-28T09:54:46.5792463Z             {
2026-08-28T09:54:46.5792664Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5792820Z               "line": 58
2026-08-28T09:54:46.5792974Z             },
2026-08-28T09:54:46.5793126Z             {
2026-08-28T09:54:46.5793327Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5793478Z               "line": 186
2026-08-28T09:54:46.5793630Z             },
2026-08-28T09:54:46.5793799Z             {
2026-08-28T09:54:46.5794001Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.5794162Z               "line": 253
2026-08-28T09:54:46.5794310Z             }
2026-08-28T09:54:46.5794457Z           ]
2026-08-28T09:54:46.5794606Z         },
2026-08-28T09:54:46.5794758Z         "int": {
2026-08-28T09:54:46.5794916Z           "complete": false,
2026-08-28T09:54:46.5795082Z           "evidence": []
2026-08-28T09:54:46.5795222Z         },
2026-08-28T09:54:46.5795493Z         "unit": {
2026-08-28T09:54:46.5795664Z           "complete": true,
2026-08-28T09:54:46.5795818Z           "evidence": [
2026-08-28T09:54:46.5795964Z             {
2026-08-28T09:54:46.5796171Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5796340Z               "line": 843
2026-08-28T09:54:46.5796516Z             }
2026-08-28T09:54:46.5796667Z           ]
2026-08-28T09:54:46.5796811Z         }
2026-08-28T09:54:46.5796957Z       }
2026-08-28T09:54:46.5797107Z     },
2026-08-28T09:54:46.5797248Z     {
2026-08-28T09:54:46.5797459Z       "id": "REQ-ER-RESERVED-ID-SPAWN-REFUSAL",
2026-08-28T09:54:46.5810304Z       "title": "THE ENGINE ROOM'S ID IS RESERVED AT EVERY VERB THAT MINTS AN IDENTITY, and this is a BYPASS rather than a naming nit (ruled): `spt endpoint run engine-room` mints the engine-room identity and hosts a session under it WITHOUT EVER PASSING THE TOTP GATE, because the gate guards the ATTACH and not the NAME. An agent on the box that can spawn the reserved id owns the surface that sets the node's access posture, which is precisely the authority the bring-up ceremony exists to price. Every spawn-family verb therefore refuses the reserved id outright and NAMES `spt rc engine-room` AS THE ONLY ENTRY, so the refusal teaches the correct path instead of inviting a workaround — a reasoning agent told only 'no' invents a route, which is the prescribe-then-mislead lesson turned around. THE REFUSAL GETS A CANARY UNIT PER SITE, and that is required evidence rather than diligence: a capability limit that lives only in prose or only in a prompt is not a limit, and the canary is what makes the prohibition tool-layer-enforced (the standing lesson from the strike-and-amend class). THE FAMILY IS WIDER THAN THE VERB THE REPORT NAMED, and enumerating it is part of the requirement because a refusal at one door with the rest left open reads as closed while remaining open: the direct `endpoint run` path; the interactive picker's create-new entry, which never passes through that path's arguments; the `--save` startup default, which PERSISTS a bypass that then replays with no gate at every daemon start, so it is refused at save AND skipped loudly at replay; and the identity-minting listener verb, which binds the reserved id to a perch with no harness and no gate at all — IN because the stated harm is minting the identity without the gate, and the engine room has exactly ONE entry, its bring-up. THE FAMILY CLOSES BY ENUMERATION RATHER THAN BY THE SITES ANYONE HAPPENED TO NAME: the whole id-minting and spawn-dispatch surface is swept before the refusals are written and the site COUNT is reported with the refusal list, so a site that exists but was not thought of fails the sweep rather than shipping open. A site that cannot refuse is named in the evidence rather than left silent. THE PERSISTED-DEFAULT ARM CARRIES ITS OWN ROW, because a record written BEFORE this fix already exists on real nodes: refusing at save alone leaves those replaying ungated at every daemon start, so the replay arm must skip a pre-existing reserved-id default loudly and be tested against one. Gate: doc — the reference help for the refusing verbs and the engine-room guide's entry sentence; impl — the reserved-id refusal at every enumerated site, each naming `spt rc engine-room`; unit — a canary per site asserting the reserved id is refused and NOTHING is minted, spawned, persisted or replayed, that the refusal names the bring-up entry, that a PRE-EXISTING persisted reserved-id default is skipped loudly at replay, and that an ordinary id is unaffected at the same site.",
2026-08-28T09:54:46.5810614Z       "requiredStages": [
2026-08-28T09:54:46.5810771Z         "impl",
2026-08-28T09:54:46.5810919Z         "unit"
2026-08-28T09:54:46.5811072Z       ],
2026-08-28T09:54:46.5811220Z       "stages": {
2026-08-28T09:54:46.5811367Z         "doc": {
2026-08-28T09:54:46.5811535Z           "complete": false,
2026-08-28T09:54:46.5811691Z           "evidence": []
2026-08-28T09:54:46.5811850Z         },
2026-08-28T09:54:46.5812107Z         "impl": {
2026-08-28T09:54:46.5812277Z           "complete": true,
2026-08-28T09:54:46.5812429Z           "evidence": [
2026-08-28T09:54:46.5812587Z             {
2026-08-28T09:54:46.5812797Z               "path": "crates/spt-daemon/src/autostart.rs",
2026-08-28T09:54:46.5812959Z               "line": 79
2026-08-28T09:54:46.5813108Z             },
2026-08-28T09:54:46.5813245Z             {
2026-08-28T09:54:46.5813450Z               "path": "crates/spt-daemon/src/forkop.rs",
2026-08-28T09:54:46.5813607Z               "line": 78
2026-08-28T09:54:46.5813756Z             },
2026-08-28T09:54:46.5813898Z             {
2026-08-28T09:54:46.5814094Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:46.5814342Z               "line": 72
2026-08-28T09:54:46.5814598Z             },
2026-08-28T09:54:46.5814830Z             {
2026-08-28T09:54:46.5815039Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.5815192Z               "line": 728
2026-08-28T09:54:46.5815331Z             },
2026-08-28T09:54:46.5815483Z             {
2026-08-28T09:54:46.5815684Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.5815845Z               "line": 781
2026-08-28T09:54:46.5815979Z             },
2026-08-28T09:54:46.5816126Z             {
2026-08-28T09:54:46.5816342Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5816489Z               "line": 82
2026-08-28T09:54:46.5816647Z             },
2026-08-28T09:54:46.5816799Z             {
2026-08-28T09:54:46.5817009Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5817166Z               "line": 167
2026-08-28T09:54:46.5817329Z             },
2026-08-28T09:54:46.5817474Z             {
2026-08-28T09:54:46.5817674Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5817830Z               "line": 211
2026-08-28T09:54:46.5817973Z             },
2026-08-28T09:54:46.5818241Z             {
2026-08-28T09:54:46.5818449Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.5818613Z               "line": 908
2026-08-28T09:54:46.5818759Z             },
2026-08-28T09:54:46.5818909Z             {
2026-08-28T09:54:46.5819204Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.5819361Z               "line": 1094
2026-08-28T09:54:46.5819509Z             },
2026-08-28T09:54:46.5819651Z             {
2026-08-28T09:54:46.5819829Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5819979Z               "line": 3950
2026-08-28T09:54:46.5820137Z             },
2026-08-28T09:54:46.5820282Z             {
2026-08-28T09:54:46.5820468Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5820625Z               "line": 4106
2026-08-28T09:54:46.5820769Z             },
2026-08-28T09:54:46.5820917Z             {
2026-08-28T09:54:46.5821094Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5821255Z               "line": 4459
2026-08-28T09:54:46.5821399Z             },
2026-08-28T09:54:46.5821556Z             {
2026-08-28T09:54:46.5821733Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5821894Z               "line": 23566
2026-08-28T09:54:46.5822048Z             },
2026-08-28T09:54:46.5822199Z             {
2026-08-28T09:54:46.5822411Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.5822561Z               "line": 1028
2026-08-28T09:54:46.5822716Z             }
2026-08-28T09:54:46.5822861Z           ]
2026-08-28T09:54:46.5823009Z         },
2026-08-28T09:54:46.5823156Z         "int": {
2026-08-28T09:54:46.5823319Z           "complete": false,
2026-08-28T09:54:46.5823471Z           "evidence": []
2026-08-28T09:54:46.5823629Z         },
2026-08-28T09:54:46.5823782Z         "unit": {
2026-08-28T09:54:46.5823944Z           "complete": true,
2026-08-28T09:54:46.5824106Z           "evidence": [
2026-08-28T09:54:46.5824249Z             {
2026-08-28T09:54:46.5824468Z               "path": "crates/spt-daemon/src/autostart.rs",
2026-08-28T09:54:46.5824739Z               "line": 275
2026-08-28T09:54:46.5824893Z             },
2026-08-28T09:54:46.5825044Z             {
2026-08-28T09:54:46.5825249Z               "path": "crates/spt-daemon/src/forkop.rs",
2026-08-28T09:54:46.5825409Z               "line": 166
2026-08-28T09:54:46.5825561Z             },
2026-08-28T09:54:46.5825714Z             {
2026-08-28T09:54:46.5825900Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:46.5826057Z               "line": 293
2026-08-28T09:54:46.5826211Z             },
2026-08-28T09:54:46.5826353Z             {
2026-08-28T09:54:46.5826582Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.5826734Z               "line": 2367
2026-08-28T09:54:46.5826887Z             },
2026-08-28T09:54:46.5827030Z             {
2026-08-28T09:54:46.5827245Z               "path": "crates/spt-store/src/engineroom.rs",
2026-08-28T09:54:46.5827397Z               "line": 875
2026-08-28T09:54:46.5827630Z             },
2026-08-28T09:54:46.5827851Z             {
2026-08-28T09:54:46.5828058Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:46.5828210Z               "line": 885
2026-08-28T09:54:46.5828361Z             },
2026-08-28T09:54:46.5828515Z             {
2026-08-28T09:54:46.5828705Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.5828867Z               "line": 2313
2026-08-28T09:54:46.5829087Z             },
2026-08-28T09:54:46.5829239Z             {
2026-08-28T09:54:46.5829440Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.5829597Z               "line": 2367
2026-08-28T09:54:46.5829755Z             },
2026-08-28T09:54:46.5829897Z             {
2026-08-28T09:54:46.5830084Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5830241Z               "line": 3031
2026-08-28T09:54:46.5830389Z             },
2026-08-28T09:54:46.5830535Z             {
2026-08-28T09:54:46.5830843Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5831000Z               "line": 3149
2026-08-28T09:54:46.5831148Z             },
2026-08-28T09:54:46.5831310Z             {
2026-08-28T09:54:46.5831505Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.5831663Z               "line": 1752
2026-08-28T09:54:46.5831811Z             }
2026-08-28T09:54:46.5831964Z           ]
2026-08-28T09:54:46.5832111Z         }
2026-08-28T09:54:46.5832264Z       }
2026-08-28T09:54:46.5832421Z     },
2026-08-28T09:54:46.5832564Z     {
2026-08-28T09:54:46.5832759Z       "id": "REQ-ER-ROLE-STATIC-IMMUTABLE",
2026-08-28T09:54:46.5844282Z       "title": "The engine room's role is a STATIC, IMMUTABLE value served from core — its seat line, its rule-tier semantics, its control-surface vocabulary and its discipline — and it has NO WRITER AT ALL (releases#179, greenlit; doyle rulings 2026-08-19 in the KEYSTONE #182 W3 lane; the ratified first-output skeleton is releases#165). Every other endpoint’s role is durable identity authored by its owner and carried by tracked/agents/<id>/live-role.md; the engine room is the degenerate case, because its seat is minted by the node rather than chosen by a person, so there is nothing for an owner to author and a per-session writer would race the role editor and push session weather into the mind's durable substrate. Serving it from core is what makes IMMUTABLE a property of the system rather than a promise: BOTH readers of role text — the resume path’s <live-role> emission and the bare-read CLI arm — serve the core value for engine-room, so an on-disk live-role.md planted for that id is ignored dead weight and is never consulted, and the sole writer (the --overwrite arm) REFUSES engine-room loudly, naming the in-core role as the reason. The carrier is a FUNCTION and not a const, and that is load-bearing rather than stylistic: a const cannot call the shared surface composer, so a const role would have to hardcode the surface list — the exact defect REQ-ER-BRIEFING-SURFACE-VOCAB refuses — while a function is still a static value in the sense #179 asks for (no store read, no writer, no per-session input, deterministic output). The role is also PROGRAM TEXT: it prescribes verbs, so every verb it prescribes is walked against the clap grammar over its WHOLE span, re-derived rather than sampled. Gate: doc — the ratified ER skeleton artifact landed under docs/ and the CONTEXT.md engine-room entry stating the role is served from core and has no writer; impl — the in-core role composer building its control-surface section from the shared table composer, both readers serving it for engine-room, the --overwrite refusal, and the briefing composer reduced to per-session facts; unit — the grammar walk over the whole role text, both readers serving the core value while IGNORING a planted on-disk live-role.md for engine-room, --overwrite refusing engine-room with a non-ER-succeeds discriminator, and both skeleton-amendment controls (a panic arm for the kept-ellipsis fault and a PRESENCE arm for the silently unwalked continuation cell, because a silent hole walks clean past a panic expectation and the two faults cannot share one control); int — an engine-room bring-up serving the in-core role, declared first-execution.",
2026-08-28T09:54:46.5844620Z       "requiredStages": [
2026-08-28T09:54:46.5844778Z         "doc",
2026-08-28T09:54:46.5844921Z         "impl",
2026-08-28T09:54:46.5845069Z         "unit",
2026-08-28T09:54:46.5845216Z         "int"
2026-08-28T09:54:46.5845369Z       ],
2026-08-28T09:54:46.5845521Z       "stages": {
2026-08-28T09:54:46.5845669Z         "doc": {
2026-08-28T09:54:46.5845831Z           "complete": true,
2026-08-28T09:54:46.5845984Z           "evidence": [
2026-08-28T09:54:46.5846132Z             {
2026-08-28T09:54:46.5846297Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5846450Z               "line": 859
2026-08-28T09:54:46.5846600Z             },
2026-08-28T09:54:46.5846744Z             {
2026-08-28T09:54:46.5846924Z               "path": "docs/ER-SKELETON.md",
2026-08-28T09:54:46.5847186Z               "line": 3
2026-08-28T09:54:46.5847341Z             }
2026-08-28T09:54:46.5847492Z           ]
2026-08-28T09:54:46.5847641Z         },
2026-08-28T09:54:46.5847793Z         "impl": {
2026-08-28T09:54:46.5847955Z           "complete": true,
2026-08-28T09:54:46.5848112Z           "evidence": [
2026-08-28T09:54:46.5848265Z             {
2026-08-28T09:54:46.5848465Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:46.5848624Z               "line": 175
2026-08-28T09:54:46.5848779Z             },
2026-08-28T09:54:46.5848924Z             {
2026-08-28T09:54:46.5849222Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5849377Z               "line": 53
2026-08-28T09:54:46.5849530Z             },
2026-08-28T09:54:46.5849673Z             {
2026-08-28T09:54:46.5849873Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5850030Z               "line": 62
2026-08-28T09:54:46.5850188Z             },
2026-08-28T09:54:46.5850336Z             {
2026-08-28T09:54:46.5850532Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5850688Z               "line": 75
2026-08-28T09:54:46.5850837Z             },
2026-08-28T09:54:46.5850998Z             {
2026-08-28T09:54:46.5851190Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5851346Z               "line": 90
2026-08-28T09:54:46.5851496Z             },
2026-08-28T09:54:46.5851646Z             {
2026-08-28T09:54:46.5851832Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5851987Z               "line": 5385
2026-08-28T09:54:46.5852140Z             },
2026-08-28T09:54:46.5852287Z             {
2026-08-28T09:54:46.5852469Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5852621Z               "line": 5407
2026-08-28T09:54:46.5852774Z             },
2026-08-28T09:54:46.5852922Z             {
2026-08-28T09:54:46.5853103Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5853274Z               "line": 5456
2026-08-28T09:54:46.5853536Z             }
2026-08-28T09:54:46.5853694Z           ]
2026-08-28T09:54:46.5853846Z         },
2026-08-28T09:54:46.5853999Z         "int": {
2026-08-28T09:54:46.5854156Z           "complete": true,
2026-08-28T09:54:46.5854314Z           "evidence": [
2026-08-28T09:54:46.5854462Z             {
2026-08-28T09:54:46.5854703Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:46.5854866Z               "line": 1807
2026-08-28T09:54:46.5855009Z             }
2026-08-28T09:54:46.5855157Z           ]
2026-08-28T09:54:46.5855305Z         },
2026-08-28T09:54:46.5855463Z         "unit": {
2026-08-28T09:54:46.5855624Z           "complete": true,
2026-08-28T09:54:46.5855781Z           "evidence": [
2026-08-28T09:54:46.5855929Z             {
2026-08-28T09:54:46.5856130Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:46.5856288Z               "line": 329
2026-08-28T09:54:46.5856453Z             },
2026-08-28T09:54:46.5856622Z             {
2026-08-28T09:54:46.5856815Z               "path": "crates/spt-store/src/erole.rs",
2026-08-28T09:54:46.5856967Z               "line": 187
2026-08-28T09:54:46.5857113Z             },
2026-08-28T09:54:46.5857266Z             {
2026-08-28T09:54:46.5857446Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5857615Z               "line": 28325
2026-08-28T09:54:46.5857761Z             },
2026-08-28T09:54:46.5857905Z             {
2026-08-28T09:54:46.5858085Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5858239Z               "line": 28354
2026-08-28T09:54:46.5858381Z             },
2026-08-28T09:54:46.5858525Z             {
2026-08-28T09:54:46.5858705Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5858869Z               "line": 36749
2026-08-28T09:54:46.5859106Z             },
2026-08-28T09:54:46.5859263Z             {
2026-08-28T09:54:46.5859441Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5859706Z               "line": 36791
2026-08-28T09:54:46.5859854Z             },
2026-08-28T09:54:46.5860008Z             {
2026-08-28T09:54:46.5860186Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5860342Z               "line": 36834
2026-08-28T09:54:46.5860496Z             },
2026-08-28T09:54:46.5860647Z             {
2026-08-28T09:54:46.5860824Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5860981Z               "line": 36847
2026-08-28T09:54:46.5861135Z             }
2026-08-28T09:54:46.5861277Z           ]
2026-08-28T09:54:46.5861426Z         }
2026-08-28T09:54:46.5861572Z       }
2026-08-28T09:54:46.5861726Z     },
2026-08-28T09:54:46.5861873Z     {
2026-08-28T09:54:46.5862051Z       "id": "REQ-ER-RULESET-NODE-NAMES",
2026-08-28T09:54:46.5870185Z       "title": "A node subject in a ruleset row renders the node's NAME (`node:ENLYZEAM`), not its pubkey hex — the second half of releases#210's unreadability (the first is the table shape, REQ-ER-RULESET-TABLE). Resolution goes through an INJECTED resolver `Fn(&str) -> Option<String>` on the ruleset-rows seam (the `derive_attached_node` precedent): the store crate holds no registry edge, and a render provable with no filesystem, no node and no gossip is worth more than one that reaches for a name itself. Consumers supply the real lookup — this node's own subnet rosters and hostname, layered under the gossiped registry labels the picker and `endpoint list` already render from, so every view on a box names a node the same way. DEGRADE (ruled, doyle 2026-08-21): an unresolvable node renders the FULL 64-hex — never an error, never blank, and never a truncation, because a truncated hash is the filed defect itself. A whitespace-only label has not answered and degrades identically. The JSON keeps the IDENTITY: `subject` stays the full hex and the resolved name rides beside it as an ADDITIVE field, omitted rather than null when unresolved — a machine keys on the pubkey and a label is not a key (the human/JSON asymmetry rule releases#206 paid for). Row ORDER follows the identity, never the name: the table is diffed across postures, and a label arriving or going away must not reorder the grid. Gate: doc — the CONTEXT.md engine-room ruleset sentence and the access-viewing drill-down section; impl — the resolver seam on the rows builder, the subject render, and the two consumers' real resolvers; unit — a resolved subject renders the name with the hex absent from the cell, an unresolvable one keeps the full untruncated hex, a blank label degrades, only node subjects resolve, the JSON keeps the hex and carries the name additively (omitted when absent), and naming does not reorder rows.",
2026-08-28T09:54:46.5870507Z       "requiredStages": [
2026-08-28T09:54:46.5870660Z         "doc",
2026-08-28T09:54:46.5870813Z         "impl",
2026-08-28T09:54:46.5870964Z         "unit"
2026-08-28T09:54:46.5871108Z       ],
2026-08-28T09:54:46.5871260Z       "stages": {
2026-08-28T09:54:46.5871399Z         "doc": {
2026-08-28T09:54:46.5871575Z           "complete": true,
2026-08-28T09:54:46.5871728Z           "evidence": [
2026-08-28T09:54:46.5871880Z             {
2026-08-28T09:54:46.5872052Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5872209Z               "line": 879
2026-08-28T09:54:46.5872362Z             },
2026-08-28T09:54:46.5872510Z             {
2026-08-28T09:54:46.5872747Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:46.5872900Z               "line": 55
2026-08-28T09:54:46.5873050Z             },
2026-08-28T09:54:46.5873202Z             {
2026-08-28T09:54:46.5873440Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5873604Z               "line": 139
2026-08-28T09:54:46.5873745Z             }
2026-08-28T09:54:46.5873904Z           ]
2026-08-28T09:54:46.5874051Z         },
2026-08-28T09:54:46.5874205Z         "impl": {
2026-08-28T09:54:46.5874366Z           "complete": true,
2026-08-28T09:54:46.5874529Z           "evidence": [
2026-08-28T09:54:46.5874785Z             {
2026-08-28T09:54:46.5874995Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5875158Z               "line": 102
2026-08-28T09:54:46.5875309Z             },
2026-08-28T09:54:46.5875459Z             {
2026-08-28T09:54:46.5875657Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5875815Z               "line": 179
2026-08-28T09:54:46.5875957Z             },
2026-08-28T09:54:46.5876120Z             {
2026-08-28T09:54:46.5876324Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5876473Z               "line": 237
2026-08-28T09:54:46.5876620Z             },
2026-08-28T09:54:46.5876764Z             {
2026-08-28T09:54:46.5876968Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5877112Z               "line": 262
2026-08-28T09:54:46.5877269Z             },
2026-08-28T09:54:46.5877422Z             {
2026-08-28T09:54:46.5877617Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5877798Z               "line": 301
2026-08-28T09:54:46.5877940Z             },
2026-08-28T09:54:46.5878092Z             {
2026-08-28T09:54:46.5878290Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5878448Z               "line": 366
2026-08-28T09:54:46.5878590Z             },
2026-08-28T09:54:46.5878740Z             {
2026-08-28T09:54:46.5878929Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.5879177Z               "line": 20062
2026-08-28T09:54:46.5879331Z             }
2026-08-28T09:54:46.5879473Z           ]
2026-08-28T09:54:46.5879626Z         },
2026-08-28T09:54:46.5879778Z         "int": {
2026-08-28T09:54:46.5879946Z           "complete": false,
2026-08-28T09:54:46.5880107Z           "evidence": []
2026-08-28T09:54:46.5880261Z         },
2026-08-28T09:54:46.5880417Z         "unit": {
2026-08-28T09:54:46.5880575Z           "complete": true,
2026-08-28T09:54:46.5880736Z           "evidence": [
2026-08-28T09:54:46.5880888Z             {
2026-08-28T09:54:46.5881100Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5881378Z               "line": 1035
2026-08-28T09:54:46.5881534Z             },
2026-08-28T09:54:46.5881678Z             {
2026-08-28T09:54:46.5881883Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5882050Z               "line": 1053
2026-08-28T09:54:46.5882193Z             },
2026-08-28T09:54:46.5882345Z             {
2026-08-28T09:54:46.5882546Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5882707Z               "line": 1074
2026-08-28T09:54:46.5882851Z             },
2026-08-28T09:54:46.5883012Z             {
2026-08-28T09:54:46.5883209Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5883374Z               "line": 1091
2026-08-28T09:54:46.5883526Z             },
2026-08-28T09:54:46.5883677Z             {
2026-08-28T09:54:46.5883877Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5884034Z               "line": 1136
2026-08-28T09:54:46.5884187Z             },
2026-08-28T09:54:46.5884334Z             {
2026-08-28T09:54:46.5884535Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5884701Z               "line": 1160
2026-08-28T09:54:46.5884850Z             },
2026-08-28T09:54:46.5885002Z             {
2026-08-28T09:54:46.5885202Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5885365Z               "line": 1199
2026-08-28T09:54:46.5885512Z             }
2026-08-28T09:54:46.5885670Z           ]
2026-08-28T09:54:46.5885818Z         }
2026-08-28T09:54:46.5885970Z       }
2026-08-28T09:54:46.5886119Z     },
2026-08-28T09:54:46.5886269Z     {
2026-08-28T09:54:46.5886466Z       "id": "REQ-ER-RULESET-TABLE",
2026-08-28T09:54:46.5894467Z       "title": "The engine room presents access rulesets as TABLES (ADR-0052 decision 3). The rendering is a requirement rather than a nicety because the operator decision this surface exists to support — is this node's posture what I think it is — is a comparison across subjects, surfaces and tiers, and prose forces a human to hold that grid in their head while an agent narrates it to them. A table also makes an omission visible: a row that should be there and is not is legible in a grid and invisible in a paragraph. It rides the same briefing message the session opens with (REQ-ER-SESSION-BRIEFING) and the same renderer serves an on-demand ruleset request. Gate: doc — ADR-0052 decision 3's table clause; impl — the ruleset table renderer used by the briefing and by an on-demand request; unit — the renderer emits one row per rule with subject, surface, tier and decision, renders an empty ruleset as an explicit empty table rather than silence, and is stable enough to diff across two postures. AMENDED releases#210 (doyle ruling 2026-08-21): the rendering is a MARKDOWN pipe table with space-padded cells — valid markdown in the chat surface an agent relays it through AND still column-aligned in a terminal, so the one renderer serves both consumers (the briefing and the drill-down view) and the grid cannot fork into two spellings. A space-aligned grid is reflowed into a run-on by the surface a human actually reads it on, which is the defect: the table stopped being a table in transit. Cell content is escaped at the row edge so a value containing a pipe cannot silently stop the grid from being a grid. Unit additionally: the header, the separator row that makes it a markdown table, one pipe-delimited row per rule with a fixed cell count, the empty case still explicit, and the pipe-bearing cell.",
2026-08-28T09:54:46.5894780Z       "requiredStages": [
2026-08-28T09:54:46.5894928Z         "doc",
2026-08-28T09:54:46.5895086Z         "impl",
2026-08-28T09:54:46.5895228Z         "unit"
2026-08-28T09:54:46.5895387Z       ],
2026-08-28T09:54:46.5895528Z       "stages": {
2026-08-28T09:54:46.5895678Z         "doc": {
2026-08-28T09:54:46.5895834Z           "complete": true,
2026-08-28T09:54:46.5895988Z           "evidence": [
2026-08-28T09:54:46.5896130Z             {
2026-08-28T09:54:46.5896406Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5896608Z               "line": 879
2026-08-28T09:54:46.5896744Z             },
2026-08-28T09:54:46.5896892Z             {
2026-08-28T09:54:46.5897120Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:46.5897284Z               "line": 55
2026-08-28T09:54:46.5897435Z             },
2026-08-28T09:54:46.5897584Z             {
2026-08-28T09:54:46.5897831Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5897993Z               "line": 138
2026-08-28T09:54:46.5898145Z             }
2026-08-28T09:54:46.5901147Z           ]
2026-08-28T09:54:46.5901357Z         },
2026-08-28T09:54:46.5901518Z         "impl": {
2026-08-28T09:54:46.5901695Z           "complete": true,
2026-08-28T09:54:46.5901856Z           "evidence": [
2026-08-28T09:54:46.5902008Z             {
2026-08-28T09:54:46.5902235Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5902407Z               "line": 2197
2026-08-28T09:54:46.5902569Z             },
2026-08-28T09:54:46.5902712Z             {
2026-08-28T09:54:46.5902926Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5903089Z               "line": 2235
2026-08-28T09:54:46.5903235Z             },
2026-08-28T09:54:46.5903385Z             {
2026-08-28T09:54:46.5903604Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5903770Z               "line": 224
2026-08-28T09:54:46.5903919Z             },
2026-08-28T09:54:46.5904071Z             {
2026-08-28T09:54:46.5904277Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5904433Z               "line": 381
2026-08-28T09:54:46.5904575Z             },
2026-08-28T09:54:46.5904731Z             {
2026-08-28T09:54:46.5904931Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5905088Z               "line": 391
2026-08-28T09:54:46.5905389Z             },
2026-08-28T09:54:46.5905531Z             {
2026-08-28T09:54:46.5905737Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5905885Z               "line": 484
2026-08-28T09:54:46.5906032Z             }
2026-08-28T09:54:46.5906175Z           ]
2026-08-28T09:54:46.5906318Z         },
2026-08-28T09:54:46.5906461Z         "int": {
2026-08-28T09:54:46.5906619Z           "complete": false,
2026-08-28T09:54:46.5906781Z           "evidence": []
2026-08-28T09:54:46.5906924Z         },
2026-08-28T09:54:46.5907076Z         "unit": {
2026-08-28T09:54:46.5907235Z           "complete": true,
2026-08-28T09:54:46.5907394Z           "evidence": [
2026-08-28T09:54:46.5907543Z             {
2026-08-28T09:54:46.5907752Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5907915Z               "line": 681
2026-08-28T09:54:46.5908062Z             },
2026-08-28T09:54:46.5908215Z             {
2026-08-28T09:54:46.5908415Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5908582Z               "line": 983
2026-08-28T09:54:46.5908730Z             },
2026-08-28T09:54:46.5908882Z             {
2026-08-28T09:54:46.5909187Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5909354Z               "line": 1013
2026-08-28T09:54:46.5909502Z             },
2026-08-28T09:54:46.5909649Z             {
2026-08-28T09:54:46.5909852Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5910014Z               "line": 1176
2026-08-28T09:54:46.5910162Z             }
2026-08-28T09:54:46.5910304Z           ]
2026-08-28T09:54:46.5910448Z         }
2026-08-28T09:54:46.5910595Z       }
2026-08-28T09:54:46.5910744Z     },
2026-08-28T09:54:46.5910896Z     {
2026-08-28T09:54:46.5911072Z       "id": "REQ-ER-SEQUESTERED-CWD",
2026-08-28T09:54:46.5931283Z       "title": "THE ENGINE ROOM LAUNCHES FROM A SEQUESTERED DIRECTORY OF ITS OWN, NEVER FROM WHEREVER A CALLER HAPPENED TO STAND (releases#178, operator-requested; doyle's four rulings 2026-08-19). The engine room governs the NODE and is not a participant in any user project, so inheriting a caller's cwd gave it an identity it should never have had: the recorded `info.cwd` is not an inert stamp but the anchor the context store routes its project tier from, the registry gossips project ids from, and the picker offers resume rows from — so an ordinary bring-up from a developer's checkout silently enrolled the node's governance surface as a member of that project. Its cwd is `$SPT_HOME/engineroom/cwd`, provisioned empty. IT IS DELIBERATELY NOT INSIDE THE OWLERY: a foreign directory sitting in the perch store risks reading as a ghost perch to any enumerator, which is a worse defect than the one being fixed. THE CWD IS FORCED, AND FORCED AT THE RESOLUTION SEAM RATHER THAN ONLY AT THE CALL: passing the directory at the spawn site is a declare-site fix, and a declare-site fix is not an enforce-site fix (the manifest `role.cwd` arm wins over a caller default by design), so for the reserved engine-room id the sequestered directory beats BOTH the caller's `spawn_cwd` and a manifest-declared `role.cwd`. A manifest that declares one is IGNORED LOUDLY — one log line naming the rule — and NEVER refused a bring-up: the operator must not be locked out of the room over a cwd, and an unstated deliberate override is indistinguishable from a bug to the next reader. THE ROUTING PREDICATE IS WIDENED FROM ITS SPELLING TO ITS MEANING: `is_owlery_internal` says owlery but asks 'is this a real user project?', and a cwd under `$SPT_HOME` but outside the owlery minting a synced `p-<dir>` project was junk-in-waiting independent of this change. Every consumer was walked before the widening (the condition on it): the context-store project routing, the psyche-notification routing, the registry's GOSSIPED project list, the shared `projderive` history kernel behind both the picker and the daemon's materialized index, and the picker's resume-row drop — ALL FIVE ask the same question and every one of them would be wrong to route, advertise or offer a sequestered engine-room cwd, so the predicate is widened in place rather than split in two, and the two duplicate copies of the normalize-and-prefix test are collapsed onto the one kernel in the same touch so they cannot drift apart afterwards. THE WIDENING IS MONOTONE — the owlery is a subdirectory of `$SPT_HOME`, so the new base is a strict superset and nothing previously excluded becomes included — which is what keeps ADR-0037 section 4's rendered-parity promise true for every real user project. DECLARED CHANGE, NOT A SIDE EFFECT: a project kept UNDER `$SPT_HOME` stops being routed into the synced backup/migrate set, stops being gossiped, and stops being offered as a resume row. READ-ONLY IS POLICY, HONESTLY LABELLED AS SUCH: the directory is provisioned empty and never written, and that is asserted by test — a same-user Windows ACL cannot enforce write-denial against a child running as the same user, and pretending otherwise would ship a guarantee the platform does not make; hard enforcement by integrity level or a separate token is its own future item and is deliberately NOT folded in. DECLARED RESIDUAL: the engine room is drop-less, so no relative drop-dir or commune-dir resolution work rides here; if a future feature gives the engine room file drops, THAT feature owns pinning them absolute, because a relative drop resolving against a never-written directory is the same failure class REQ-ECHO-DROP-DIR-RESOLVE already closed once. Gate: impl — the single-source path for the sequestered directory, its provisioning, the spawn site passing it, the reserved-id guard at the resolution seam with its loud ignore line, and the widened predicate repointed at every one of the five call sites; unit — the routing decision table written out in BOTH directions (an owlery-internal cwd routes no project, a `$SPT_HOME`-internal cwd OUTSIDE the owlery routes no project — the new row — and a genuine external directory still mints its `p-<dir>`), plus the resolution table proving the guard is engine-room-shaped rather than global (a declared `role.cwd` LOSES for the reserved id and still WINS for every other endpoint); int — a real bring-up launching in the sequestered directory, with NOTHING written into it across a full bring-up and briefing cycle, which is one assertion serving as both the drop-less witness and the read-only-policy witness.",
2026-08-28T09:54:46.5931869Z       "requiredStages": [
2026-08-28T09:54:46.5932030Z         "impl",
2026-08-28T09:54:46.5932184Z         "unit",
2026-08-28T09:54:46.5932330Z         "int"
2026-08-28T09:54:46.5932475Z       ],
2026-08-28T09:54:46.5932631Z       "stages": {
2026-08-28T09:54:46.5932785Z         "doc": {
2026-08-28T09:54:46.5932946Z           "complete": false,
2026-08-28T09:54:46.5933105Z           "evidence": []
2026-08-28T09:54:46.5933256Z         },
2026-08-28T09:54:46.5933410Z         "impl": {
2026-08-28T09:54:46.5933574Z           "complete": true,
2026-08-28T09:54:46.5933732Z           "evidence": [
2026-08-28T09:54:46.5933887Z             {
2026-08-28T09:54:46.5934093Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5934258Z               "line": 6384
2026-08-28T09:54:46.5934407Z             },
2026-08-28T09:54:46.5934563Z             {
2026-08-28T09:54:46.5934783Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.5934940Z               "line": 386
2026-08-28T09:54:46.5935088Z             },
2026-08-28T09:54:46.5935241Z             {
2026-08-28T09:54:46.5935451Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.5935614Z               "line": 1517
2026-08-28T09:54:46.5935770Z             },
2026-08-28T09:54:46.5935914Z             {
2026-08-28T09:54:46.5936137Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5936294Z               "line": 1048
2026-08-28T09:54:46.5936444Z             },
2026-08-28T09:54:46.5936587Z             {
2026-08-28T09:54:46.5936797Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.5937036Z               "line": 765
2026-08-28T09:54:46.5937192Z             },
2026-08-28T09:54:46.5937341Z             {
2026-08-28T09:54:46.5937541Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.5937703Z               "line": 827
2026-08-28T09:54:46.5937846Z             },
2026-08-28T09:54:46.5937998Z             {
2026-08-28T09:54:46.5938257Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.5938423Z               "line": 87
2026-08-28T09:54:46.5938567Z             },
2026-08-28T09:54:46.5938723Z             {
2026-08-28T09:54:46.5938924Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.5939156Z               "line": 103
2026-08-28T09:54:46.5939314Z             }
2026-08-28T09:54:46.5939456Z           ]
2026-08-28T09:54:46.5939610Z         },
2026-08-28T09:54:46.5939762Z         "int": {
2026-08-28T09:54:46.5939924Z           "complete": true,
2026-08-28T09:54:46.5940062Z           "evidence": [
2026-08-28T09:54:46.5940220Z             {
2026-08-28T09:54:46.5940459Z               "path": "crates/spt/tests/er_sequestered_cwd_e2e.rs",
2026-08-28T09:54:46.5940611Z               "line": 529
2026-08-28T09:54:46.5940765Z             }
2026-08-28T09:54:46.5940906Z           ]
2026-08-28T09:54:46.5941059Z         },
2026-08-28T09:54:46.5941211Z         "unit": {
2026-08-28T09:54:46.5941377Z           "complete": true,
2026-08-28T09:54:46.5941533Z           "evidence": [
2026-08-28T09:54:46.5941679Z             {
2026-08-28T09:54:46.5941899Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.5942057Z               "line": 3014
2026-08-28T09:54:46.5942205Z             },
2026-08-28T09:54:46.5942348Z             {
2026-08-28T09:54:46.5942571Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.5942725Z               "line": 1341
2026-08-28T09:54:46.5942877Z             },
2026-08-28T09:54:46.5943030Z             {
2026-08-28T09:54:46.5943234Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.5943511Z               "line": 1284
2026-08-28T09:54:46.5943660Z             }
2026-08-28T09:54:46.5943816Z           ]
2026-08-28T09:54:46.5943961Z         }
2026-08-28T09:54:46.5944116Z       }
2026-08-28T09:54:46.5944263Z     },
2026-08-28T09:54:46.5944414Z     {
2026-08-28T09:54:46.5944590Z       "id": "REQ-ER-SESSION-BRIEFING",
2026-08-28T09:54:46.5960663Z       "title": "Every engine-room session opens with a system-authored briefing message stating the node's exact current access posture, any pending advisory-gossip deltas, the current ruleset, the session's empowerment with its spendable verbs (empower, access-refresh), and the seat-authority statements (one-seat lifetime, no cross-node reach, no unchosen advertisement) (ADR-0052 decision 3 and decision 6; doyle ruling (e) 2026-07-29). AMENDED BY REPLACEMENT in the KEYSTONE #182 W3 lane (doyle ruling on releases#179, 2026-08-19): capabilities and responsibilities LEFT this requirement and became the engine room's durable in-core role (REQ-ER-ROLE-STATIC-IMMUTABLE), because they are static facts about the seat rather than per-session weather. The replacement is recorded here rather than annotated because a partition ruling falsifies the requirement's own ratified sentence, not just the code beneath it — a refactor UNDER a requirement is a different act from one that makes its sentence false. What stays is the per-session half: a minded governance surface is only as good as what it knows at the moment it acts, and posture is per-session state — which is why the briefing is a message spooled at bring-up under a reserved system author, NOT the endpoint's durable role text. THE BRIEFING WRITES NO ROLE TEXT: that pin is unchanged and is more load-bearing after the partition, not less, since the engine room's role now has no writer at all. The message spool is already core-side, harness-independent data that any adapter renders as ordinary inbound, so the briefing needs no harness-specific cooperation — the boundary rule holds by construction. EXTENDED for releases#177 (doyle dispatch 2026-08-19): the cadence this sentence always named is now enforced at the ENQUEUE seam — a session opens with a briefing ONCE, not once per seat-taking attach. The endpoint keeps running between attachments, so the pre-#177 product re-briefed a human who detached and came back to the SAME live session with a posture statement they had already read; \"every session opens with a briefing\" was true of the first attach and false as a cadence. A FRESH session — a new bring-up, or a daemon restart that re-hosts one — briefs exactly as before, which is why the bound lives on the broker's per-session log rather than in an on-disk last-briefed record: such a record would keep suppressing across a daemon restart whenever the harness outlived the broker and kept its session id, silencing the one case that must still brief. CONDITION IS NOT CADENCE: nothing here changes what a briefing says or when one is composed. The bound is on the ENQUEUE ALONE and never on delivery — REQ-ER-BRIEFING-PRESENTED clause 4 rules that a briefing whose presentation missed is retained and re-offered at the next seat-taking attach, so gating the presentation call on \"did this seat enqueue\" would fix #177 by re-breaking #164. Gate: doc — ADR-0052 decision 3's briefing clause and the CONTEXT.md engine-room entry; impl — the briefing composer reduced to per-session facts, spooling at bring-up under a reserved system author; unit — bring-up spools exactly one briefing carrying current posture, pending gossip deltas, the ruleset, the session's empowerment with its spendable verbs and the seat-authority statements, and no role text is written, AND a second seat-taking attach on the same session spools no second briefing while the first one still lands in that same run (the positive control that keeps the green from being a green nothing could red); int — a real second seat on a running engine-room session, pinned to be the same session by its session id, adds no briefing row.",
2026-08-28T09:54:46.5960992Z       "requiredStages": [
2026-08-28T09:54:46.5961250Z         "doc",
2026-08-28T09:54:46.5961402Z         "impl",
2026-08-28T09:54:46.5961555Z         "unit",
2026-08-28T09:54:46.5961702Z         "int"
2026-08-28T09:54:46.5961856Z       ],
2026-08-28T09:54:46.5962012Z       "stages": {
2026-08-28T09:54:46.5962155Z         "doc": {
2026-08-28T09:54:46.5962321Z           "complete": true,
2026-08-28T09:54:46.5962478Z           "evidence": [
2026-08-28T09:54:46.5962630Z             {
2026-08-28T09:54:46.5962800Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.5962963Z               "line": 859
2026-08-28T09:54:46.5963110Z             },
2026-08-28T09:54:46.5963254Z             {
2026-08-28T09:54:46.5963507Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.5963658Z               "line": 137
2026-08-28T09:54:46.5963812Z             }
2026-08-28T09:54:46.5963954Z           ]
2026-08-28T09:54:46.5964107Z         },
2026-08-28T09:54:46.5964259Z         "impl": {
2026-08-28T09:54:46.5964427Z           "complete": true,
2026-08-28T09:54:46.5964583Z           "evidence": [
2026-08-28T09:54:46.5964727Z             {
2026-08-28T09:54:46.5964936Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5965091Z               "line": 938
2026-08-28T09:54:46.5965241Z             },
2026-08-28T09:54:46.5965388Z             {
2026-08-28T09:54:46.5965710Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5965887Z               "line": 2196
2026-08-28T09:54:46.5966035Z             },
2026-08-28T09:54:46.5966183Z             {
2026-08-28T09:54:46.5966383Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5966535Z               "line": 2234
2026-08-28T09:54:46.5966679Z             },
2026-08-28T09:54:46.5966826Z             {
2026-08-28T09:54:46.5967022Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5967189Z               "line": 2276
2026-08-28T09:54:46.5967437Z             },
2026-08-28T09:54:46.5967585Z             {
2026-08-28T09:54:46.5967793Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5967950Z               "line": 2322
2026-08-28T09:54:46.5968101Z             },
2026-08-28T09:54:46.5968243Z             {
2026-08-28T09:54:46.5968454Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5968606Z               "line": 2360
2026-08-28T09:54:46.5968755Z             },
2026-08-28T09:54:46.5968907Z             {
2026-08-28T09:54:46.5969188Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5969350Z               "line": 483
2026-08-28T09:54:46.5969498Z             },
2026-08-28T09:54:46.5969651Z             {
2026-08-28T09:54:46.5969856Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5970012Z               "line": 583
2026-08-28T09:54:46.5970171Z             },
2026-08-28T09:54:46.5970322Z             {
2026-08-28T09:54:46.5970529Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5970684Z               "line": 630
2026-08-28T09:54:46.5970837Z             }
2026-08-28T09:54:46.5970980Z           ]
2026-08-28T09:54:46.5971137Z         },
2026-08-28T09:54:46.5971291Z         "int": {
2026-08-28T09:54:46.5971457Z           "complete": true,
2026-08-28T09:54:46.5971619Z           "evidence": [
2026-08-28T09:54:46.5971767Z             {
2026-08-28T09:54:46.5972028Z               "path": "crates/spt/tests/er_brief_once_per_session_e2e.rs",
2026-08-28T09:54:46.5972177Z               "line": 278
2026-08-28T09:54:46.5972329Z             },
2026-08-28T09:54:46.5972478Z             {
2026-08-28T09:54:46.5972725Z               "path": "crates/spt/tests/er_briefing_presented_e2e.rs",
2026-08-28T09:54:46.5972882Z               "line": 389
2026-08-28T09:54:46.5973028Z             }
2026-08-28T09:54:46.5973180Z           ]
2026-08-28T09:54:46.5973326Z         },
2026-08-28T09:54:46.5973485Z         "unit": {
2026-08-28T09:54:46.5973646Z           "complete": true,
2026-08-28T09:54:46.5973928Z           "evidence": [
2026-08-28T09:54:46.5974077Z             {
2026-08-28T09:54:46.5974285Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5974443Z               "line": 13108
2026-08-28T09:54:46.5974595Z             },
2026-08-28T09:54:46.5974744Z             {
2026-08-28T09:54:46.5974948Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.5975110Z               "line": 13390
2026-08-28T09:54:46.5975263Z             },
2026-08-28T09:54:46.5975416Z             {
2026-08-28T09:54:46.5975621Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5975787Z               "line": 739
2026-08-28T09:54:46.5975934Z             },
2026-08-28T09:54:46.5976085Z             {
2026-08-28T09:54:46.5976290Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5976442Z               "line": 744
2026-08-28T09:54:46.5976595Z             },
2026-08-28T09:54:46.5976743Z             {
2026-08-28T09:54:46.5976944Z               "path": "crates/spt-store/src/briefing.rs",
2026-08-28T09:54:46.5977100Z               "line": 828
2026-08-28T09:54:46.5977249Z             }
2026-08-28T09:54:46.5977396Z           ]
2026-08-28T09:54:46.5977564Z         }
2026-08-28T09:54:46.5977715Z       }
2026-08-28T09:54:46.5977859Z     },
2026-08-28T09:54:46.5978006Z     {
2026-08-28T09:54:46.5978189Z       "id": "REQ-EVENT-ATTR-PASSTHROUGH",
2026-08-28T09:54:46.5986951Z       "title": "THE EVENT ENVELOPE'S SENDER-AUTHORED ATTRIBUTE SET IS OPEN, AND THE PUBLISHED CONTRACT STATES THE CLASS RULE, NOT ONLY PER-ATTR OBLIGATIONS: any consumer that re-renders deliveries (adapter pipeline, digest, relay surface) MUST pass through every envelope attribute it does not itself consume — re-emitting from a fixed allowlist of known names silently deletes every attribute added after the list was written (measured 3x in the field; 3rd recurrence was an adapter render keeping only from+body, deleting the seal citation), and the deletion is invisible at the dropping site because nothing there names what it dropped. The ONLY closed list is the receiver-composed STRIP class (trust-warning, mnemonics-json) — a strip list, never a render list. MIRROR SAFETY CLAUSE: a passed-through value stays IN ATTRIBUTE POSITION with its wire escaping intact — unescaping an attribute value into body/frame context hands a hostile sender a forgery seam (a crafted value closes the re-rendered tag and lands text at the consumer's frame level); decode only where the final consumer parses attributes. CONSUME IS DEFINED, NOT LEFT TO THE READER (perri's discriminating question, 2026-08-25): a pipeline consumes an attribute when its handling RE-EXPRESSES the value's distinction to the agent (content re-rendered into its own surface, or a dispatch whose agent-visible outcome differs per value); reading-then-emitting-shared-output is peeking, and the DROP TEST decides — if omitting the attr makes two sender-distinct deliveries indistinguishable at the agent surface, it rides. NAMES ARE TOKENS: grammar [a-z0-9_-]+, hostile-reachable (envelopes arrive from peer NODES), pass through only a grammar-matching name, refuse/drop loudly anything else in tag position. Gate: doc — the overview.md wire-contract clause stating the pass-through obligation, the consume definition + drop test, the name-token grammar rule, and the escaping-position rule.",
2026-08-28T09:54:46.5987255Z       "requiredStages": [
2026-08-28T09:54:46.5987416Z         "doc"
2026-08-28T09:54:46.5987565Z       ],
2026-08-28T09:54:46.5987717Z       "stages": {
2026-08-28T09:54:46.5987875Z         "doc": {
2026-08-28T09:54:46.5988032Z           "complete": true,
2026-08-28T09:54:46.5988190Z           "evidence": [
2026-08-28T09:54:46.5988342Z             {
2026-08-28T09:54:46.5988557Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:46.5988710Z               "line": 193
2026-08-28T09:54:46.5988867Z             }
2026-08-28T09:54:46.5989189Z           ]
2026-08-28T09:54:46.5989340Z         },
2026-08-28T09:54:46.5989616Z         "impl": {
2026-08-28T09:54:46.5989775Z           "complete": false,
2026-08-28T09:54:46.5989950Z           "evidence": []
2026-08-28T09:54:46.5990113Z         },
2026-08-28T09:54:46.5990269Z         "int": {
2026-08-28T09:54:46.5990432Z           "complete": false,
2026-08-28T09:54:46.5990584Z           "evidence": []
2026-08-28T09:54:46.5990729Z         },
2026-08-28T09:54:46.5990885Z         "unit": {
2026-08-28T09:54:46.5991048Z           "complete": false,
2026-08-28T09:54:46.5991205Z           "evidence": []
2026-08-28T09:54:46.5991353Z         }
2026-08-28T09:54:46.5991500Z       }
2026-08-28T09:54:46.5991654Z     },
2026-08-28T09:54:46.5991800Z     {
2026-08-28T09:54:46.5991985Z       "id": "REQ-FIXTURE-BIN-BUILD-EDGE",
2026-08-28T09:54:46.6015217Z       "title": "IR-21 remedy (c), ENFORCED FORM: every test consumer of a fixture `[[bin]]` is CLASSIFIED by whether that bin's build is guaranteed, by a check anyone gating can run, rather than by whoever remembers the rule. THE MECHANISM, measured 2026-08-03 and NOT the one the class was originally filed on: cargo builds EVERY bin target of a package whenever it builds ANY integration test of that package, so a SAME-PACKAGE INTEGRATION consumer is already guaranteed and `env!(\"CARGO_BIN_EXE_*\")` adds NO edge there -- the first remedy claim to the contrary was measured FALSE and the register entry was corrected. The real exposure is CROSS-PACKAGE consumers and SAME-PACKAGE UNIT tests, which get no `CARGO_BIN_EXE_*` at all; that unit member (`crates/spt/src/cli.rs`, resolving `format!(\"translate_proof_fixture{EXE_SUFFIX}\")` relative to `current_exe()`) is exactly why `.github/workflows/ci.yml:105-106` hand-prebuilds that fixture. THE CHECK READS THE DEPENDENCY SITUATION, NOT THE EXPRESSION -- owning package, consuming package, target kind -- so it classifies an UNCONVERTED tree correctly and stays true after any consumer is rewritten; that property is what makes it adoptable independently of the sibling_bin->CARGO_BIN_EXE_ conversion lane. FOUR SYNTAXES NAME A FIXTURE BIN and all four are detected: `sibling_bin(\"n\")`, `CARGO_BIN_EXE_n`, the shared resolver `fixture_bin(\"n\", \"cargo build ...\")` (crates/spt-term/tests/support/fixture_bin.rs), and the `current_exe()`-relative `format!(\"n{...}\")`. A TWO-SYNTAX DETECTOR IS THE FAILURE MODE THIS REQUIREMENT EXISTS OVER: the first prototype knew two, missed seven sites including that unit member, and therefore returned a GREEN over the single gap the class was filed for -- a zero from a tool that could not see the known-real case. Population at 6d291e0: 185 consumer sites, 146 guaranteed, 39 needing an explicit build, 11 with no prebuild anywhere. THE 11 ARE NOT CI DEFECTS: a per-job mapping showed every narrow cargo invocation in CI is covered by its own job (prebuild or an earlier workspace-shaped build), so the exposure is narrow invocations OUTSIDE CI -- gate rigs and local `-p`/`--test`/`--bins` against a cold pool -- which is why the check ships as a runnable command and is deliberately NOT wired into `xtask check`: it exits 1 on today's tree and wiring it would red the docs gate over a hazard that is not a CI defect -- a gate that reds on a population of known non-defects gets ignored or gets its teeth pulled, and either way the next REAL member arrives into a check nobody reads (doyle ruling, 2026-08-03). THE WIRING CONDITION IS THEREFORE A COMMITTED BURN-DOWN BASELINE, NOT FIXING ALL 39 FIRST, and it ships here so the choice to wire is a one-line decision later rather than a second design problem: `--baseline` reds ONLY on a site absent from `crates/xtask/binedge-baseline.tsv`, exits 0 against today's recorded 11, and REPORTS recorded entries that are gone so the list shrinks instead of ossifying into a permitted-forever set nobody prunes. Baseline keys are `(file, bin)` and deliberately NOT line numbers, which churn on every edit above them and would make the file merge noise; the trade is named -- a SECOND red site for the same bin in an already-listed file is absorbed. TWO CONTROLS SHIP WITH IT RATHER THAN LIVING IN A RUNBOOK. `--no-prebuilds` empties the CI allowlist and must take the reds 11 -> 39 while the 146 cargo-guaranteed sites stay green; a green without that arm carries no information. The false-positive arm asserts the same-package fixture sites are classified guaranteed -- and REFUSES (exit 2) when it recognizes NONE of them, because an arm whose fixtures were renamed away reports `0 wrongly flagged`, which reads exactly like a pass. That arm also filters on target kind, not name alone: it was briefly wrong when a same-package UNIT consumer entered the population and CORRECTLY landed in the flagged set, so a control is a claim about a population and ages with one. Gate: impl -- `crates/xtask/src/binedge.rs` and its `binedge-check` subcommand: the four-syntax scanner over comment-blanked whole text (line comments only; block comments are a NAMED unfixed limit), the guarantee predicate, the nearest-manifest owner resolution, the prebuild-allowlist reader over every tracked file under `.github/` (a prebuild inside a PowerShell CI script guarantees a bin exactly as well as one in a `run:` block), the repo root taken from git IN THE INVOKED TREE rather than from the compile-time `CARGO_MANIFEST_DIR` (a prebuilt xtask would otherwise measure the tree it was BUILT in, and a verdict about the wrong tree is worse than none), the burn-down baseline with its write/compare/prune arms, and the two control arms; unit -- the guarantee predicate on all three of its wrong directions, the baseline delta reddening only on an unrecorded site while reporting a burned-down one (both asserted together, since a delta of nothing passes either alone), the path-kind reader, nearest-manifest ownership including the not-a-whole-component near miss, all four syntaxes with the line numbers the register already cites as evidence, comment blanking that does not shift the lines below it, the near misses that would each be a phantom site, prebuild detection refusing `--bins` (reading it as `--bin s` would fabricate a guarantee for a bin named `s`), and the false-positive arm's blind case with its refusal condition. PORT FIDELITY IS PART OF THE EVIDENCE: this replaces a python prototype whose numbers the register cites, and it was verified against that prototype site-by-site -- 185 tuples identical, not four summary integers, which can agree by coincidence -- with both run on ONE tree after proving the two candidate trees carried an identical `.rs` population. Kin REQ-XTASK-SPT-BIN-TARGET-DIR (the other xtask tooling defect about looking in the wrong place).",
2026-08-28T09:54:46.6015702Z       "requiredStages": [
2026-08-28T09:54:46.6015853Z         "impl",
2026-08-28T09:54:46.6016007Z         "unit"
2026-08-28T09:54:46.6016159Z       ],
2026-08-28T09:54:46.6016317Z       "stages": {
2026-08-28T09:54:46.6016469Z         "doc": {
2026-08-28T09:54:46.6016636Z           "complete": false,
2026-08-28T09:54:46.6016798Z           "evidence": []
2026-08-28T09:54:46.6016951Z         },
2026-08-28T09:54:46.6017113Z         "impl": {
2026-08-28T09:54:46.6017276Z           "complete": true,
2026-08-28T09:54:46.6017442Z           "evidence": [
2026-08-28T09:54:46.6017595Z             {
2026-08-28T09:54:46.6017794Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.6017958Z               "line": 350
2026-08-28T09:54:46.6018103Z             },
2026-08-28T09:54:46.6018261Z             {
2026-08-28T09:54:46.6018458Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6018702Z               "line": 52
2026-08-28T09:54:46.6018879Z             },
2026-08-28T09:54:46.6019092Z             {
2026-08-28T09:54:46.6019284Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6019441Z               "line": 288
2026-08-28T09:54:46.6019589Z             },
2026-08-28T09:54:46.6019741Z             {
2026-08-28T09:54:46.6019932Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6020095Z               "line": 303
2026-08-28T09:54:46.6020251Z             },
2026-08-28T09:54:46.6020529Z             {
2026-08-28T09:54:46.6020732Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6020897Z               "line": 323
2026-08-28T09:54:46.6021044Z             },
2026-08-28T09:54:46.6021194Z             {
2026-08-28T09:54:46.6021383Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6021541Z               "line": 374
2026-08-28T09:54:46.6021683Z             },
2026-08-28T09:54:46.6021831Z             {
2026-08-28T09:54:46.6022027Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6022179Z               "line": 390
2026-08-28T09:54:46.6022337Z             },
2026-08-28T09:54:46.6022484Z             {
2026-08-28T09:54:46.6022671Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6022827Z               "line": 398
2026-08-28T09:54:46.6022981Z             },
2026-08-28T09:54:46.6023127Z             {
2026-08-28T09:54:46.6023325Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6023485Z               "line": 412
2026-08-28T09:54:46.6023637Z             },
2026-08-28T09:54:46.6023785Z             {
2026-08-28T09:54:46.6023971Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6024133Z               "line": 436
2026-08-28T09:54:46.6024287Z             },
2026-08-28T09:54:46.6024434Z             {
2026-08-28T09:54:46.6024626Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6024782Z               "line": 460
2026-08-28T09:54:46.6024935Z             },
2026-08-28T09:54:46.6025082Z             {
2026-08-28T09:54:46.6025279Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6025435Z               "line": 543
2026-08-28T09:54:46.6025589Z             },
2026-08-28T09:54:46.6025749Z             {
2026-08-28T09:54:46.6025939Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6026104Z               "line": 551
2026-08-28T09:54:46.6026357Z             }
2026-08-28T09:54:46.6026519Z           ]
2026-08-28T09:54:46.6026671Z         },
2026-08-28T09:54:46.6026829Z         "int": {
2026-08-28T09:54:46.6026991Z           "complete": false,
2026-08-28T09:54:46.6027149Z           "evidence": []
2026-08-28T09:54:46.6027306Z         },
2026-08-28T09:54:46.6027458Z         "unit": {
2026-08-28T09:54:46.6027625Z           "complete": true,
2026-08-28T09:54:46.6027783Z           "evidence": [
2026-08-28T09:54:46.6027935Z             {
2026-08-28T09:54:46.6028127Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6028282Z               "line": 732
2026-08-28T09:54:46.6028432Z             },
2026-08-28T09:54:46.6028583Z             {
2026-08-28T09:54:46.6028849Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6029144Z               "line": 759
2026-08-28T09:54:46.6029299Z             },
2026-08-28T09:54:46.6029454Z             {
2026-08-28T09:54:46.6029643Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6029797Z               "line": 799
2026-08-28T09:54:46.6029943Z             },
2026-08-28T09:54:46.6030092Z             {
2026-08-28T09:54:46.6030287Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6030450Z               "line": 836
2026-08-28T09:54:46.6030597Z             },
2026-08-28T09:54:46.6030751Z             {
2026-08-28T09:54:46.6030941Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6031099Z               "line": 858
2026-08-28T09:54:46.6031249Z             },
2026-08-28T09:54:46.6031402Z             {
2026-08-28T09:54:46.6031590Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6031749Z               "line": 881
2026-08-28T09:54:46.6031900Z             },
2026-08-28T09:54:46.6032058Z             {
2026-08-28T09:54:46.6032248Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6032401Z               "line": 922
2026-08-28T09:54:46.6032558Z             },
2026-08-28T09:54:46.6032710Z             {
2026-08-28T09:54:46.6033039Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6033197Z               "line": 934
2026-08-28T09:54:46.6033354Z             },
2026-08-28T09:54:46.6033512Z             {
2026-08-28T09:54:46.6033697Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6033857Z               "line": 945
2026-08-28T09:54:46.6034007Z             },
2026-08-28T09:54:46.6034159Z             {
2026-08-28T09:54:46.6034345Z               "path": "crates/xtask/src/binedge.rs",
2026-08-28T09:54:46.6034503Z               "line": 965
2026-08-28T09:54:46.6034665Z             }
2026-08-28T09:54:46.6034813Z           ]
2026-08-28T09:54:46.6034961Z         }
2026-08-28T09:54:46.6035098Z       }
2026-08-28T09:54:46.6035247Z     },
2026-08-28T09:54:46.6035399Z     {
2026-08-28T09:54:46.6035585Z       "id": "REQ-FIXTURE-BIN-PERJOB-DRIFT",
2026-08-28T09:54:46.6056348Z       "title": "The per-job companion to REQ-FIXTURE-BIN-BUILD-EDGE, and it is a DRIFT GUARD, NOT A FINDER. `xtask perjob-map` walks every CI job step by step and asks, for each narrow cargo invocation, whether the cross-package fixture bins its tests consume were built EARLIER IN THAT JOB -- by an explicit `cargo build -p X --bin B` or by an earlier workspace-shaped build. On this tree the answer is 7 narrow invocations, 0 unguaranteed, which is what establishes that the 11 repo-wide reds are NOT CI defects. THAT ZERO IS A FACT ABOUT TODAY'S WORKFLOWS AND NOTHING MORE, and the requirement says so because the tool's value is entirely in the FUTURE case: the day somebody adds a narrow invocation to a job that does not build what it consumes. A requirement that framed this as proof the class is closed would license deleting it the moment the register entry is written. THE ONE MODELLING TRAP, already paid for once: a workspace-shaped run emits the plain binaries only if it actually builds integration-test targets -- `--workspace` filtered to `-E 'kind(lib) + kind(bin)'` compiles lib/bin harnesses and emits NO plain fixture exe on a clean pool, which is exactly what `ci.yml:102-106` documents and hand-prebuilds around. The first prototype credited it as a builder and returned a GREEN over the one known-real gap; the kind-filter test is therefore a required unit row, not an optional one. THE SCRIPT-BLIND HOLE IS PRINTED IN THE COMMAND'S OWN OUTPUT RATHER THAN FOOTNOTED IN A DOC. The model reads `run:` blocks in workflow YAML; narrow cargo invocations ALSO live inside `.github/ci/*.ps1` and `*.sh`, which those blocks merely invoke, and no `run:` parser can see inside them. Rather than leave that as a limitation somebody has to remember, the scripts are scanned with the SAME detector and every narrow invocation they contain is listed as UNMODELLED with the cross-package bins it consumes: today 2 instances (`g6-curve.ps1`, `g6-postbounce.ps1`, both `-p spt-daemon --test inject_control_wedge`), both consuming NONE, so the hole is real and its instance count is measured at zero instead of asserted. An UNMODELLED invocation that DOES consume a cross-package bin counts as a gap and reds the command, because a verdict nobody can compute must not read green. THAT SCAN NEEDED ITS OWN CORRECTION, AND THE DIRECTION MATTERS: scanning the scripts raw read `reap-census.ps1`'s comment-based-help block -- which DESCRIBES a `cargo test -p spt --test ...` failure in prose -- as a real invocation consuming three cross-package bins, i.e. a fabricated gap inside the section whose entire job is honesty about what cannot be seen. PowerShell `<# #>` blocks and whole-line `#` comments are stripped; a TRAILING `#` deliberately is not, because in sh that would eat `${var#foo}` and losing a real invocation is the worse direction here. THE YAML IS PARSED BY A DELIBERATELY SMALL SUBSET READER, AND ITS FAILURE MODE IS ACCOUNTED RATHER THAN TRUSTED: xtask carries no parser dependency, and a silent mis-parse would DROP steps, after which every job those steps belonged to would read guaranteed -- a green manufactured by not looking. So the reader counts the `run:` command keys present in the file and refuses (exit 2) unless it attributed every one of them to a job. A `run:` that opens a mapping rather than a command (`defaults.run.shell`) is not a command key on either side of that count. LIMITS THAT REMAIN OPEN AND ARE NAMED IN THE COMMAND'S OWN DOC: `uses:` steps are not followed, and guarantee is tracked per job in step order without modelling artifact reuse across jobs on a persistent self-hosted workdir -- and our golden boxes ARE persistent, so a WORKSPACE verdict is sound only within its job and a clean runner could still expose what reuse masks. Gate: impl -- `crates/xtask/src/perjob.rs` and its `perjob-map` subcommand: the consumed-bin index over integration-test targets and over the unit population (unit tests get no `CARGO_BIN_EXE_*` at all, which is why `-E 'kind(lib)+kind(bin)'` is a CONSUMER step), the step walker with its prebuild and workspace-build guarantees, the accounted YAML subset reader, the script scan with its comment stripping, and the reuse of REQ-FIXTURE-BIN-BUILD-EDGE's detector rather than a second one (mapping through a different detector would produce a per-job verdict over a different population); unit -- the parser refusing an unattributable `run:`, block and inline bodies both surviving while `uses:` and `#` lines do not, cargo invocations stopping at a shell separator and `nextest run` not being read as the shorter `test` verb, the kind-filtered workspace run classified as consumer rather than builder, flag values requiring the whole flag (`--bins` is not `--bin s`), script prose not being read as an invocation, and a job guaranteeing by prebuild, by workspace build, and failing when neither ran. THE GUARD WAS OBSERVED FIRING ON A REAL FALSE STATE, not only in tests: while this lane was in progress the checker's own test fixture named `CARGO_BIN_EXE_git_fixture` unescaped in a tracked `src/` file, which entered the unit-consumer population and made this map report a gap in `ci.yml`'s unit lane and exit 1. Kin REQ-FIXTURE-BIN-BUILD-EDGE (the repo-wide half, whose detector and helpers this reuses).",
2026-08-28T09:54:46.6056872Z       "requiredStages": [
2026-08-28T09:54:46.6057025Z         "impl",
2026-08-28T09:54:46.6057187Z         "unit"
2026-08-28T09:54:46.6057340Z       ],
2026-08-28T09:54:46.6057491Z       "stages": {
2026-08-28T09:54:46.6057648Z         "doc": {
2026-08-28T09:54:46.6057813Z           "complete": false,
2026-08-28T09:54:46.6057976Z           "evidence": []
2026-08-28T09:54:46.6058123Z         },
2026-08-28T09:54:46.6058276Z         "impl": {
2026-08-28T09:54:46.6058433Z           "complete": true,
2026-08-28T09:54:46.6058591Z           "evidence": [
2026-08-28T09:54:46.6058742Z             {
2026-08-28T09:54:46.6058934Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6059178Z               "line": 39
2026-08-28T09:54:46.6059334Z             },
2026-08-28T09:54:46.6059493Z             {
2026-08-28T09:54:46.6059682Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6059841Z               "line": 256
2026-08-28T09:54:46.6059997Z             },
2026-08-28T09:54:46.6060156Z             {
2026-08-28T09:54:46.6060344Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6060506Z               "line": 300
2026-08-28T09:54:46.6060661Z             },
2026-08-28T09:54:46.6060809Z             {
2026-08-28T09:54:46.6061004Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6061158Z               "line": 360
2026-08-28T09:54:46.6061309Z             },
2026-08-28T09:54:46.6061467Z             {
2026-08-28T09:54:46.6061648Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6061810Z               "line": 440
2026-08-28T09:54:46.6061963Z             },
2026-08-28T09:54:46.6062116Z             {
2026-08-28T09:54:46.6062306Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6062468Z               "line": 551
2026-08-28T09:54:46.6062611Z             }
2026-08-28T09:54:46.6062769Z           ]
2026-08-28T09:54:46.6062924Z         },
2026-08-28T09:54:46.6063185Z         "int": {
2026-08-28T09:54:46.6063357Z           "complete": false,
2026-08-28T09:54:46.6063514Z           "evidence": []
2026-08-28T09:54:46.6063662Z         },
2026-08-28T09:54:46.6063814Z         "unit": {
2026-08-28T09:54:46.6063977Z           "complete": true,
2026-08-28T09:54:46.6064134Z           "evidence": [
2026-08-28T09:54:46.6064283Z             {
2026-08-28T09:54:46.6064477Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6064626Z               "line": 601
2026-08-28T09:54:46.6064778Z             },
2026-08-28T09:54:46.6064927Z             {
2026-08-28T09:54:46.6065116Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6065331Z               "line": 616
2026-08-28T09:54:46.6065469Z             },
2026-08-28T09:54:46.6065613Z             {
2026-08-28T09:54:46.6065796Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6065960Z               "line": 640
2026-08-28T09:54:46.6066111Z             },
2026-08-28T09:54:46.6066260Z             {
2026-08-28T09:54:46.6066445Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6066603Z               "line": 651
2026-08-28T09:54:46.6066750Z             },
2026-08-28T09:54:46.6066899Z             {
2026-08-28T09:54:46.6067079Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6067238Z               "line": 662
2026-08-28T09:54:46.6067399Z             },
2026-08-28T09:54:46.6067543Z             {
2026-08-28T09:54:46.6067728Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6067881Z               "line": 682
2026-08-28T09:54:46.6068042Z             },
2026-08-28T09:54:46.6068180Z             {
2026-08-28T09:54:46.6068363Z               "path": "crates/xtask/src/perjob.rs",
2026-08-28T09:54:46.6068512Z               "line": 696
2026-08-28T09:54:46.6068664Z             }
2026-08-28T09:54:46.6068818Z           ]
2026-08-28T09:54:46.6069151Z         }
2026-08-28T09:54:46.6069302Z       }
2026-08-28T09:54:46.6069447Z     },
2026-08-28T09:54:46.6069603Z     {
2026-08-28T09:54:46.6069790Z       "id": "REQ-FLAKE-LEDGER-KEYED-ROWS",
2026-08-28T09:54:46.6079625Z       "title": "releases#95: `docs/FLAKE-LEDGER.md` rows are keyed by the TEST (or CI-step) NAME, never by a hand-numbered position column. The number column made an append-at-end table into a merge hazard — two lanes each appending \"row N+1\" conflict textually AND mint the same N — but the harder half is that a POSITIONAL key can be squatted: commit 5199464 (2026-07-15) minted the citation `FLAKE-LEDGER #15` for the HEAVY-AT-BIRTH classification ruling WITHOUT adding a ledger row (the table was 14 rows before and after), the label then propagated to 20 further sites across `.config/nextest.toml`, six test-file headers, two triage docs and this registry, and commit e1a3338 (2026-08-01) appended a genuinely unrelated row 15 (the servicehost pid-identity defect) — so every in-tree `#15` citation silently resolved to the wrong entry until this change. The fix is therefore BOTH halves in one commit: drop the column AND re-key every citation, in-table and out. In-table backrefs (rows citing #7/#8/#10/#12/#13 in their own prose) become test names; external citations become `FLAKE-LEDGER: <test name>`; the phantom `#15` class is re-pointed at what it actually names — the HEAVY-AT-BIRTH ruling, whose canonical text is the `.config/nextest.toml` <HEAVY> stanza, cited by ruling name and not by any number. Gate: doc — the ledger states the keying discipline, carries no number column, and BACKFILLS the row the phantom number concealed. That backfill was deferred to doyle at first report and handed back (2026-08-02): the primary RCA log predates doyle's last context reset and is not retained, so the 20 citation sites plus `5199464`'s own commit message — which ends \"Ledger entry appended.\" over a diff that touches only `ci.yml` and `.config/nextest.toml` — ARE the surviving record. The row is therefore written in date order rather than appended, and states in its own status column that it is reconstructed and which evidence (run ids, per-sighting timestamps, raw gate logs) did not survive; a backfill indistinguishable from a contemporaneous row would be cited as if it carried primary evidence. The ledger intro carries that backfill discipline as a standing rule. Kin REQ-HEAVY-UNIT-CLASSIFICATION, REQ-CI-WINDOWS-PHASE-A-BOUND (both cite the ledger).",
2026-08-28T09:54:46.6079940Z       "requiredStages": [
2026-08-28T09:54:46.6080092Z         "doc"
2026-08-28T09:54:46.6080249Z       ],
2026-08-28T09:54:46.6080397Z       "stages": {
2026-08-28T09:54:46.6080555Z         "doc": {
2026-08-28T09:54:46.6080712Z           "complete": true,
2026-08-28T09:54:46.6080870Z           "evidence": [
2026-08-28T09:54:46.6081018Z             {
2026-08-28T09:54:46.6081209Z               "path": "docs/FLAKE-LEDGER.md",
2026-08-28T09:54:46.6081365Z               "line": 8
2026-08-28T09:54:46.6081516Z             }
2026-08-28T09:54:46.6081673Z           ]
2026-08-28T09:54:46.6081819Z         },
2026-08-28T09:54:46.6081973Z         "impl": {
2026-08-28T09:54:46.6082134Z           "complete": false,
2026-08-28T09:54:46.6082287Z           "evidence": []
2026-08-28T09:54:46.6082434Z         },
2026-08-28T09:54:46.6082588Z         "int": {
2026-08-28T09:54:46.6082754Z           "complete": false,
2026-08-28T09:54:46.6082917Z           "evidence": []
2026-08-28T09:54:46.6083064Z         },
2026-08-28T09:54:46.6083213Z         "unit": {
2026-08-28T09:54:46.6083383Z           "complete": false,
2026-08-28T09:54:46.6083542Z           "evidence": []
2026-08-28T09:54:46.6083698Z         }
2026-08-28T09:54:46.6083843Z       }
2026-08-28T09:54:46.6083998Z     },
2026-08-28T09:54:46.6084150Z     {
2026-08-28T09:54:46.6084324Z       "id": "REQ-FORK-ACCESS-GATED",
2026-08-28T09:54:46.6095223Z       "title": "A wire-borne fork is refused unless the access chain admits it, gated on the SAME (target endpoint x surface x subject) shape as every other control surface and on the HANDSHAKE-PROVEN origin node — never on any field the request carries. The target endpoint is the SOURCE being forked, because that is the endpoint whose mind is about to be copied and therefore the endpoint whose owner's grant is the one that matters. THE SURFACE IS `attributable: false` FOR THIS WAVE, and it is a deliberate restriction rather than an oversight: only families carrying a daemon-stamped, session-proven sender endpoint may be attributable, and making fork the second such family would change WHICH SUBJECT TIER can express a fork grant — sender-endpoint rules would become real for it, not just node-tier ones — which is a second decision riding a wave that was scoped to one. So node-tier subjects govern fork, a sender-endpoint rule naming it is dead on arrival exactly as the table's restrictive default says, and the flip later is a ONE-ROW EDIT with no re-ruling, through the same door XFER already stands in front of. Because the surface table is the single source for that property (and reads case-insensitively since releases#66), a future flip cannot leave one reader disagreeing with another. A REFUSAL FORKS NOTHING AND SAYS NOTHING BACK beyond the family's existing refusal posture — the attach/rest precedent, where existence is not advertised to an unadmitted caller. THE SYNERGY WITH releases#66 IS STATED SO IT IS NOT MISTAKEN FOR LUCK: because `knock list` now composes its prescription from the same predicate the approve path decides on, a knock requesting FORK prescribes the whole-machine acknowledgment correctly from the day the surface exists, with no per-surface work — a non-attributable surface binds a node subject, which is the widening form, and the listing says so because it asks rather than because someone remembered to teach it. Gate: unit — a node the chain admits for FORK is served while one it does not is refused with nothing created, a grant on a DIFFERENT surface does not admit the same node to fork (the per-surface isolation property the vocabulary exists for), the gate reads the proven origin rather than any claimed field, and a fork grant expressed as a sender-endpoint rule does not admit (the attributable:false consequence, asserted so the restriction is evidenced rather than assumed).",
2026-08-28T09:54:46.6105712Z       "requiredStages": [
2026-08-28T09:54:46.6106121Z         "doc",
2026-08-28T09:54:46.6106441Z         "unit",
2026-08-28T09:54:46.6106756Z         "int"
2026-08-28T09:54:46.6107065Z       ],
2026-08-28T09:54:46.6107370Z       "stages": {
2026-08-28T09:54:46.6107705Z         "doc": {
2026-08-28T09:54:46.6108042Z           "complete": true,
2026-08-28T09:54:46.6108419Z           "evidence": [
2026-08-28T09:54:46.6108763Z             {
2026-08-28T09:54:46.6109220Z               "path": "docs-site/src/instances/overview.md",
2026-08-28T09:54:46.6109688Z               "line": 119
2026-08-28T09:54:46.6110041Z             }
2026-08-28T09:54:46.6110353Z           ]
2026-08-28T09:54:46.6110657Z         },
2026-08-28T09:54:46.6110967Z         "impl": {
2026-08-28T09:54:46.6111305Z           "complete": true,
2026-08-28T09:54:46.6111678Z           "evidence": [
2026-08-28T09:54:46.6112012Z             {
2026-08-28T09:54:46.6112445Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6112908Z               "line": 1680
2026-08-28T09:54:46.6113259Z             },
2026-08-28T09:54:46.6113572Z             {
2026-08-28T09:54:46.6113944Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6114406Z               "line": 1818
2026-08-28T09:54:46.6114758Z             },
2026-08-28T09:54:46.6115073Z             {
2026-08-28T09:54:46.6115437Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.6115887Z               "line": 224
2026-08-28T09:54:46.6116235Z             }
2026-08-28T09:54:46.6116548Z           ]
2026-08-28T09:54:46.6116849Z         },
2026-08-28T09:54:46.6117154Z         "int": {
2026-08-28T09:54:46.6117483Z           "complete": true,
2026-08-28T09:54:46.6117873Z           "evidence": [
2026-08-28T09:54:46.6118433Z             {
2026-08-28T09:54:46.6118874Z               "path": "crates/spt/tests/fork_surface_e2e.rs",
2026-08-28T09:54:46.6119418Z               "line": 65
2026-08-28T09:54:46.6119775Z             },
2026-08-28T09:54:46.6120080Z             {
2026-08-28T09:54:46.6120467Z               "path": "crates/spt/tests/fork_surface_e2e.rs",
2026-08-28T09:54:46.6120928Z               "line": 125
2026-08-28T09:54:46.6121284Z             },
2026-08-28T09:54:46.6121604Z             {
2026-08-28T09:54:46.6121975Z               "path": "crates/spt/tests/fork_surface_e2e.rs",
2026-08-28T09:54:46.6122480Z               "line": 162
2026-08-28T09:54:46.6122882Z             },
2026-08-28T09:54:46.6123248Z             {
2026-08-28T09:54:46.6123610Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:46.6124059Z               "line": 799
2026-08-28T09:54:46.6124408Z             }
2026-08-28T09:54:46.6124718Z           ]
2026-08-28T09:54:46.6125023Z         },
2026-08-28T09:54:46.6125338Z         "unit": {
2026-08-28T09:54:46.6125740Z           "complete": true,
2026-08-28T09:54:46.6126206Z           "evidence": [
2026-08-28T09:54:46.6126551Z             {
2026-08-28T09:54:46.6126912Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.6127357Z               "line": 441
2026-08-28T09:54:46.6127710Z             },
2026-08-28T09:54:46.6128067Z             {
2026-08-28T09:54:46.6128424Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:46.6128874Z               "line": 481
2026-08-28T09:54:46.6129297Z             }
2026-08-28T09:54:46.6129607Z           ]
2026-08-28T09:54:46.6129907Z         }
2026-08-28T09:54:46.6130203Z       }
2026-08-28T09:54:46.6130493Z     },
2026-08-28T09:54:46.6137402Z     {
2026-08-28T09:54:46.6137821Z       "id": "REQ-FORK-CONTROL-SURFACE",
2026-08-28T09:54:46.6160011Z       "title": "Forking an endpoint is reachable from another node, as a CONTROL SURFACE in the ratified sense — 'a named remote-reachable operation class on an endpoint' (CONTEXT.md, access-control grill 2026-07-28). Today `spt fork` is local-only and says so: a source that is not on this node is refused outright. THE SURFACE ID IS MINTED, NOT INVENTED, and the distinction is the whole of the design fork raised before building: the control-surface vocabulary is RATIFIED OPEN — 'new surfaces mint ids without a schema change', and 'later waves mint their ids when the capability itself is built' — so a one-row addition to the surface table is the extension MECHANISM the model was given, not a new grant vocabulary. Nothing else in the access model moves: no new tier, no new subject kind, no new authority, no new decision; the grant is expressed entirely in the existing (target endpoint x surface x subject) shape, and the chain, the modes, the fail-closed degrade and the mutation seam are untouched. GATING IT UNDER AN EXISTING SURFACE IS REFUSED ON THE RECORD rather than left unconsidered — it is the only way to add the capability without minting an id, and it is the W3 dishonesty class exactly: a fork copies an endpoint's ENTIRE MIND (live context, role, every project tier, every monic), so folding it under SUSPEND or XFER would mean an operator who granted 'you may suspend my agent' or 'you may transfer files' had silently also granted 'you may clone my agent's whole mind'. A grant that confers an authority its name does not describe is worse than a refusal, and REQ-ACL-SURFACE-VOCAB exists precisely because ADR-0009's all-or-nothing whitelist did this. THE WIRE RECORD IS `kind`-TAGGED, on the knock precedent and for the same N-1 reason rather than for symmetry: the untagged `WanMessage` classification sniffs `target`+`op_id` on a stream's first line, so an untagged fork request would be claimed by that arm and DELIVERED INTO SOMEBODY'S SPOOL AS A CHAT MESSAGE by a receiver too old to know the verb. Tagged, it lands in the dispatcher's tagged arm, which an N-1 daemon resolves to the unknown family and DROPS CLEANLY — a fork request that never arrives at an old node is the correct degrade; one misread as a message is not. That degrade is PINNED BY TEST, not assumed. The new stream family must also be learned by the family census (`StreamFamily::ALL`) and every exhaustive walk over it — named here because a family added to the enum but not to the census is precisely the assembly gap that had to be repaired once already. THE REMOTE ARM NEVER DELETES THE SOURCE. `--delete-source` stays a local-only flag: deleting an endpoint is not forking, so carrying it would put two authorities under one grant (the same fault the surface split exists to prevent, re-committed inside a single verb), the destructive half is unrecoverable where the additive half is not, and the local path's 'the fork is complete; re-run to delete' degrade assumes an operator standing there, which a wire caller is not. AND THE CLI REFUSES `--delete-source` AGAINST A REMOTE TARGET LOUDLY RATHER THAN TRIMMING IT (ruled): silently forking-without-deleting honours half an invocation, which is prescribe-then-mislead in miniature — the operator asked for one thing, got another, and was not told. Refuse, do not trim. Gate: impl — the surface id, the tagged wire record with its decoder and one-shot reply, the new stream family classified and routed, the census learning it, the target-side serve that performs the fork where the source lives, the client arm that dials the resolved node, and the loud remote-plus-delete-source refusal; unit — the record round-trips and carries its tag, an N-1 receiver classifies it unknown and drops it (the anti-spool row), the family census contains it, the remote-plus-delete-source invocation is refused with nothing forked, and a local fork is unchanged; int — the receiving side end to end over REAL stores: an admitted request produces a whole new endpoint on the node that holds the source (perch record, home subnet, adapter carried, and the source's monics riding the mind), the source is left intact, and a request from a node admitted only for a NEIGHBOURING surface produces nothing and answers nothing. THE INT ROW IS STATED BY REPLACEMENT AND ITS LIMIT IS NAMED RATHER THAN GLOSSED: it was minted as 'driven across a real node boundary', and what is proven is everything on the receiving side EXCEPT the QUIC hop itself. The hop is unit-covered where its risk actually lives — the tagged record round-trips, is never classified as the message family, and an N-1 daemon drops it — and a genuine two-node rung belongs on the env-gated two-host rig, which does not run in ordinary sweeps. Claiming the boundary here on the strength of a same-process test would be the promise this project asks for evidence instead of.",
2026-08-28T09:54:46.6179671Z       "requiredStages": [
2026-08-28T09:54:46.6180037Z         "doc",
2026-08-28T09:54:46.6180366Z         "impl",
2026-08-28T09:54:46.6180686Z         "unit",
2026-08-28T09:54:46.6181006Z         "int"
2026-08-28T09:54:46.6181321Z       ],
2026-08-28T09:54:46.6181616Z       "stages": {
2026-08-28T09:54:46.6181935Z         "doc": {
2026-08-28T09:54:46.6182268Z           "complete": true,
2026-08-28T09:54:46.6182650Z           "evidence": [
2026-08-28T09:54:46.6182984Z             {
2026-08-28T09:54:46.6183347Z               "path": "docs-site/src/instances/overview.md",
2026-08-28T09:54:46.6183803Z               "line": 51
2026-08-28T09:54:46.6184146Z             }
2026-08-28T09:54:46.6184449Z           ]
2026-08-28T09:54:46.6184745Z         },
2026-08-28T09:54:46.6185046Z         "impl": {
2026-08-28T09:54:46.6185375Z           "complete": true,
2026-08-28T09:54:46.6186195Z           "evidence": [
2026-08-28T09:54:46.6186534Z             {
2026-08-28T09:54:46.6186896Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6187387Z               "line": 145
2026-08-28T09:54:46.6187745Z             },
2026-08-28T09:54:46.6188079Z             {
2026-08-28T09:54:46.6188452Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6188909Z               "line": 253
2026-08-28T09:54:46.6189358Z             },
2026-08-28T09:54:46.6189822Z             {
2026-08-28T09:54:46.6190198Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6190655Z               "line": 1081
2026-08-28T09:54:46.6191014Z             },
2026-08-28T09:54:46.6191333Z             {
2026-08-28T09:54:46.6191691Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6192158Z               "line": 1679
2026-08-28T09:54:46.6192514Z             },
2026-08-28T09:54:46.6192833Z             {
2026-08-28T09:54:46.6193191Z               "path": "crates/spt-daemon/src/forkop.rs",
2026-08-28T09:54:46.6193645Z               "line": 15
2026-08-28T09:54:46.6193983Z             },
2026-08-28T09:54:46.6194293Z             {
2026-08-28T09:54:46.6194650Z               "path": "crates/spt-daemon/src/forkop.rs",
2026-08-28T09:54:46.6195094Z               "line": 60
2026-08-28T09:54:46.6195428Z             },
2026-08-28T09:54:46.6195738Z             {
2026-08-28T09:54:46.6196102Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.6196549Z               "line": 383
2026-08-28T09:54:46.6196902Z             },
2026-08-28T09:54:46.6197207Z             {
2026-08-28T09:54:46.6197555Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.6197990Z               "line": 401
2026-08-28T09:54:46.6198329Z             },
2026-08-28T09:54:46.6198644Z             {
2026-08-28T09:54:46.6199083Z               "path": "crates/spt-net/src/net/forkmsg.rs",
2026-08-28T09:54:46.6199545Z               "line": 39
2026-08-28T09:54:46.6199884Z             },
2026-08-28T09:54:46.6200206Z             {
2026-08-28T09:54:46.6200562Z               "path": "crates/spt-net/src/net/forkmsg.rs",
2026-08-28T09:54:46.6201011Z               "line": 51
2026-08-28T09:54:46.6201359Z             },
2026-08-28T09:54:46.6201669Z             {
2026-08-28T09:54:46.6202031Z               "path": "crates/spt-net/src/net/forkmsg.rs",
2026-08-28T09:54:46.6202475Z               "line": 55
2026-08-28T09:54:46.6202814Z             },
2026-08-28T09:54:46.6203131Z             {
2026-08-28T09:54:46.6203703Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:46.6204148Z               "line": 152
2026-08-28T09:54:46.6204501Z             },
2026-08-28T09:54:46.6204816Z             {
2026-08-28T09:54:46.6205149Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.6205583Z               "line": 5171
2026-08-28T09:54:46.6205931Z             },
2026-08-28T09:54:46.6206246Z             {
2026-08-28T09:54:46.6206584Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.6207020Z               "line": 658
2026-08-28T09:54:46.6207373Z             },
2026-08-28T09:54:46.6207683Z             {
2026-08-28T09:54:46.6208026Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.6208460Z               "line": 689
2026-08-28T09:54:46.6208803Z             },
2026-08-28T09:54:46.6209184Z             {
2026-08-28T09:54:46.6209529Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.6209967Z               "line": 728
2026-08-28T09:54:46.6210306Z             },
2026-08-28T09:54:46.6210644Z             {
2026-08-28T09:54:46.6210984Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.6211422Z               "line": 765
2026-08-28T09:54:46.6211766Z             }
2026-08-28T09:54:46.6212071Z           ]
2026-08-28T09:54:46.6212371Z         },
2026-08-28T09:54:46.6212672Z         "int": {
2026-08-28T09:54:46.6213001Z           "complete": true,
2026-08-28T09:54:46.6213365Z           "evidence": [
2026-08-28T09:54:46.6213705Z             {
2026-08-28T09:54:46.6214073Z               "path": "crates/spt/tests/fork_surface_e2e.rs",
2026-08-28T09:54:46.6214536Z               "line": 64
2026-08-28T09:54:46.6214879Z             },
2026-08-28T09:54:46.6215184Z             {
2026-08-28T09:54:46.6215537Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:46.6216003Z               "line": 798
2026-08-28T09:54:46.6216350Z             },
2026-08-28T09:54:46.6216797Z             {
2026-08-28T09:54:46.6217227Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:46.6217684Z               "line": 1170
2026-08-28T09:54:46.6218026Z             }
2026-08-28T09:54:46.6218328Z           ]
2026-08-28T09:54:46.6218615Z         },
2026-08-28T09:54:46.6218932Z         "unit": {
2026-08-28T09:54:46.6219358Z           "complete": true,
2026-08-28T09:54:46.6219716Z           "evidence": [
2026-08-28T09:54:46.6220055Z             {
2026-08-28T09:54:46.6220413Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6220875Z               "line": 2357
2026-08-28T09:54:46.6221232Z             },
2026-08-28T09:54:46.6221549Z             {
2026-08-28T09:54:46.6221921Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.6222370Z               "line": 2482
2026-08-28T09:54:46.6222718Z             },
2026-08-28T09:54:46.6223033Z             {
2026-08-28T09:54:46.6223399Z               "path": "crates/spt-net/src/net/forkmsg.rs",
2026-08-28T09:54:46.6223852Z               "line": 142
2026-08-28T09:54:46.6224203Z             },
2026-08-28T09:54:46.6224509Z             {
2026-08-28T09:54:46.6224871Z               "path": "crates/spt-net/src/net/forkmsg.rs",
2026-08-28T09:54:46.6225325Z               "line": 159
2026-08-28T09:54:46.6225673Z             },
2026-08-28T09:54:46.6225988Z             {
2026-08-28T09:54:46.6226330Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.6227090Z               "line": 33336
2026-08-28T09:54:46.6227492Z             },
2026-08-28T09:54:46.6227806Z             {
2026-08-28T09:54:46.6228164Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.6228616Z               "line": 1906
2026-08-28T09:54:46.6229056Z             }
2026-08-28T09:54:46.6229368Z           ]
2026-08-28T09:54:46.6229680Z         }
2026-08-28T09:54:46.6229995Z       }
2026-08-28T09:54:46.6230300Z     },
2026-08-28T09:54:46.6230600Z     {
2026-08-28T09:54:46.6230925Z       "id": "REQ-FORK-MIND-COMPLETE",
2026-08-28T09:54:46.6239880Z       "title": "Forking an endpoint copies its tracked MIND TIER AS A WHOLE DIRECTORY AT TIP — every tracked file in the source's agent branch, enumerated from the tree itself — never a list of filenames the copy function happens to know. The enumerating shape is not a style preference: a fork that reads named files drops every mind file nobody remembered to add to the list, silently, one omission per file, and the loss is discoverable only by someone later noticing an absence. It had already happened in the field before this requirement existed: the live ROLE file (the endpoint's durable statement of purpose) was tracked on the same branch and was simply not copied, so every fork produced an endpoint whose role had vanished, and the next mind file to be added would have been lost exactly the same way. Copying the directory closes the past gap and the future ones in one structural move. EXACTLY ONE EXCLUSION, and it is a decision rather than an omission: surfaced-but-unresolved conflict artifacts stay with the mind that surfaced them, because a fork starts clean — a fork inheriting the source's unresolved pairs would make 'the fork starts clean' quietly false. Bytes are copied as bytes, not through a lossy UTF-8 round trip: the tier's file shapes are not the fork path's business. Sibling seams are unaffected by construction — a rename MOVES the whole worktree and so has never had this defect, and removal is explicit — so this requirement binds the fork path and is proved by a test whose load-bearing row is a file NO CONSTANT IN THE CRATE NAMES. Gate: impl — the tree-enumerated whole-directory copy with the conflict exclusion named as such; unit — a fork carries (a) a file no code path names, (b) a file nested a directory deep, so 'whole directory' means the tree rather than its top level, and (c) the live role file, the real gap this closes; while carrying NO conflict artifact, with the source keeping all of it, and the pre-existing copy-then-diverge behavior unchanged.",
2026-08-28T09:54:46.6248487Z       "requiredStages": [
2026-08-28T09:54:46.6248878Z         "doc",
2026-08-28T09:54:46.6249284Z         "impl",
2026-08-28T09:54:46.6249604Z         "unit"
2026-08-28T09:54:46.6249914Z       ],
2026-08-28T09:54:46.6250220Z       "stages": {
2026-08-28T09:54:46.6250546Z         "doc": {
2026-08-28T09:54:46.6250882Z           "complete": true,
2026-08-28T09:54:46.6251250Z           "evidence": [
2026-08-28T09:54:46.6251593Z             {
2026-08-28T09:54:46.6251970Z               "path": "docs-site/src/instances/overview.md",
2026-08-28T09:54:46.6252438Z               "line": 31
2026-08-28T09:54:46.6252790Z             }
2026-08-28T09:54:46.6253108Z           ]
2026-08-28T09:54:46.6253411Z         },
2026-08-28T09:54:46.6253716Z         "impl": {
2026-08-28T09:54:46.6254046Z           "complete": true,
2026-08-28T09:54:46.6254418Z           "evidence": [
2026-08-28T09:54:46.6254761Z             {
2026-08-28T09:54:46.6255132Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6255595Z               "line": 410
2026-08-28T09:54:46.6255946Z             },
2026-08-28T09:54:46.6256251Z             {
2026-08-28T09:54:46.6256624Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6257096Z               "line": 470
2026-08-28T09:54:46.6257458Z             },
2026-08-28T09:54:46.6257763Z             {
2026-08-28T09:54:46.6258134Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6258751Z               "line": 491
2026-08-28T09:54:46.6259205Z             }
2026-08-28T09:54:46.6259548Z           ]
2026-08-28T09:54:46.6259845Z         },
2026-08-28T09:54:46.6260150Z         "int": {
2026-08-28T09:54:46.6260475Z           "complete": false,
2026-08-28T09:54:46.6260841Z           "evidence": []
2026-08-28T09:54:46.6261181Z         },
2026-08-28T09:54:46.6261486Z         "unit": {
2026-08-28T09:54:46.6261815Z           "complete": true,
2026-08-28T09:54:46.6262177Z           "evidence": [
2026-08-28T09:54:46.6262520Z             {
2026-08-28T09:54:46.6263036Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6263501Z               "line": 764
2026-08-28T09:54:46.6263842Z             },
2026-08-28T09:54:46.6264152Z             {
2026-08-28T09:54:46.6264523Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6264982Z               "line": 829
2026-08-28T09:54:46.6265487Z             }
2026-08-28T09:54:46.6265802Z           ]
2026-08-28T09:54:46.6266098Z         }
2026-08-28T09:54:46.6266397Z       }
2026-08-28T09:54:46.6266693Z     },
2026-08-28T09:54:46.6266989Z     {
2026-08-28T09:54:46.6267299Z       "id": "REQ-FRONT-1",
2026-08-28T09:54:46.6267800Z       "title": "Day-one launcher/manager frontend (list/launch/attach/init)",
2026-08-28T09:54:46.6268351Z       "requiredStages": [],
2026-08-28T09:54:46.6268712Z       "stages": {
2026-08-28T09:54:46.6269126Z         "doc": {
2026-08-28T09:54:46.6269522Z           "complete": false,
2026-08-28T09:54:46.6269898Z           "evidence": []
2026-08-28T09:54:46.6270250Z         },
2026-08-28T09:54:46.6270556Z         "impl": {
2026-08-28T09:54:46.6270890Z           "complete": false,
2026-08-28T09:54:46.6271253Z           "evidence": []
2026-08-28T09:54:46.6271594Z         },
2026-08-28T09:54:46.6271897Z         "int": {
2026-08-28T09:54:46.6272231Z           "complete": false,
2026-08-28T09:54:46.6272604Z           "evidence": []
2026-08-28T09:54:46.6272938Z         },
2026-08-28T09:54:46.6273238Z         "unit": {
2026-08-28T09:54:46.6273577Z           "complete": false,
2026-08-28T09:54:46.6273958Z           "evidence": []
2026-08-28T09:54:46.6274317Z         }
2026-08-28T09:54:46.6274613Z       }
2026-08-28T09:54:46.6274908Z     },
2026-08-28T09:54:46.6275204Z     {
2026-08-28T09:54:46.6275514Z       "id": "REQ-GOLDEN-CI-LANE",
2026-08-28T09:54:46.6279562Z       "title": "Builder PRs run only the thin lint/unit/traceability lane; the full cross-platform suite runs once on the gater-assembled golden branch, never cancels in progress, and main advances only to that exact tested SHA. Both coordinated two-host jobs run by default on every golden branch and workflow_dispatch; manual dispatch exposes an explicit twohost opt-out for intentional evidence isolation, never an opt-in whose omission can silently skip the seam. Their dependency on the suite is a rendezvous barrier only: !cancelled() runs both roles after either suite result so an unrelated red cannot silently erase independent seam evidence. A checked-in flake registry may authorize exactly one same-SHA rerun for an exact test id with recorded evidence and a retirement condition; a rerun red blocks the batch. workflow_dispatch remains available for an explicit candidate SHA. (ADR-0050; ACCESS-CONTROL W0.)",
2026-08-28T09:54:46.6283641Z       "requiredStages": [
2026-08-28T09:54:46.6283997Z         "doc",
2026-08-28T09:54:46.6284312Z         "impl"
2026-08-28T09:54:46.6284612Z       ],
2026-08-28T09:54:46.6284924Z       "stages": {
2026-08-28T09:54:46.6285301Z         "doc": {
2026-08-28T09:54:46.6285625Z           "complete": true,
2026-08-28T09:54:46.6285992Z           "evidence": [
2026-08-28T09:54:46.6286331Z             {
2026-08-28T09:54:46.6286665Z               "path": "docs/GOLDEN-CI.md",
2026-08-28T09:54:46.6287080Z               "line": 3
2026-08-28T09:54:46.6287423Z             },
2026-08-28T09:54:46.6287728Z             {
2026-08-28T09:54:46.6288066Z               "path": "docs/GOLDEN-CI.md",
2026-08-28T09:54:46.6288475Z               "line": 28
2026-08-28T09:54:46.6288828Z             },
2026-08-28T09:54:46.6289230Z             {
2026-08-28T09:54:46.6289564Z               "path": "docs/GOLDEN-CI.md",
2026-08-28T09:54:46.6289971Z               "line": 84
2026-08-28T09:54:46.6290314Z             },
2026-08-28T09:54:46.6290618Z             {
2026-08-28T09:54:46.6290976Z               "path": "docs/RELEASE-RUNBOOK.md",
2026-08-28T09:54:46.6291424Z               "line": 226
2026-08-28T09:54:46.6291762Z             },
2026-08-28T09:54:46.6292068Z             {
2026-08-28T09:54:46.6292469Z               "path": "docs/adr/0050-golden-ci-merge-integration.md",
2026-08-28T09:54:46.6293071Z               "line": 25
2026-08-28T09:54:46.6293414Z             },
2026-08-28T09:54:46.6293719Z             {
2026-08-28T09:54:46.6294111Z               "path": "docs/adr/0050-golden-ci-merge-integration.md",
2026-08-28T09:54:46.6294591Z               "line": 59
2026-08-28T09:54:46.6294925Z             }
2026-08-28T09:54:46.6295243Z           ]
2026-08-28T09:54:46.6295556Z         },
2026-08-28T09:54:46.6296005Z         "impl": {
2026-08-28T09:54:46.6296420Z           "complete": true,
2026-08-28T09:54:46.6296781Z           "evidence": [
2026-08-28T09:54:46.6297124Z             {
2026-08-28T09:54:46.6297487Z               "path": ".github/workflows/ci.yml",
2026-08-28T09:54:46.6297923Z               "line": 17
2026-08-28T09:54:46.6298269Z             },
2026-08-28T09:54:46.6298669Z             {
2026-08-28T09:54:46.6299160Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.6299603Z               "line": 3
2026-08-28T09:54:46.6299941Z             },
2026-08-28T09:54:46.6300256Z             {
2026-08-28T09:54:46.6300611Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:46.6301044Z               "line": 27
2026-08-28T09:54:46.6301383Z             }
2026-08-28T09:54:46.6301684Z           ]
2026-08-28T09:54:46.6301984Z         },
2026-08-28T09:54:46.6302284Z         "int": {
2026-08-28T09:54:46.6302623Z           "complete": false,
2026-08-28T09:54:46.6302991Z           "evidence": []
2026-08-28T09:54:46.6303333Z         },
2026-08-28T09:54:46.6303645Z         "unit": {
2026-08-28T09:54:46.6303979Z           "complete": false,
2026-08-28T09:54:46.6304356Z           "evidence": []
2026-08-28T09:54:46.6304699Z         }
2026-08-28T09:54:46.6305000Z       }
2026-08-28T09:54:46.6305296Z     },
2026-08-28T09:54:46.6305591Z     {
2026-08-28T09:54:46.6305923Z       "id": "REQ-GOLDEN-RESPIN-TEST",
2026-08-28T09:54:46.6313613Z       "title": "BAROMETER (releases#105; operator-ruled 2026-08-02): a defect found on an ASSEMBLED golden head is triaged by two questions answered separately, in order, Q2 never feeding Q1. Q1 RESPIN classifies by WHERE THE DEFECT LIVES, never by which files the fix touches: a defect inside what golden validated (code, build config, tests, CI config, gated docs) invalidates the head's evidence and buys a respin — the refusal is the DEFAULT; a defect outside golden's evidence ships, and the fix re-homes to buy its evidence on the head it lands with, which is never merge-untested since everything still lands ff-only via a future golden head. The shortcut is earned only against the PROVABILITY BAR: a name-only diff confined to non-code PLUS the compiled-in exceptions (version material) checked by MEASUREMENT — provable by diff, not plausible by argument; a delta needing an argument buys the full window. Q2 SEVERITY decides urgency and sizing, never which sha carries the fix. Carries two riders of the same root: the PUSH run IS the golden run (golden.yml two-host condition at 598/677 — a push satisfies `event != workflow_dispatch` and runs both legs unconditionally, so a reflexive dispatch is a duplicate serial window), and a superseding ruling must land where the reader looks before any actor carries the stale sentence into a plan (releases#71 5153399070 -> 5155301974). Amends ADR-0050 and RELEASE-RUNBOOK step 1: tested-SHA-equals-shipped-SHA becomes tested-SHA-equals-shipped-SHA-OR-provable-code-free-delta-from-a-tested-SHA. Worked example v0.51.0 counter 86 @6312b01: five files, zero .rs, 92 version-sensitive tests green on the bumped tree.",
2026-08-28T09:54:46.6320920Z       "requiredStages": [
2026-08-28T09:54:46.6321259Z         "doc"
2026-08-28T09:54:46.6321586Z       ],
2026-08-28T09:54:46.6321879Z       "stages": {
2026-08-28T09:54:46.6322198Z         "doc": {
2026-08-28T09:54:46.6322533Z           "complete": true,
2026-08-28T09:54:46.6322895Z           "evidence": [
2026-08-28T09:54:46.6323243Z             {
2026-08-28T09:54:46.6323595Z               "path": "docs/RELEASE-RUNBOOK.md",
2026-08-28T09:54:46.6324150Z               "line": 58
2026-08-28T09:54:46.6324495Z             }
2026-08-28T09:54:46.6324813Z           ]
2026-08-28T09:54:46.6325114Z         },
2026-08-28T09:54:46.6325419Z         "impl": {
2026-08-28T09:54:46.6325748Z           "complete": false,
2026-08-28T09:54:46.6326129Z           "evidence": []
2026-08-28T09:54:46.6326472Z         },
2026-08-28T09:54:46.6326773Z         "int": {
2026-08-28T09:54:46.6327100Z           "complete": false,
2026-08-28T09:54:46.6327471Z           "evidence": []
2026-08-28T09:54:46.6327809Z         },
2026-08-28T09:54:46.6328109Z         "unit": {
2026-08-28T09:54:46.6328443Z           "complete": false,
2026-08-28T09:54:46.6328810Z           "evidence": []
2026-08-28T09:54:46.6329259Z         }
2026-08-28T09:54:46.6329560Z       }
2026-08-28T09:54:46.6329853Z     },
2026-08-28T09:54:46.6330162Z     {
2026-08-28T09:54:46.6330497Z       "id": "REQ-GOSSIP-ADAPTER-PROJECTS",
2026-08-28T09:54:46.6334396Z       "title": "#4: remote endpoint details (harness + project history) are gossiped, not faked. Today from_resource_row (crates/spt/src/picker/model.rs:340) hardcodes project_history=Vec::new() for every remote row and passes adapter_profile=row.resources (the blurb masquerading as the harness), and Instance/ResourceRow (crates/spt-net/src/net/registry.rs:457) carry no adapter field and no project list. Fix: additive gossip fields N-1-safe exactly like endpoint_type — Instance.adapter (composite <adapter>[:profile]) + Instance.recent_projects (bounded, newest-first, project IDs only) -> thread to ResourceRow -> from_resource_row stops faking. Pre-field remote rows render '-'. Project IDs only + REQ-PICKER-PROJECT-HISTORY-TRUTH's disambiguation. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #4.",
2026-08-28T09:54:46.6337868Z       "requiredStages": [
2026-08-28T09:54:46.6338222Z         "impl",
2026-08-28T09:54:46.6338608Z         "unit",
2026-08-28T09:54:46.6338922Z         "int"
2026-08-28T09:54:46.6339471Z       ],
2026-08-28T09:54:46.6339786Z       "stages": {
2026-08-28T09:54:46.6344248Z         "doc": {
2026-08-28T09:54:46.6344669Z           "complete": false,
2026-08-28T09:54:46.6345049Z           "evidence": []
2026-08-28T09:54:46.6345402Z         },
2026-08-28T09:54:46.6345700Z         "impl": {
2026-08-28T09:54:46.6346033Z           "complete": true,
2026-08-28T09:54:46.6346395Z           "evidence": [
2026-08-28T09:54:46.6346724Z             {
2026-08-28T09:54:46.6347115Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6347602Z               "line": 615
2026-08-28T09:54:46.6347959Z             },
2026-08-28T09:54:46.6348276Z             {
2026-08-28T09:54:46.6348652Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6349225Z               "line": 650
2026-08-28T09:54:46.6349568Z             },
2026-08-28T09:54:46.6349883Z             {
2026-08-28T09:54:46.6350254Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6350723Z               "line": 1048
2026-08-28T09:54:46.6351070Z             },
2026-08-28T09:54:46.6351389Z             {
2026-08-28T09:54:46.6351760Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6352213Z               "line": 201
2026-08-28T09:54:46.6352566Z             },
2026-08-28T09:54:46.6352876Z             {
2026-08-28T09:54:46.6353242Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6353699Z               "line": 210
2026-08-28T09:54:46.6354046Z             },
2026-08-28T09:54:46.6354351Z             {
2026-08-28T09:54:46.6354709Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6355162Z               "line": 225
2026-08-28T09:54:46.6355506Z             },
2026-08-28T09:54:46.6355821Z             {
2026-08-28T09:54:46.6356195Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6356645Z               "line": 555
2026-08-28T09:54:46.6356974Z             },
2026-08-28T09:54:46.6357289Z             {
2026-08-28T09:54:46.6357875Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6358325Z               "line": 560
2026-08-28T09:54:46.6358676Z             },
2026-08-28T09:54:46.6359055Z             {
2026-08-28T09:54:46.6359432Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6359880Z               "line": 565
2026-08-28T09:54:46.6360233Z             },
2026-08-28T09:54:46.6360547Z             {
2026-08-28T09:54:46.6360916Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6361367Z               "line": 633
2026-08-28T09:54:46.6361706Z             },
2026-08-28T09:54:46.6362006Z             {
2026-08-28T09:54:46.6362368Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.6362807Z               "line": 606
2026-08-28T09:54:46.6363146Z             },
2026-08-28T09:54:46.6363451Z             {
2026-08-28T09:54:46.6363802Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.6364249Z               "line": 610
2026-08-28T09:54:46.6364592Z             },
2026-08-28T09:54:46.6364897Z             {
2026-08-28T09:54:46.6365259Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.6365693Z               "line": 623
2026-08-28T09:54:46.6366028Z             }
2026-08-28T09:54:46.6366328Z           ]
2026-08-28T09:54:46.6366626Z         },
2026-08-28T09:54:46.6366929Z         "int": {
2026-08-28T09:54:46.6367263Z           "complete": true,
2026-08-28T09:54:46.6367626Z           "evidence": [
2026-08-28T09:54:46.6367969Z             {
2026-08-28T09:54:46.6368332Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:46.6368764Z               "line": 838
2026-08-28T09:54:46.6369188Z             }
2026-08-28T09:54:46.6369500Z           ]
2026-08-28T09:54:46.6369801Z         },
2026-08-28T09:54:46.6370106Z         "unit": {
2026-08-28T09:54:46.6370435Z           "complete": true,
2026-08-28T09:54:46.6370913Z           "evidence": [
2026-08-28T09:54:46.6371260Z             {
2026-08-28T09:54:46.6371636Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6372099Z               "line": 1279
2026-08-28T09:54:46.6372452Z             },
2026-08-28T09:54:46.6372772Z             {
2026-08-28T09:54:46.6373143Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6373600Z               "line": 1301
2026-08-28T09:54:46.6373944Z             },
2026-08-28T09:54:46.6374252Z             {
2026-08-28T09:54:46.6374612Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.6375067Z               "line": 2036
2026-08-28T09:54:46.6375414Z             },
2026-08-28T09:54:46.6375719Z             {
2026-08-28T09:54:46.6376082Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:46.6376520Z               "line": 2010
2026-08-28T09:54:46.6376869Z             }
2026-08-28T09:54:46.6377177Z           ]
2026-08-28T09:54:46.6377484Z         }
2026-08-28T09:54:46.6377780Z       }
2026-08-28T09:54:46.6378076Z     },
2026-08-28T09:54:46.6378372Z     {
2026-08-28T09:54:46.6378715Z       "id": "REQ-GOSSIP-CONTROLLED-ANY",
2026-08-28T09:54:46.6383903Z       "title": "Bug #3: a locally-controlled endpoint gossips controller_node = None so remote viewers show it free to control. Root AS IT STOOD WHEN THIS WAS WRITTEN: driven_by was stamped Some(node) only for a REMOTE WAN attach (attach.rs:337), because the legacy LOCAL attach path passed by=None (broker.rs:1750) — so the datum a remote viewer needed was absent at source. NOTE (doyle ruling v3, 2026-07-19): the accompanying model claim — that a local controller must NOT latch driven_by — was FALSIFIED. driven_by names the CONTROLLING node, own node INCLUDED (CONTEXT.md:386), and the own-hex latch is truthful; the by=None behavior was a legacy-path artifact, not the design. KH 7.15 is about CLEARING the stamp when the session is gone, which is a different rule and still stands. The fix as landed is unaffected and stays correct: broker stamps a SEPARATE any-controller datum (true/Some(host) for a local OR remote controller) alongside stamp_driven_by, and advertise_local gossips Instance controller_node from it. node-refresh is NOT the fix (data is absent at source). See docs/NEXT-MILESTONE-BUG-TRIAGE.md #3.",
2026-08-28T09:54:46.6389075Z       "requiredStages": [
2026-08-28T09:54:46.6389433Z         "impl",
2026-08-28T09:54:46.6389748Z         "unit"
2026-08-28T09:54:46.6390058Z       ],
2026-08-28T09:54:46.6390352Z       "stages": {
2026-08-28T09:54:46.6390674Z         "doc": {
2026-08-28T09:54:46.6391003Z           "complete": false,
2026-08-28T09:54:46.6391385Z           "evidence": []
2026-08-28T09:54:46.6391733Z         },
2026-08-28T09:54:46.6392033Z         "impl": {
2026-08-28T09:54:46.6392362Z           "complete": true,
2026-08-28T09:54:46.6392719Z           "evidence": [
2026-08-28T09:54:46.6393062Z             {
2026-08-28T09:54:46.6393414Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6393873Z               "line": 3407
2026-08-28T09:54:46.6394226Z             },
2026-08-28T09:54:46.6394536Z             {
2026-08-28T09:54:46.6394759Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6394913Z               "line": 592
2026-08-28T09:54:46.6395073Z             },
2026-08-28T09:54:46.6395232Z             {
2026-08-28T09:54:46.6395439Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6395605Z               "line": 1019
2026-08-28T09:54:46.6395756Z             },
2026-08-28T09:54:46.6395906Z             {
2026-08-28T09:54:46.6396100Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.6396263Z               "line": 677
2026-08-28T09:54:46.6396420Z             }
2026-08-28T09:54:46.6396568Z           ]
2026-08-28T09:54:46.6396725Z         },
2026-08-28T09:54:46.6396873Z         "int": {
2026-08-28T09:54:46.6397035Z           "complete": false,
2026-08-28T09:54:46.6397307Z           "evidence": []
2026-08-28T09:54:46.6397460Z         },
2026-08-28T09:54:46.6397640Z         "unit": {
2026-08-28T09:54:46.6397803Z           "complete": true,
2026-08-28T09:54:46.6397960Z           "evidence": [
2026-08-28T09:54:46.6398113Z             {
2026-08-28T09:54:46.6398335Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6398491Z               "line": 1419
2026-08-28T09:54:46.6398648Z             }
2026-08-28T09:54:46.6398796Z           ]
2026-08-28T09:54:46.6399044Z         }
2026-08-28T09:54:46.6399191Z       }
2026-08-28T09:54:46.6399350Z     },
2026-08-28T09:54:46.6399501Z     {
2026-08-28T09:54:46.6399707Z       "id": "REQ-GOSSIP-CONTROLLED-CROSS-NODE",
2026-08-28T09:54:46.6403108Z       "title": "B7 (F028, operator, cross-node): a remote endpoint's CONTROLLED state is not rendered. Evidence: ball-b ONLINE + CONTROLLED on ENLYZEAM (local view), but HFENDULEAM renders remote ball-b as plain ONLINE (both 0.22.0). The F-026 #4 gossiped any-controller datum (REQ-GOSSIP-ADAPTER-PROJECTS controlled bool) either isn't SENT for the locally-controlled case, isn't APPLIED on the receiving row, or DECAYS. Local leg confirmed fine (sibling hall-b renders blue-glyph correctly); the gap is the REMOTE leg. perri's validation had this ENV-BLOCKED — two live nodes now available to RCA. FIX: RCA sender-side (is controlled gossiped when locally-controlled?) / receiver-render (does from_resource_row surface it?) / decay, then lock with a cross-node int. See triage B7.",
2026-08-28T09:54:46.6403289Z       "requiredStages": [],
2026-08-28T09:54:46.6403437Z       "stages": {
2026-08-28T09:54:46.6403594Z         "doc": {
2026-08-28T09:54:46.6403755Z           "complete": false,
2026-08-28T09:54:46.6403914Z           "evidence": []
2026-08-28T09:54:46.6404065Z         },
2026-08-28T09:54:46.6404218Z         "impl": {
2026-08-28T09:54:46.6404375Z           "complete": false,
2026-08-28T09:54:46.6404537Z           "evidence": []
2026-08-28T09:54:46.6404689Z         },
2026-08-28T09:54:46.6404843Z         "int": {
2026-08-28T09:54:46.6405130Z           "complete": false,
2026-08-28T09:54:46.6405281Z           "evidence": []
2026-08-28T09:54:46.6405435Z         },
2026-08-28T09:54:46.6405581Z         "unit": {
2026-08-28T09:54:46.6405750Z           "complete": false,
2026-08-28T09:54:46.6405900Z           "evidence": []
2026-08-28T09:54:46.6406057Z         }
2026-08-28T09:54:46.6406207Z       }
2026-08-28T09:54:46.6406355Z     },
2026-08-28T09:54:46.6406504Z     {
2026-08-28T09:54:46.6406694Z       "id": "REQ-GOSSIP-PROJECT-DERIVE-ONCE",
2026-08-28T09:54:46.6412486Z       "title": "REGISTRY-LIFECYCLE W4 fast-follow (hertz v0.37.0 field-verify CPU-gate FAIL RCA 2026-07-17, doyle seam-verified same day; timing-pinned ~16s burst clusters per 30s Registry pump round): recent-project gossip derives a project id AT MOST ONCE PER DISTINCT CWD per advertisement round — recent_projects_for dedups the RAW cwd string BEFORE project_id_for_dir (today seen.insert(pid) dedups AFTER derivation at registryhost.rs:1001, so every duplicate-cwd sessions.log row pays a git remote/rev-parse spawn: ~200 derivations/round on a 12-perch box, the post-self-hash-fix CPU floor). The pid-level dedup stays as the output-uniqueness second layer (distinct cwd spellings may collapse to one project); ordering semantics unchanged (first-occurrence newest-first); bounded ledger read unchanged. Gate: impl — cwd-dedup before derivation; unit — derivation-count observable == distinct cwds not ledger rows (duplicate-cwd ledger derives once), output/order parity vs the pre-fix shape on a mixed ledger. SEEDED SEPARATELY (not this REQ): gossip leg consults the ADR-0037 materialized index (kills git entirely + cross-round rederivation; staleness-semantics design change) + epoch-mint batching (26 atomic writes/round; durable-monotonic contract change).",
2026-08-28T09:54:46.6412675Z       "requiredStages": [
2026-08-28T09:54:46.6412824Z         "impl",
2026-08-28T09:54:46.6412976Z         "unit"
2026-08-28T09:54:46.6413239Z       ],
2026-08-28T09:54:46.6413387Z       "stages": {
2026-08-28T09:54:46.6413567Z         "doc": {
2026-08-28T09:54:46.6413750Z           "complete": false,
2026-08-28T09:54:46.6413935Z           "evidence": []
2026-08-28T09:54:46.6414103Z         },
2026-08-28T09:54:46.6414281Z         "impl": {
2026-08-28T09:54:46.6414464Z           "complete": true,
2026-08-28T09:54:46.6414625Z           "evidence": [
2026-08-28T09:54:46.6414778Z             {
2026-08-28T09:54:46.6414993Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6415160Z               "line": 1065
2026-08-28T09:54:46.6415307Z             }
2026-08-28T09:54:46.6415459Z           ]
2026-08-28T09:54:46.6415607Z         },
2026-08-28T09:54:46.6415760Z         "int": {
2026-08-28T09:54:46.6415922Z           "complete": false,
2026-08-28T09:54:46.6416084Z           "evidence": []
2026-08-28T09:54:46.6416233Z         },
2026-08-28T09:54:46.6416381Z         "unit": {
2026-08-28T09:54:46.6416545Z           "complete": true,
2026-08-28T09:54:46.6416707Z           "evidence": [
2026-08-28T09:54:46.6416863Z             {
2026-08-28T09:54:46.6417078Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6417235Z               "line": 1357
2026-08-28T09:54:46.6417383Z             },
2026-08-28T09:54:46.6417535Z             {
2026-08-28T09:54:46.6417750Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.6417903Z               "line": 1393
2026-08-28T09:54:46.6418055Z             }
2026-08-28T09:54:46.6418199Z           ]
2026-08-28T09:54:46.6418351Z         }
2026-08-28T09:54:46.6418494Z       }
2026-08-28T09:54:46.6418646Z     },
2026-08-28T09:54:46.6418789Z     {
2026-08-28T09:54:46.6419090Z       "id": "REQ-HAZARD-ADAPTER-APPLY-SILENT-NOOP",
2026-08-28T09:54:46.6425973Z       "title": "A DELEGATED live adapter apply MUST NEVER report success without performing the swap, and the live-update seam MUST use ONE parent-aware adapter matcher across all its comparators. TWO defects made the field repro (BUILD-F015B-APPLYMATCH: `--adapter cc:ccs` live update silently no-ops): (D1, matcher skew) the broker's dispatch_adapter_apply filtered sessions by EXACT `s.adapter == req.adapter`, but a `--adapter <adapter>:<profile>` endpoint stores the COMPOSITE `cc:ccs` while the apply carries the PARENT record name `cc` — so every :profile endpoint fell out to affected=[]; select_endpoints_running_adapter had the same `adp == adapter` skew, while the CLI live-gate (adapter_has_live_endpoint) already parent-matched — divergent rules on ONE seam. (D2, silent success) the affected.is_empty() branch replied KIND_APPLIED and RETURNED WITHOUT SWAPPING; once the CLI delegates the apply there is no CLI-side fallback swap, so success-without-swap = the update never lands (re-register re-reads the OLD manifest, version-of-truth honestly says old). FIX: (1) ONE shared spt_runtime::profile::adapter_parent_matches(session_adapter, parent) used by the live-gate + broker apply-filter + select_endpoints_running_adapter (no exact `==` against a record name at any live-update seam); (2) the daemon owns the whole apply once delegated — the CRC swap runs UNCONDITIONALLY (terminate/restart loops no-op when nothing is resident), KIND_APPLIED reported ONLY after a real swap. (F015B, ADR-0025 amendment)",
2026-08-28T09:54:46.6426283Z       "requiredStages": [
2026-08-28T09:54:46.6426434Z         "doc",
2026-08-28T09:54:46.6426588Z         "impl",
2026-08-28T09:54:46.6426802Z         "unit",
2026-08-28T09:54:46.6426941Z         "int"
2026-08-28T09:54:46.6427097Z       ],
2026-08-28T09:54:46.6427258Z       "stages": {
2026-08-28T09:54:46.6427408Z         "doc": {
2026-08-28T09:54:46.6427567Z           "complete": true,
2026-08-28T09:54:46.6427723Z           "evidence": [
2026-08-28T09:54:46.6427872Z             {
2026-08-28T09:54:46.6428057Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6428220Z               "line": 613
2026-08-28T09:54:46.6428362Z             },
2026-08-28T09:54:46.6428644Z             {
2026-08-28T09:54:46.6428831Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6429069Z               "line": 1048
2026-08-28T09:54:46.6429220Z             },
2026-08-28T09:54:46.6429374Z             {
2026-08-28T09:54:46.6429670Z               "path": "docs/adr/0025-live-daemon-coordinated-adapter-update.md",
2026-08-28T09:54:46.6429827Z               "line": 59
2026-08-28T09:54:46.6429973Z             }
2026-08-28T09:54:46.6430121Z           ]
2026-08-28T09:54:46.6430261Z         },
2026-08-28T09:54:46.6430420Z         "impl": {
2026-08-28T09:54:46.6430581Z           "complete": true,
2026-08-28T09:54:46.6430735Z           "evidence": [
2026-08-28T09:54:46.6430876Z             {
2026-08-28T09:54:46.6431082Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6431239Z               "line": 9481
2026-08-28T09:54:46.6431388Z             },
2026-08-28T09:54:46.6431534Z             {
2026-08-28T09:54:46.6431745Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:46.6431907Z               "line": 70
2026-08-28T09:54:46.6432060Z             }
2026-08-28T09:54:46.6432207Z           ]
2026-08-28T09:54:46.6432356Z         },
2026-08-28T09:54:46.6432502Z         "int": {
2026-08-28T09:54:46.6432664Z           "complete": true,
2026-08-28T09:54:46.6432823Z           "evidence": [
2026-08-28T09:54:46.6432972Z             {
2026-08-28T09:54:46.6433238Z               "path": "crates/spt/tests/live_adapt_translation_swap_e2e.rs",
2026-08-28T09:54:46.6433405Z               "line": 404
2026-08-28T09:54:46.6433553Z             },
2026-08-28T09:54:46.6433702Z             {
2026-08-28T09:54:46.6433963Z               "path": "crates/spt/tests/live_adapt_translation_swap_e2e.rs",
2026-08-28T09:54:46.6434125Z               "line": 545
2026-08-28T09:54:46.6434269Z             },
2026-08-28T09:54:46.6434416Z             {
2026-08-28T09:54:46.6434673Z               "path": "crates/spt/tests/live_adapt_translation_swap_e2e.rs",
2026-08-28T09:54:46.6434832Z               "line": 806
2026-08-28T09:54:46.6434988Z             }
2026-08-28T09:54:46.6435246Z           ]
2026-08-28T09:54:46.6435401Z         },
2026-08-28T09:54:46.6435551Z         "unit": {
2026-08-28T09:54:46.6435716Z           "complete": true,
2026-08-28T09:54:46.6435870Z           "evidence": [
2026-08-28T09:54:46.6436017Z             {
2026-08-28T09:54:46.6436228Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6436384Z               "line": 12485
2026-08-28T09:54:46.6436537Z             },
2026-08-28T09:54:46.6436684Z             {
2026-08-28T09:54:46.6436890Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:46.6437043Z               "line": 473
2026-08-28T09:54:46.6437191Z             }
2026-08-28T09:54:46.6437338Z           ]
2026-08-28T09:54:46.6437491Z         }
2026-08-28T09:54:46.6437642Z       }
2026-08-28T09:54:46.6437790Z     },
2026-08-28T09:54:46.6437935Z     {
2026-08-28T09:54:46.6438156Z       "id": "REQ-HAZARD-ADAPTER-PROFILE-STAMP-CLOBBER",
2026-08-28T09:54:46.6442409Z       "title": "A-4 (F029, operator regression): the picker/confirm views drop an endpoint's adapter `:profile` (showed `claude-spt` where `claude-spt:ccs` was created). ROOT: stamp_creation_fields (spt-store/home.rs) gave the incoming BIND-TIME adapter value UNCONDITIONAL precedence (`rec.adapter = adapter.map(...).or_else(prior)`), but a hook bind resolves the adapter ADAPTER-AGNOSTICALLY (ADR-0021: a binary basename → the BARE parent, profile unknowable), so the first hook bind rewrote the richer `claude-spt:ccs` → `claude-spt`. (F-028's establish_perch self-heal widened how often this re-stamps; the precedence is the root.) FIX: profile-preserving precedence — when the incoming adapter is exactly the PARENT of the prior's `parent:profile` composite, KEEP the prior; replace only on a genuinely different adapter (or a different explicit profile). Paid-for field bug → hazard. See triage A-4.",
2026-08-28T09:54:46.6442606Z       "requiredStages": [
2026-08-28T09:54:46.6442893Z         "impl",
2026-08-28T09:54:46.6443048Z         "unit",
2026-08-28T09:54:46.6443195Z         "int"
2026-08-28T09:54:46.6443355Z       ],
2026-08-28T09:54:46.6443508Z       "stages": {
2026-08-28T09:54:46.6443655Z         "doc": {
2026-08-28T09:54:46.6443828Z           "complete": false,
2026-08-28T09:54:46.6443989Z           "evidence": []
2026-08-28T09:54:46.6444138Z         },
2026-08-28T09:54:46.6444285Z         "impl": {
2026-08-28T09:54:46.6444457Z           "complete": true,
2026-08-28T09:54:46.6444614Z           "evidence": [
2026-08-28T09:54:46.6444767Z             {
2026-08-28T09:54:46.6444976Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:46.6445125Z               "line": 149
2026-08-28T09:54:46.6445281Z             }
2026-08-28T09:54:46.6445426Z           ]
2026-08-28T09:54:46.6445572Z         },
2026-08-28T09:54:46.6445726Z         "int": {
2026-08-28T09:54:46.6445886Z           "complete": true,
2026-08-28T09:54:46.6446043Z           "evidence": [
2026-08-28T09:54:46.6446201Z             {
2026-08-28T09:54:46.6446473Z               "path": "crates/spt/tests/bind_adapter_profile_persist_e2e.rs",
2026-08-28T09:54:46.6446634Z               "line": 159
2026-08-28T09:54:46.6446792Z             }
2026-08-28T09:54:46.6446949Z           ]
2026-08-28T09:54:46.6447102Z         },
2026-08-28T09:54:46.6447250Z         "unit": {
2026-08-28T09:54:46.6447417Z           "complete": true,
2026-08-28T09:54:46.6447574Z           "evidence": [
2026-08-28T09:54:46.6447727Z             {
2026-08-28T09:54:46.6447927Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:46.6448084Z               "line": 432
2026-08-28T09:54:46.6448231Z             }
2026-08-28T09:54:46.6448383Z           ]
2026-08-28T09:54:46.6448538Z         }
2026-08-28T09:54:46.6448683Z       }
2026-08-28T09:54:46.6448834Z     },
2026-08-28T09:54:46.6449068Z     {
2026-08-28T09:54:46.6449274Z       "id": "REQ-HAZARD-ATOMIC-TMP-COLLISION",
2026-08-28T09:54:46.6450012Z       "title": "Concurrent atomic writers to the same target must not share a tmp name (5.15): a fixed tmp sibling makes one writer's rename consume the other's staged file (os-error-2 loser)",
2026-08-28T09:54:46.6450284Z       "requiredStages": [
2026-08-28T09:54:46.6450445Z         "impl",
2026-08-28T09:54:46.6450595Z         "unit"
2026-08-28T09:54:46.6450742Z       ],
2026-08-28T09:54:46.6450895Z       "stages": {
2026-08-28T09:54:46.6451045Z         "doc": {
2026-08-28T09:54:46.6451212Z           "complete": true,
2026-08-28T09:54:46.6451363Z           "evidence": [
2026-08-28T09:54:46.6451511Z             {
2026-08-28T09:54:46.6451696Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6451855Z               "line": 310
2026-08-28T09:54:46.6452193Z             }
2026-08-28T09:54:46.6452359Z           ]
2026-08-28T09:54:46.6452498Z         },
2026-08-28T09:54:46.6452655Z         "impl": {
2026-08-28T09:54:46.6452818Z           "complete": true,
2026-08-28T09:54:46.6452974Z           "evidence": [
2026-08-28T09:54:46.6453133Z             {
2026-08-28T09:54:46.6453332Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.6453495Z               "line": 130
2026-08-28T09:54:46.6453641Z             }
2026-08-28T09:54:46.6453794Z           ]
2026-08-28T09:54:46.6453943Z         },
2026-08-28T09:54:46.6454097Z         "int": {
2026-08-28T09:54:46.6454287Z           "complete": false,
2026-08-28T09:54:46.6454445Z           "evidence": []
2026-08-28T09:54:46.6454587Z         },
2026-08-28T09:54:46.6454732Z         "unit": {
2026-08-28T09:54:46.6454892Z           "complete": true,
2026-08-28T09:54:46.6455046Z           "evidence": [
2026-08-28T09:54:46.6455212Z             {
2026-08-28T09:54:46.6455427Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.6455594Z               "line": 290
2026-08-28T09:54:46.6455751Z             }
2026-08-28T09:54:46.6455894Z           ]
2026-08-28T09:54:46.6456048Z         }
2026-08-28T09:54:46.6456194Z       }
2026-08-28T09:54:46.6456344Z     },
2026-08-28T09:54:46.6456608Z     {
2026-08-28T09:54:46.6456794Z       "id": "REQ-HAZARD-ATTACH-WEDGE",
2026-08-28T09:54:46.6464729Z       "title": "A legitimately dead PTY child (real crash/kill) + an undrained operator pump must NOT wedge the broker for all other clients. ROOT (v0.12.0 real-harness defect): loopback attach output is a blocking write_all into a bounded 64KB tokio duplex (nethost.rs:1040,1090); when the operator's rc pump stops draining (tab closed) the buffer fills and write_all blocks forever (the 'loopback never hangs' assumption at nethost.rs:1103 is false), parking a worker in the 2-worker net runtime (nethost.rs:640); a couple of these saturate BOTH workers → every new attach / `endpoint run` stalls right after 'PUMP_IPC_READER: spawned' → 30s FIRST_EVENT_GRACE → 'no output / dead or wedged'; `daemon stop` cannot join the stuck workers. DISTINCT from the removed B1 path-(c) mutex deadlock. DISPOSITION = PROVE-DON'T-CHANGE (doyle GATE-PASS @e883f45, 2026-06-18): this ROOT is the SUPERSEDED v0.12.0 hypothesis — the post-L0 code ALREADY prevents the wedge, so NO fail-fast / worker-count code was added. serve_attach forwards fire-and-forget (net_stream_send op_id=None) and the broker-side send_stream is already BROKER-QUIC-DEADLINE-bounded (bounded_block_on, 10s); the loopback duplex is drained broker-INTERNALLY by the operator row's own read pump (RecvHalf::Loopback, retentive_cap==0 → evict-not-park) so a dead rc (a dropped IPC subscriber) never backs peer_w up; bounded_block_on parks the BROKER DISPATCH thread, not a net worker → no worker-pool exhaustion (full mechanism in the required_stages comment). Folds the status=online sub-check: a dead spt-hosted endpoint is marked OFFLINE within one reconcile tick on abrupt child death (broker exit-waiter reaps the session → B2 sees it absent) — PROVEN, no change. (v0.12.1)",
2026-08-28T09:54:46.6464943Z       "requiredStages": [
2026-08-28T09:54:46.6465096Z         "int"
2026-08-28T09:54:46.6465244Z       ],
2026-08-28T09:54:46.6465391Z       "stages": {
2026-08-28T09:54:46.6465539Z         "doc": {
2026-08-28T09:54:46.6465830Z           "complete": false,
2026-08-28T09:54:46.6465992Z           "evidence": []
2026-08-28T09:54:46.6466173Z         },
2026-08-28T09:54:46.6466316Z         "impl": {
2026-08-28T09:54:46.6466459Z           "complete": false,
2026-08-28T09:54:46.6466617Z           "evidence": []
2026-08-28T09:54:46.6466764Z         },
2026-08-28T09:54:46.6466918Z         "int": {
2026-08-28T09:54:46.6467064Z           "complete": true,
2026-08-28T09:54:46.6467226Z           "evidence": [
2026-08-28T09:54:46.6467387Z             {
2026-08-28T09:54:46.6467603Z               "path": "crates/spt/tests/attach_wedge_e2e.rs",
2026-08-28T09:54:46.6467769Z               "line": 294
2026-08-28T09:54:46.6467922Z             }
2026-08-28T09:54:46.6468137Z           ]
2026-08-28T09:54:46.6468327Z         },
2026-08-28T09:54:46.6468491Z         "unit": {
2026-08-28T09:54:46.6468651Z           "complete": false,
2026-08-28T09:54:46.6468815Z           "evidence": []
2026-08-28T09:54:46.6469052Z         }
2026-08-28T09:54:46.6469214Z       }
2026-08-28T09:54:46.6469370Z     },
2026-08-28T09:54:46.6469517Z     {
2026-08-28T09:54:46.6469721Z       "id": "REQ-HAZARD-BIND-CONFLICT-PID-ABA",
2026-08-28T09:54:46.6488160Z       "title": "THE BIND CONFLICT CHECK MUST ASK CUSTODY, NOT A BARE PID (KNOWN-HAZARDS 5.1/7.51 -- \"custody is an identity, never a bare PID\"; releases#134, FOUND AND ROOT-CAUSED BY hertz including the measured chain and the discriminating negative control). `establish_perch`'s under-lock conflict check read the recorded owner pid and asked `is_process_alive` with NO birth pairing, while `pid_started_at` sat unread in the SAME record and the shipped paired resolver (`liveness::relay_liveness`) was already in use 260 lines earlier in the same file (`prior_relay_died`). DECLARE SITE != ENFORCE SITE: the ABA fix landed on the relay-death and resume-custody paths and was never aimed here. CONSEQUENCE, MEASURED IN THE FIELD on the `hertz` endpoint (specimen preserved, sha256 1d8805ef841a1c1fe930b23eb8ce1683115e33735e190e426dd3ab3416ae3b1e): recorded pid 30576 with birth 2026-08-01T08:11:26.027Z, the pid recycled onto an unrelated process at 12:34:04.317Z, so every subsequent bind was refused CONFLICT and the row sat `unbound` FOREVER -- ready=false, alive=false, not addressable inbound, with `resume_unbound_stamp` re-arming a bind that could never succeed. It fails SILENTLY rather than loud, and Windows recycles pids aggressively, so it is latent fleet-wide rather than endpoint-specific. THE FIX PAIRS THE RECORDED BIRTH INTO THE CHECK, and both facts come from ONE read -- the under-lock `prior` snapshot -- replacing a second file read that could pair a freshly-read pid against `prior`'s session_id. UNPROVEN FAILS TOWARD ALLOW HERE, INVERTING `relay_liveness`'S OWN DEFAULT, and the inversion is the requirement rather than an implementation choice: that default exists so a HEAL is never mis-fired, but at this site \"alive\" means REFUSE THE BIND, so carrying it over converts an unknown into the same permanent lockout through a different input. MEASURED CORRECTION TO THE RULING'S OWN JUSTIFICATION (todlando recon, 2026-08-03): this does NOT confine the behaviour change to `Gone`. `process_identity` also answers `Unproven` for a LIVE pid whose birth cannot be read (a denied query, an exit race, or a platform with no birth oracle -- `process_started_at` is documented `None` on non-Linux unix), and that arm refuses today and allows after. The case given up is bounded by the owner's own exit race; the case fixed is permanent. THE FIX RESTS ON THE BIRTH PAIRING, NOT ON `pid_role`, AND THAT MUST BE PROVED RATHER THAN ASSERTED: the field record carries `pid_role: \"binder\"`, so a `pid_role == Relay` gate copied from `prior_relay_died` would ALSO have unblocked the reported case -- two mechanisms, one symptom. The pairing is load-bearing because a `pid_role = Relay` record whose pid is recycled is bricked identically and a role gate cannot fix it, so the requirement carries a Relay+recycled row specifically to prove the role gate is not carrying the fix. NO ROLE GATE IS ADDED HERE: it would change behaviour on `Held` binder records too, far wider than the defect. SQUAT PROTECTION IS NOT WEAKENED AND NEEDS ITS OWN ROW: a live owner whose recorded birth MATCHES still refuses the bind. NO INT STAGE, AND THAT IS A DECISION RATHER THAN A GAP (doyle, 2026-08-03): the field shape is covered at UNIT level because every fact this requirement rests on is reachable there -- the custody tri-state exhaustively, the remedy RUN from the refusal state, and both unknown-arm defaults -- while the arm that cannot be produced portably (a live pid whose birth is unreadable) is not reachable through an int seam either, since no single platform manufactures it. The int seams that would carry a field shape already run green beside these rows (`dummy_harness_e2e`'s bind/attach pair, `resume_custody_aba`), so an int stage here would re-run a topology that is exercised rather than test anything the unit rows do not. THE FIELD SPECIMEN IS REPRODUCED, NOT LOADED: the fixtures rebuild the specimen's construction (a live pid whose recorded birth is provably not its own, `pid_role` binder) and deliberately do not read ~/spt-specimens -- a test depending on a path outside the repo that no runner has would pass on one box and be silently skipped or red everywhere else. The specimen proves the hazard was field-real; the fixture is reproducible anywhere; coupling them costs the second job. Gate: impl -- the paired custody check at the bind conflict site, one snapshot, Unproven-allows; unit -- a recycled owner pid (live impostor pid whose recorded birth is provably not its own) no longer refuses the bind (RED on shipped code), a same-birth live owner still refuses (the control that keeps squat protection honest), and a `pid_role = Relay` recycled record is fixed too (the row that proves the role gate is not what carries this).",
2026-08-28T09:54:46.6488609Z       "requiredStages": [
2026-08-28T09:54:46.6488761Z         "impl",
2026-08-28T09:54:46.6489076Z         "unit"
2026-08-28T09:54:46.6489233Z       ],
2026-08-28T09:54:46.6489395Z       "stages": {
2026-08-28T09:54:46.6489548Z         "doc": {
2026-08-28T09:54:46.6489714Z           "complete": false,
2026-08-28T09:54:46.6489873Z           "evidence": []
2026-08-28T09:54:46.6490020Z         },
2026-08-28T09:54:46.6490172Z         "impl": {
2026-08-28T09:54:46.6490329Z           "complete": true,
2026-08-28T09:54:46.6490490Z           "evidence": [
2026-08-28T09:54:46.6490638Z             {
2026-08-28T09:54:46.6490837Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.6490994Z               "line": 88
2026-08-28T09:54:46.6491137Z             },
2026-08-28T09:54:46.6491285Z             {
2026-08-28T09:54:46.6491471Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.6491633Z               "line": 155
2026-08-28T09:54:46.6491776Z             },
2026-08-28T09:54:46.6491928Z             {
2026-08-28T09:54:46.6492120Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6492282Z               "line": 284
2026-08-28T09:54:46.6492430Z             },
2026-08-28T09:54:46.6492572Z             {
2026-08-28T09:54:46.6492778Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6492949Z               "line": 312
2026-08-28T09:54:46.6493103Z             },
2026-08-28T09:54:46.6493248Z             {
2026-08-28T09:54:46.6493444Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6493608Z               "line": 607
2026-08-28T09:54:46.6493751Z             }
2026-08-28T09:54:46.6493908Z           ]
2026-08-28T09:54:46.6494052Z         },
2026-08-28T09:54:46.6494204Z         "int": {
2026-08-28T09:54:46.6494362Z           "complete": false,
2026-08-28T09:54:46.6494524Z           "evidence": []
2026-08-28T09:54:46.6494677Z         },
2026-08-28T09:54:46.6494824Z         "unit": {
2026-08-28T09:54:46.6494987Z           "complete": true,
2026-08-28T09:54:46.6495148Z           "evidence": [
2026-08-28T09:54:46.6495307Z             {
2026-08-28T09:54:46.6495607Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.6495768Z               "line": 401
2026-08-28T09:54:46.6495914Z             },
2026-08-28T09:54:46.6496066Z             {
2026-08-28T09:54:46.6496256Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.6496414Z               "line": 436
2026-08-28T09:54:46.6496566Z             },
2026-08-28T09:54:46.6496709Z             {
2026-08-28T09:54:46.6496909Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6497062Z               "line": 2636
2026-08-28T09:54:46.6497215Z             },
2026-08-28T09:54:46.6497381Z             {
2026-08-28T09:54:46.6497578Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6497729Z               "line": 2658
2026-08-28T09:54:46.6497873Z             },
2026-08-28T09:54:46.6498029Z             {
2026-08-28T09:54:46.6498232Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6498440Z               "line": 2701
2026-08-28T09:54:46.6498593Z             },
2026-08-28T09:54:46.6498748Z             {
2026-08-28T09:54:46.6498940Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6499178Z               "line": 2733
2026-08-28T09:54:46.6499326Z             },
2026-08-28T09:54:46.6499484Z             {
2026-08-28T09:54:46.6499678Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6499837Z               "line": 2777
2026-08-28T09:54:46.6499989Z             },
2026-08-28T09:54:46.6500133Z             {
2026-08-28T09:54:46.6500332Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6500485Z               "line": 2805
2026-08-28T09:54:46.6500637Z             }
2026-08-28T09:54:46.6500782Z           ]
2026-08-28T09:54:46.6500927Z         }
2026-08-28T09:54:46.6501079Z       }
2026-08-28T09:54:46.6501226Z     },
2026-08-28T09:54:46.6501372Z     {
2026-08-28T09:54:46.6501554Z       "id": "REQ-HAZARD-BIND-CWD-UNSET",
2026-08-28T09:54:46.6505527Z       "title": "A bound endpoint's `info.cwd` is SET at bind so a freshly-created perch appears under its own project tab. ROOT (found, v0.13.0): `info.cwd` is NEVER set on bind — `cmd_bind` (spt-hosted) and `bind_from_seed` (harness-hosted) never thread cwd into `establish_perch`/`rec.cwd`. FIX: `cmd_bind` reads its own `current_dir` (the broker spawned it in `project_cwd`); `bind_from_seed` passes `seed.cwd` (already captured at seed time, currently DISCARDED). DISTINCT from REQ-PICKER-HISTORY-FRESH (v0.12.1) — that unioned cwd-origin into picker MEMBERSHIP but tested merge_origin_project with a PROVIDED origin; it never asserted `info.cwd` is actually set on bind, so a real `endpoint run` perch still had an empty cwd and the union had nothing to union. This is the v0.12.1 P1 'appears under its own project right away' claim that was REFUTED in the changelog — delivered for real here. (v0.13.0)",
2026-08-28T09:54:46.6505708Z       "requiredStages": [
2026-08-28T09:54:46.6505862Z         "impl",
2026-08-28T09:54:46.6506013Z         "unit",
2026-08-28T09:54:46.6506162Z         "int"
2026-08-28T09:54:46.6506314Z       ],
2026-08-28T09:54:46.6506474Z       "stages": {
2026-08-28T09:54:46.6506627Z         "doc": {
2026-08-28T09:54:46.6506801Z           "complete": false,
2026-08-28T09:54:46.6506956Z           "evidence": []
2026-08-28T09:54:46.6507106Z         },
2026-08-28T09:54:46.6507260Z         "impl": {
2026-08-28T09:54:46.6507421Z           "complete": true,
2026-08-28T09:54:46.6507574Z           "evidence": [
2026-08-28T09:54:46.6507775Z             {
2026-08-28T09:54:46.6507975Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6508138Z               "line": 707
2026-08-28T09:54:46.6508299Z             }
2026-08-28T09:54:46.6508443Z           ]
2026-08-28T09:54:46.6508589Z         },
2026-08-28T09:54:46.6508739Z         "int": {
2026-08-28T09:54:46.6508899Z           "complete": true,
2026-08-28T09:54:46.6509135Z           "evidence": [
2026-08-28T09:54:46.6509285Z             {
2026-08-28T09:54:46.6509714Z               "path": "crates/spt/tests/bind_cwd_project_e2e.rs",
2026-08-28T09:54:46.6509858Z               "line": 82
2026-08-28T09:54:46.6510010Z             }
2026-08-28T09:54:46.6510158Z           ]
2026-08-28T09:54:46.6510305Z         },
2026-08-28T09:54:46.6510444Z         "unit": {
2026-08-28T09:54:46.6510606Z           "complete": true,
2026-08-28T09:54:46.6510764Z           "evidence": [
2026-08-28T09:54:46.6510911Z             {
2026-08-28T09:54:46.6511102Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6511264Z               "line": 2064
2026-08-28T09:54:46.6511412Z             },
2026-08-28T09:54:46.6511558Z             {
2026-08-28T09:54:46.6511758Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6511913Z               "line": 2086
2026-08-28T09:54:46.6512062Z             },
2026-08-28T09:54:46.6512214Z             {
2026-08-28T09:54:46.6512410Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6512576Z               "line": 2245
2026-08-28T09:54:46.6512725Z             }
2026-08-28T09:54:46.6512877Z           ]
2026-08-28T09:54:46.6513021Z         }
2026-08-28T09:54:46.6513167Z       }
2026-08-28T09:54:46.6513312Z     },
2026-08-28T09:54:46.6513459Z     {
2026-08-28T09:54:46.6513659Z       "id": "REQ-HAZARD-BIND-REST-STATE-CARRY",
2026-08-28T09:54:46.6517938Z       "title": "GATEWAY-LIVENESS DEFECT A (flynn field bug 2026-07-09, confirmed independent): a re-bind MUST preserve the daemon-owned resting intent (rest_state, D9-2/REQ-INST-3) — the same carry-forward discipline establish_perch already applies to cwd/controllable/adapter/read_env. ROOT: establish_perch's record build (crates/spt/src/api/startup.rs, the build closure) constructs a fresh InfoJson via InfoJson::new (defaults rest_state None) and carries cwd/controllable/read_env forward from prior but NOT rest_state -> a re-bind WIPES the wake intent (flynn tick11 rest_state:active vanish). FIX: carry prior.rest_state (and its paired dormant_since_ms anchor, present iff dormant) forward on re-bind, like the sibling fields. Gate: a re-bind over a prior record with rest_state set preserves it (unit — the build closure carries rest_state + dormant_since_ms). KNOWN-HAZARDS entry on landing. Kin REQ-HAZARD-BIND-CWD-UNSET / REQ-PICKER-1 + REQ-INST-3.",
2026-08-28T09:54:46.6518335Z       "requiredStages": [
2026-08-28T09:54:46.6518487Z         "impl",
2026-08-28T09:54:46.6518635Z         "unit"
2026-08-28T09:54:46.6518783Z       ],
2026-08-28T09:54:46.6518931Z       "stages": {
2026-08-28T09:54:46.6519154Z         "doc": {
2026-08-28T09:54:46.6519313Z           "complete": false,
2026-08-28T09:54:46.6519474Z           "evidence": []
2026-08-28T09:54:46.6519624Z         },
2026-08-28T09:54:46.6519774Z         "impl": {
2026-08-28T09:54:46.6519936Z           "complete": true,
2026-08-28T09:54:46.6520103Z           "evidence": [
2026-08-28T09:54:46.6520245Z             {
2026-08-28T09:54:46.6520451Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6520624Z               "line": 741
2026-08-28T09:54:46.6520770Z             }
2026-08-28T09:54:46.6524196Z           ]
2026-08-28T09:54:46.6524386Z         },
2026-08-28T09:54:46.6524544Z         "int": {
2026-08-28T09:54:46.6524706Z           "complete": false,
2026-08-28T09:54:46.6524868Z           "evidence": []
2026-08-28T09:54:46.6525019Z         },
2026-08-28T09:54:46.6525176Z         "unit": {
2026-08-28T09:54:46.6525341Z           "complete": true,
2026-08-28T09:54:46.6525504Z           "evidence": [
2026-08-28T09:54:46.6525650Z             {
2026-08-28T09:54:46.6525866Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6526028Z               "line": 2117
2026-08-28T09:54:46.6526171Z             }
2026-08-28T09:54:46.6526319Z           ]
2026-08-28T09:54:46.6526467Z         }
2026-08-28T09:54:46.6526609Z       }
2026-08-28T09:54:46.6526758Z     },
2026-08-28T09:54:46.6526929Z     {
2026-08-28T09:54:46.6527143Z       "id": "REQ-HAZARD-BOUNDARY-READY-STRAND",
2026-08-28T09:54:46.6532864Z       "title": "C-2 (F029, SEAM-2 pinned — B6's SECOND HALF, the live-wake blocker; perri wakep9 vs wakep4 gate-state dump + doyle code trace): at a /clear, CC fires SessionEnd(reason=clear) for the DEPARTING session BEFORE SessionStart; the departing sid STILL matches the perch pin at that instant, so the adapter's [hooks.SessionEnd] → `api session-end` AUTHENTICATES and the soft handler REMOVES the ready marker (+ unregister_address, reporting.rs cmd_session_end:206-207). The subsequent `api boundary` rotates the sid but NOTHING re-writes ready → is_online false → try_spt_hosted_inject Nones on the CLI gate BEFORE any broker RPC → every post-clear force-native (incl. the checkpoint FIRE) reports the generic UNDELIVERED, persistent by construction (no path re-stamps ready outside a real bind). The single differing gate field at every UNDELIVERED instant is ready-absent (info online/controllable/rotated-sid all healthy, translate alive). Paid-for hazard. FIX: cmd_boundary re-stamps the ready marker (+ status online, idempotent) ATOMICALLY with the sid rotation — a boundary PROVES a live successor session on the same harness process; a REAL end has no subsequent boundary so genuine teardown is untouched. See triage addendum C-2.",
2026-08-28T09:54:46.6533058Z       "requiredStages": [
2026-08-28T09:54:46.6533211Z         "impl",
2026-08-28T09:54:46.6533353Z         "int"
2026-08-28T09:54:46.6533502Z       ],
2026-08-28T09:54:46.6533653Z       "stages": {
2026-08-28T09:54:46.6533802Z         "doc": {
2026-08-28T09:54:46.6533973Z           "complete": false,
2026-08-28T09:54:46.6534131Z           "evidence": []
2026-08-28T09:54:46.6534283Z         },
2026-08-28T09:54:46.6534432Z         "impl": {
2026-08-28T09:54:46.6534598Z           "complete": true,
2026-08-28T09:54:46.6534751Z           "evidence": [
2026-08-28T09:54:46.6534903Z             {
2026-08-28T09:54:46.6535108Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.6535376Z               "line": 168
2026-08-28T09:54:46.6535541Z             }
2026-08-28T09:54:46.6535689Z           ]
2026-08-28T09:54:46.6535844Z         },
2026-08-28T09:54:46.6535978Z         "int": {
2026-08-28T09:54:46.6536140Z           "complete": true,
2026-08-28T09:54:46.6536298Z           "evidence": [
2026-08-28T09:54:46.6536473Z             {
2026-08-28T09:54:46.6536717Z               "path": "crates/spt/tests/boundary_ready_strand_e2e.rs",
2026-08-28T09:54:46.6536879Z               "line": 143
2026-08-28T09:54:46.6537036Z             }
2026-08-28T09:54:46.6537179Z           ]
2026-08-28T09:54:46.6537328Z         },
2026-08-28T09:54:46.6537475Z         "unit": {
2026-08-28T09:54:46.6537643Z           "complete": false,
2026-08-28T09:54:46.6537828Z           "evidence": []
2026-08-28T09:54:46.6537976Z         }
2026-08-28T09:54:46.6538122Z       }
2026-08-28T09:54:46.6538270Z     },
2026-08-28T09:54:46.6538477Z     {
2026-08-28T09:54:46.6538664Z       "id": "REQ-HAZARD-BRAIN-RESPAWN-PATH",
2026-08-28T09:54:46.6542482Z       "title": "The broker respawns the brain onto the APPLIED bytes, not the renamed old binary: the candidate-binary default is the canonical exe path captured ONCE at broker start, never a per-spawn std::env::current_exe() — on Linux current_exe (readlink /proc/self/exe) is inode-tracking and follows the `apply` rename (spt -> spt.old-N), so a resident broker would respawn the brain onto OLD bytes while recording `applied` (Windows GetModuleFileName is path-at-start, so Windows was green; ADR-0018 Q3 silently assumed path-string semantics). Backstop: promotion gates on bytes — a trial promotes only if brain.ready exe_hash == the staged artifact hash for this platform, else auto-rollback + loud notif (readiness != new-bytes was the false-success that recorded applied:8 over a v0.4.0 brain on kitsubito, 2026-06-11). KNOWN-HAZARDS 6.11.",
2026-08-28T09:54:46.6542654Z       "requiredStages": [
2026-08-28T09:54:46.6542806Z         "doc",
2026-08-28T09:54:46.6542954Z         "impl",
2026-08-28T09:54:46.6543121Z         "unit",
2026-08-28T09:54:46.6543401Z         "int"
2026-08-28T09:54:46.6543552Z       ],
2026-08-28T09:54:46.6543704Z       "stages": {
2026-08-28T09:54:46.6543861Z         "doc": {
2026-08-28T09:54:46.6544024Z           "complete": true,
2026-08-28T09:54:46.6544180Z           "evidence": [
2026-08-28T09:54:46.6544330Z             {
2026-08-28T09:54:46.6544519Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6544677Z               "line": 443
2026-08-28T09:54:46.6544819Z             }
2026-08-28T09:54:46.6544969Z           ]
2026-08-28T09:54:46.6545115Z         },
2026-08-28T09:54:46.6545274Z         "impl": {
2026-08-28T09:54:46.6545440Z           "complete": true,
2026-08-28T09:54:46.6545599Z           "evidence": [
2026-08-28T09:54:46.6545740Z             {
2026-08-28T09:54:46.6545955Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6546111Z               "line": 653
2026-08-28T09:54:46.6546254Z             },
2026-08-28T09:54:46.6546514Z             {
2026-08-28T09:54:46.6546719Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6546882Z               "line": 658
2026-08-28T09:54:46.6547024Z             },
2026-08-28T09:54:46.6547173Z             {
2026-08-28T09:54:46.6547377Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6547544Z               "line": 1100
2026-08-28T09:54:46.6547706Z             },
2026-08-28T09:54:46.6547859Z             {
2026-08-28T09:54:46.6548068Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6548226Z               "line": 1141
2026-08-28T09:54:46.6548373Z             },
2026-08-28T09:54:46.6548517Z             {
2026-08-28T09:54:46.6548730Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6548886Z               "line": 1152
2026-08-28T09:54:46.6549128Z             },
2026-08-28T09:54:46.6549286Z             {
2026-08-28T09:54:46.6549492Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:46.6549652Z               "line": 395
2026-08-28T09:54:46.6549801Z             }
2026-08-28T09:54:46.6549953Z           ]
2026-08-28T09:54:46.6550102Z         },
2026-08-28T09:54:46.6550249Z         "int": {
2026-08-28T09:54:46.6550412Z           "complete": true,
2026-08-28T09:54:46.6550568Z           "evidence": [
2026-08-28T09:54:46.6550722Z             {
2026-08-28T09:54:46.6550945Z               "path": "crates/spt/tests/brain_respawn_rename.rs",
2026-08-28T09:54:46.6551107Z               "line": 30
2026-08-28T09:54:46.6551255Z             }
2026-08-28T09:54:46.6551408Z           ]
2026-08-28T09:54:46.6551554Z         },
2026-08-28T09:54:46.6551703Z         "unit": {
2026-08-28T09:54:46.6551864Z           "complete": true,
2026-08-28T09:54:46.6552027Z           "evidence": [
2026-08-28T09:54:46.6552174Z             {
2026-08-28T09:54:46.6552375Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6552536Z               "line": 1851
2026-08-28T09:54:46.6552690Z             },
2026-08-28T09:54:46.6552952Z             {
2026-08-28T09:54:46.6553156Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6553315Z               "line": 1876
2026-08-28T09:54:46.6553466Z             },
2026-08-28T09:54:46.6553616Z             {
2026-08-28T09:54:46.6553823Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6553980Z               "line": 1893
2026-08-28T09:54:46.6554130Z             },
2026-08-28T09:54:46.6554274Z             {
2026-08-28T09:54:46.6554478Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6554636Z               "line": 1936
2026-08-28T09:54:46.6554788Z             }
2026-08-28T09:54:46.6554937Z           ]
2026-08-28T09:54:46.6555079Z         }
2026-08-28T09:54:46.6555228Z       }
2026-08-28T09:54:46.6555370Z     },
2026-08-28T09:54:46.6555529Z     {
2026-08-28T09:54:46.6555756Z       "id": "REQ-HAZARD-BRAIN-RESTART-LIFECYCLE-REHYDRATE",
2026-08-28T09:54:46.6559761Z       "title": "B4 (deepest): a bare brain restart (broker survives) REHYDRATES the live-agent lifecycle so post-restart endpoints are hosted + attachable. Today resume_sessions (brainproc.rs:186, brain.rs:797-809) re-subscribes to the broker's PTY sessions but ALL BrainLifecycle instances (lifecycle.rs:58-130; the ephemeral brain.rs:254-275) are LOST on restart → a post-restart live endpoint gets no livehost → its Psyche is never (re)hosted and new spawns die / can't attach until a FULL daemon reset (operator: perri's brain kill+restart wedged everything until a full daemon kill). FIX: on brain startup, rebuild a BrainLifecycle per resumed live-capable session — load the manifest from the adapter registry → instantiate → start the pulse — the rehydrate the resume no-op cannot do. Composes with B2 (the reconcile re-hosts from the honest on-disk status after rehydrate). (v0.12.0)",
2026-08-28T09:54:46.6559941Z       "requiredStages": [],
2026-08-28T09:54:46.6560089Z       "stages": {
2026-08-28T09:54:46.6560356Z         "doc": {
2026-08-28T09:54:46.6560532Z           "complete": false,
2026-08-28T09:54:46.6560685Z           "evidence": []
2026-08-28T09:54:46.6560837Z         },
2026-08-28T09:54:46.6560986Z         "impl": {
2026-08-28T09:54:46.6561152Z           "complete": false,
2026-08-28T09:54:46.6561329Z           "evidence": []
2026-08-28T09:54:46.6561481Z         },
2026-08-28T09:54:46.6561625Z         "int": {
2026-08-28T09:54:46.6561782Z           "complete": false,
2026-08-28T09:54:46.6561940Z           "evidence": []
2026-08-28T09:54:46.6562090Z         },
2026-08-28T09:54:46.6562239Z         "unit": {
2026-08-28T09:54:46.6562415Z           "complete": false,
2026-08-28T09:54:46.6562592Z           "evidence": []
2026-08-28T09:54:46.6562739Z         }
2026-08-28T09:54:46.6562888Z       }
2026-08-28T09:54:46.6563030Z     },
2026-08-28T09:54:46.6563169Z     {
2026-08-28T09:54:46.6563387Z       "id": "REQ-HAZARD-BRAIN-RESTART-PSYCHE-DUP",
2026-08-28T09:54:46.6569069Z       "title": "A bare brain restart leaves EXACTLY ONE `{id}-psyche` process per endpoint — no duplicate. On an abrupt brain death stop_host never runs (the LiveSet + owned child handles die with the brain) and Breap's job/group only reaps at DAEMON stop, so the PRIOR brain's Psyche stays ALIVE; the respawned brain's reconcile re-hosts a SECOND Psyche and overwrites the `{id}-psyche` perch pid, leaving the old one untracked + alive = a duplicate that lingers until daemon-stop (the operator's 'brain kill+restart wedged everything'). FIX: at brain start, BEFORE the first reconcile re-hosts, reap any pre-existing `{id}-psyche` orphan — ID-SPECIFICALLY (recycle-safe on the shared box, where sibling agents share the `claude` basename): scoped-kill the recorded pid ONLY IF it is alive AND its exe basename == the adapter's psyche program (normalize_basename) AND its COMMAND LINE contains the full psyche id `<id>-psyche` (baked via {id}); a sibling never carries THIS id, and any unreadable signal FAILS SAFE (decline to reap — a missed dup is bounded by Breap, a wrong-kill is catastrophic). CAVEAT: the cmdline carries `<id>-psyche` only when the adapter's psyche_init.command uses {id} (the norm); a non-{id} adapter safely MISSES the reap (today's behavior, Breap bounds it) — never a wrong-kill. (v0.12.0)",
2026-08-28T09:54:46.6569374Z       "requiredStages": [],
2026-08-28T09:54:46.6569528Z       "stages": {
2026-08-28T09:54:46.6569675Z         "doc": {
2026-08-28T09:54:46.6569840Z           "complete": false,
2026-08-28T09:54:46.6569992Z           "evidence": []
2026-08-28T09:54:46.6570148Z         },
2026-08-28T09:54:46.6570302Z         "impl": {
2026-08-28T09:54:46.6570462Z           "complete": true,
2026-08-28T09:54:46.6570621Z           "evidence": [
2026-08-28T09:54:46.6570763Z             {
2026-08-28T09:54:46.6570964Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.6571121Z               "line": 45
2026-08-28T09:54:46.6571278Z             },
2026-08-28T09:54:46.6571421Z             {
2026-08-28T09:54:46.6571627Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.6571789Z               "line": 90
2026-08-28T09:54:46.6571932Z             }
2026-08-28T09:54:46.6572080Z           ]
2026-08-28T09:54:46.6572227Z         },
2026-08-28T09:54:46.6572375Z         "int": {
2026-08-28T09:54:46.6572538Z           "complete": false,
2026-08-28T09:54:46.6572698Z           "evidence": []
2026-08-28T09:54:46.6572833Z         },
2026-08-28T09:54:46.6572984Z         "unit": {
2026-08-28T09:54:46.6573143Z           "complete": true,
2026-08-28T09:54:46.6573294Z           "evidence": [
2026-08-28T09:54:46.6573443Z             {
2026-08-28T09:54:46.6573637Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.6573800Z               "line": 606
2026-08-28T09:54:46.6573948Z             }
2026-08-28T09:54:46.6574092Z           ]
2026-08-28T09:54:46.6574239Z         }
2026-08-28T09:54:46.6574388Z       }
2026-08-28T09:54:46.6574538Z     },
2026-08-28T09:54:46.6574683Z     {
2026-08-28T09:54:46.6574996Z       "id": "REQ-HAZARD-BROKER-FLOOR-LOCK-POISON",
2026-08-28T09:54:46.6587666Z       "title": "B-1 (REMOTE-TRUTH triage §B-1, PIVOTED @e5eb99a): NO bare `.lock().unwrap()` on a broker-resident lock reachable from serve/dispatch — a brain-only self-update keeps the broker + all its Mutexes ALIVE (REQ-UPD-3), so a single panic under one poisons it PERMANENTLY: the next `.lock().unwrap()` panics, kills its per-conn reply thread, and EVERY subsequent attach silently deadlines ('brain IPC read deadline elapsed') while non-locked ops keep working. TRIAGE-DRIFT (sweep-dispatch-site-counts discipline): the triage named 3 sites (broker.rs:1163 flush_inject_floor / :1297 inject-worker-open / :2142 buffer_if_held) as the surviving class, but ALL 3 are the INJECT FLOOR and were ALREADY poison-proofed by REQ-HAZARD-INJECT-WORKER-POISON (lock_floor, shipped post-triage — the FLOOR HALF is SUBSUMED, this seed redirects). The SURVIVING class (matching the triage's own symptom description) is the ATTACH-PATH lock set: self.sessions Mutex<HashMap> ×18 + its sessions_exit alias ×1, the per-session OutputLog RING ×11 (log/h.log/log_drain/log_exit), pair_holds ×4 — 34 production bare .lock().unwrap() (cfg(test) excluded). FIX (doyle B-1 ruling): recover ALL THREE via ONE shared `recover<T>(&Mutex<T>) -> MutexGuard<T>` helper (into_inner idiom, same as lock_floor / the effect journal bug #16 — safe for the short coherent-on-recovery map ops of sessions/pair_holds), plus `recover_log(&Mutex<OutputLog>)` for the ring which adds a COHERENCE CLAMP on the poison-recovery path: a panic mid-append can leave the ring torn (over-cap, a last seq not below next_seq, non-monotonic front/back) and serving those bytes risks garbage, so OutputLog::clamp_or_reset cheap-checks the invariants and RESETS the ring empty (next_seq preserved — cursors never rewind) + loud-logs on violation. Rationale: fail-fast on the log reintroduces the very wedge B-1 kills (poisoned log = every subscriber attach panics forever); blind recover serves torn bytes; clamp-or-reset costs only scrollback that self-heals on the next PTY output + repaint (lost scrollback << permanent wedge, torn-serve eliminated not tolerated). Sessions/pair_holds recover bare (short map ops, coherent-on-recovery). CLASS invariant (KNOWN-HAZARDS 7.33): any new broker-resident lock uses recover/recover_log or a documented fail-fast justification. Red-first: a scripted panic-under-sessions-lock → recover hands back a usable guard, the next attach still opens; a TORN-RING variant → recover_log clamps/resets so the subscriber gets sane bytes.",
2026-08-28T09:54:46.6588077Z       "requiredStages": [
2026-08-28T09:54:46.6588234Z         "doc",
2026-08-28T09:54:46.6588385Z         "impl",
2026-08-28T09:54:46.6588541Z         "unit"
2026-08-28T09:54:46.6588692Z       ],
2026-08-28T09:54:46.6588846Z       "stages": {
2026-08-28T09:54:46.6589084Z         "doc": {
2026-08-28T09:54:46.6589246Z           "complete": true,
2026-08-28T09:54:46.6589404Z           "evidence": [
2026-08-28T09:54:46.6589561Z             {
2026-08-28T09:54:46.6589752Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6589923Z               "line": 690
2026-08-28T09:54:46.6590071Z             }
2026-08-28T09:54:46.6590223Z           ]
2026-08-28T09:54:46.6590372Z         },
2026-08-28T09:54:46.6590527Z         "impl": {
2026-08-28T09:54:46.6590687Z           "complete": true,
2026-08-28T09:54:46.6590852Z           "evidence": [
2026-08-28T09:54:46.6591004Z             {
2026-08-28T09:54:46.6591230Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6591398Z               "line": 1315
2026-08-28T09:54:46.6591545Z             },
2026-08-28T09:54:46.6591699Z             {
2026-08-28T09:54:46.6591903Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6592065Z               "line": 4105
2026-08-28T09:54:46.6592222Z             },
2026-08-28T09:54:46.6592366Z             {
2026-08-28T09:54:46.6592575Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6592862Z               "line": 4120
2026-08-28T09:54:46.6593019Z             }
2026-08-28T09:54:46.6593162Z           ]
2026-08-28T09:54:46.6593316Z         },
2026-08-28T09:54:46.6593462Z         "int": {
2026-08-28T09:54:46.6593644Z           "complete": false,
2026-08-28T09:54:46.6593809Z           "evidence": []
2026-08-28T09:54:46.6593953Z         },
2026-08-28T09:54:46.6594105Z         "unit": {
2026-08-28T09:54:46.6594267Z           "complete": true,
2026-08-28T09:54:46.6594424Z           "evidence": [
2026-08-28T09:54:46.6594573Z             {
2026-08-28T09:54:46.6594796Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6594954Z               "line": 10616
2026-08-28T09:54:46.6595110Z             },
2026-08-28T09:54:46.6595259Z             {
2026-08-28T09:54:46.6595460Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6595621Z               "line": 11288
2026-08-28T09:54:46.6595759Z             },
2026-08-28T09:54:46.6595893Z             {
2026-08-28T09:54:46.6596097Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6596253Z               "line": 11322
2026-08-28T09:54:46.6596394Z             }
2026-08-28T09:54:46.6596558Z           ]
2026-08-28T09:54:46.6596704Z         }
2026-08-28T09:54:46.6596854Z       }
2026-08-28T09:54:46.6597000Z     },
2026-08-28T09:54:46.6597144Z     {
2026-08-28T09:54:46.6597368Z       "id": "REQ-HAZARD-BROKER-PROCESS-ISOLATION",
2026-08-28T09:54:46.6602410Z       "title": "Broker and brain are separate processes: the broker runs as its own long-lived per-machine process that survives every brain restart, so a routine (brain-only) self-update restarts the brain onto the swapped binary while every hosted endpoint (PTY child, live QUIC conn, listening socket) stays untouched at the PROCESS level. The in-process-thread broker (daemon.rs:165-170) is a regression that silently unrealizes REQ-UPD-3 — apply degrades to an in-process Brain::handoff no-op and new code does not run until an unrelated restart (KNOWN-HAZARDS 6.7). Evidence must prove process-level survival (SPIKE-01/03 productionized as int: PTY child + live QUIC survive a brain-PROCESS restart onto a swapped binary), re-pointing the regression-masked in-process int tags currently on REQ-DAEMON-2 / REQ-UPD-3 (ADR-0018).",
2026-08-28T09:54:46.6602716Z       "requiredStages": [
2026-08-28T09:54:46.6602874Z         "doc",
2026-08-28T09:54:46.6603026Z         "impl",
2026-08-28T09:54:46.6603174Z         "unit",
2026-08-28T09:54:46.6603317Z         "int"
2026-08-28T09:54:46.6603465Z       ],
2026-08-28T09:54:46.6603621Z       "stages": {
2026-08-28T09:54:46.6603770Z         "doc": {
2026-08-28T09:54:46.6603941Z           "complete": true,
2026-08-28T09:54:46.6604095Z           "evidence": [
2026-08-28T09:54:46.6604247Z             {
2026-08-28T09:54:46.6604450Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6604603Z               "line": 412
2026-08-28T09:54:46.6604756Z             }
2026-08-28T09:54:46.6604904Z           ]
2026-08-28T09:54:46.6605056Z         },
2026-08-28T09:54:46.6605214Z         "impl": {
2026-08-28T09:54:46.6605380Z           "complete": true,
2026-08-28T09:54:46.6605547Z           "evidence": [
2026-08-28T09:54:46.6605695Z             {
2026-08-28T09:54:46.6605957Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:46.6606116Z               "line": 140
2026-08-28T09:54:46.6606262Z             },
2026-08-28T09:54:46.6606407Z             {
2026-08-28T09:54:46.6606642Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.6606799Z               "line": 1564
2026-08-28T09:54:46.6606954Z             },
2026-08-28T09:54:46.6607099Z             {
2026-08-28T09:54:46.6607332Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.6607499Z               "line": 2180
2026-08-28T09:54:46.6607642Z             },
2026-08-28T09:54:46.6607795Z             {
2026-08-28T09:54:46.6608038Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6608315Z               "line": 23
2026-08-28T09:54:46.6608466Z             },
2026-08-28T09:54:46.6608616Z             {
2026-08-28T09:54:46.6608858Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6609101Z               "line": 148
2026-08-28T09:54:46.6609260Z             },
2026-08-28T09:54:46.6609406Z             {
2026-08-28T09:54:46.6609652Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6609812Z               "line": 193
2026-08-28T09:54:46.6609966Z             },
2026-08-28T09:54:46.6610113Z             {
2026-08-28T09:54:46.6610361Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6610519Z               "line": 287
2026-08-28T09:54:46.6610676Z             },
2026-08-28T09:54:46.6610838Z             {
2026-08-28T09:54:46.6611072Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6611239Z               "line": 300
2026-08-28T09:54:46.6611396Z             },
2026-08-28T09:54:46.6611554Z             {
2026-08-28T09:54:46.6611798Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6611963Z               "line": 371
2026-08-28T09:54:46.6612119Z             },
2026-08-28T09:54:46.6612270Z             {
2026-08-28T09:54:46.6612509Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6612674Z               "line": 385
2026-08-28T09:54:46.6612833Z             },
2026-08-28T09:54:46.6612971Z             {
2026-08-28T09:54:46.6613209Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6613381Z               "line": 430
2026-08-28T09:54:46.6613529Z             },
2026-08-28T09:54:46.6613677Z             {
2026-08-28T09:54:46.6613911Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6614073Z               "line": 476
2026-08-28T09:54:46.6614225Z             },
2026-08-28T09:54:46.6614374Z             {
2026-08-28T09:54:46.6614606Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6614765Z               "line": 488
2026-08-28T09:54:46.6615034Z             },
2026-08-28T09:54:46.6615187Z             {
2026-08-28T09:54:46.6615426Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6615582Z               "line": 502
2026-08-28T09:54:46.6615740Z             },
2026-08-28T09:54:46.6615887Z             {
2026-08-28T09:54:46.6616127Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6616289Z               "line": 529
2026-08-28T09:54:46.6616436Z             },
2026-08-28T09:54:46.6616585Z             {
2026-08-28T09:54:46.6616813Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6616981Z               "line": 863
2026-08-28T09:54:46.6617127Z             },
2026-08-28T09:54:46.6617279Z             {
2026-08-28T09:54:46.6617510Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6617772Z               "line": 1225
2026-08-28T09:54:46.6617992Z             },
2026-08-28T09:54:46.6618144Z             {
2026-08-28T09:54:46.6618392Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6618546Z               "line": 959
2026-08-28T09:54:46.6618703Z             },
2026-08-28T09:54:46.6618846Z             {
2026-08-28T09:54:46.6619176Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6619332Z               "line": 5396
2026-08-28T09:54:46.6619481Z             },
2026-08-28T09:54:46.6619637Z             {
2026-08-28T09:54:46.6619863Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6620027Z               "line": 5659
2026-08-28T09:54:46.6620175Z             },
2026-08-28T09:54:46.6620325Z             {
2026-08-28T09:54:46.6620550Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6620711Z               "line": 5671
2026-08-28T09:54:46.6620860Z             },
2026-08-28T09:54:46.6621007Z             {
2026-08-28T09:54:46.6621236Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6621641Z               "line": 8810
2026-08-28T09:54:46.6621790Z             },
2026-08-28T09:54:46.6621937Z             {
2026-08-28T09:54:46.6622166Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.6622319Z               "line": 232
2026-08-28T09:54:46.6622471Z             },
2026-08-28T09:54:46.6622622Z             {
2026-08-28T09:54:46.6622844Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.6623006Z               "line": 383
2026-08-28T09:54:46.6623155Z             },
2026-08-28T09:54:46.6623307Z             {
2026-08-28T09:54:46.6623531Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.6623694Z               "line": 394
2026-08-28T09:54:46.6623836Z             },
2026-08-28T09:54:46.6623985Z             {
2026-08-28T09:54:46.6624207Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.6624366Z               "line": 451
2026-08-28T09:54:46.6624522Z             },
2026-08-28T09:54:46.6624667Z             {
2026-08-28T09:54:46.6624900Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6625061Z               "line": 56
2026-08-28T09:54:46.6625215Z             },
2026-08-28T09:54:46.6625362Z             {
2026-08-28T09:54:46.6625595Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6625752Z               "line": 188
2026-08-28T09:54:46.6625900Z             },
2026-08-28T09:54:46.6626053Z             {
2026-08-28T09:54:46.6626282Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:46.6626443Z               "line": 93
2026-08-28T09:54:46.6626592Z             },
2026-08-28T09:54:46.6626739Z             {
2026-08-28T09:54:46.6626963Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.6627145Z               "line": 1051
2026-08-28T09:54:46.6627325Z             },
2026-08-28T09:54:46.6627474Z             {
2026-08-28T09:54:46.6627706Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:46.6627980Z               "line": 648
2026-08-28T09:54:46.6628137Z             },
2026-08-28T09:54:46.6628290Z             {
2026-08-28T09:54:46.6628486Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.6628647Z               "line": 7883
2026-08-28T09:54:46.6628801Z             }
2026-08-28T09:54:46.6629029Z           ]
2026-08-28T09:54:46.6629182Z         },
2026-08-28T09:54:46.6629339Z         "int": {
2026-08-28T09:54:46.6629506Z           "complete": true,
2026-08-28T09:54:46.6629668Z           "evidence": [
2026-08-28T09:54:46.6629812Z             {
2026-08-28T09:54:46.6630050Z               "path": "crates/spt/tests/brain_survive.rs",
2026-08-28T09:54:46.6630216Z               "line": 57
2026-08-28T09:54:46.6630446Z             },
2026-08-28T09:54:46.6630597Z             {
2026-08-28T09:54:46.6630819Z               "path": "crates/spt/tests/n1_pairing.rs",
2026-08-28T09:54:46.6630981Z               "line": 41
2026-08-28T09:54:46.6631130Z             }
2026-08-28T09:54:46.6631285Z           ]
2026-08-28T09:54:46.6631429Z         },
2026-08-28T09:54:46.6631581Z         "unit": {
2026-08-28T09:54:46.6631744Z           "complete": true,
2026-08-28T09:54:46.6631910Z           "evidence": [
2026-08-28T09:54:46.6632063Z             {
2026-08-28T09:54:46.6632298Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:46.6632464Z               "line": 799
2026-08-28T09:54:46.6632608Z             },
2026-08-28T09:54:46.6632759Z             {
2026-08-28T09:54:46.6632989Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:46.6633154Z               "line": 1145
2026-08-28T09:54:46.6633311Z             },
2026-08-28T09:54:46.6633462Z             {
2026-08-28T09:54:46.6633687Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6633848Z               "line": 1307
2026-08-28T09:54:46.6634001Z             },
2026-08-28T09:54:46.6634143Z             {
2026-08-28T09:54:46.6634487Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6634659Z               "line": 1341
2026-08-28T09:54:46.6634811Z             },
2026-08-28T09:54:46.6634964Z             {
2026-08-28T09:54:46.6635184Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6635350Z               "line": 1383
2026-08-28T09:54:46.6635499Z             },
2026-08-28T09:54:46.6635655Z             {
2026-08-28T09:54:46.6635880Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6636035Z               "line": 1455
2026-08-28T09:54:46.6636184Z             },
2026-08-28T09:54:46.6636336Z             {
2026-08-28T09:54:46.6636565Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6636722Z               "line": 1468
2026-08-28T09:54:46.6636875Z             },
2026-08-28T09:54:46.6637017Z             {
2026-08-28T09:54:46.6637242Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6637405Z               "line": 1491
2026-08-28T09:54:46.6637561Z             },
2026-08-28T09:54:46.6637710Z             {
2026-08-28T09:54:46.6637957Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6638129Z               "line": 1517
2026-08-28T09:54:46.6638276Z             },
2026-08-28T09:54:46.6638428Z             {
2026-08-28T09:54:46.6638741Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6638907Z               "line": 1531
2026-08-28T09:54:46.6639132Z             },
2026-08-28T09:54:46.6639284Z             {
2026-08-28T09:54:46.6639518Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6639681Z               "line": 1555
2026-08-28T09:54:46.6639833Z             },
2026-08-28T09:54:46.6639981Z             {
2026-08-28T09:54:46.6640209Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6640372Z               "line": 1713
2026-08-28T09:54:46.6640528Z             },
2026-08-28T09:54:46.6640678Z             {
2026-08-28T09:54:46.6640902Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6641185Z               "line": 1981
2026-08-28T09:54:46.6641338Z             },
2026-08-28T09:54:46.6641488Z             {
2026-08-28T09:54:46.6641713Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6641875Z               "line": 2036
2026-08-28T09:54:46.6642019Z             },
2026-08-28T09:54:46.6642175Z             {
2026-08-28T09:54:46.6642394Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6642562Z               "line": 2082
2026-08-28T09:54:46.6642714Z             },
2026-08-28T09:54:46.6642858Z             {
2026-08-28T09:54:46.6643086Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6643239Z               "line": 2127
2026-08-28T09:54:46.6643396Z             },
2026-08-28T09:54:46.6643540Z             {
2026-08-28T09:54:46.6643771Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6643932Z               "line": 2171
2026-08-28T09:54:46.6644083Z             },
2026-08-28T09:54:46.6644233Z             {
2026-08-28T09:54:46.6644461Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.6644627Z               "line": 2213
2026-08-28T09:54:46.6645037Z             },
2026-08-28T09:54:46.6645190Z             {
2026-08-28T09:54:46.6645458Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6645619Z               "line": 9884
2026-08-28T09:54:46.6645773Z             },
2026-08-28T09:54:46.6645924Z             {
2026-08-28T09:54:46.6646158Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6646311Z               "line": 217
2026-08-28T09:54:46.6646468Z             },
2026-08-28T09:54:46.6646619Z             {
2026-08-28T09:54:46.6646839Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6646996Z               "line": 233
2026-08-28T09:54:46.6647306Z             },
2026-08-28T09:54:46.6647459Z             {
2026-08-28T09:54:46.6647688Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6647849Z               "line": 254
2026-08-28T09:54:46.6647999Z             },
2026-08-28T09:54:46.6648150Z             {
2026-08-28T09:54:46.6648375Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6648536Z               "line": 265
2026-08-28T09:54:46.6648685Z             },
2026-08-28T09:54:46.6648840Z             {
2026-08-28T09:54:46.6649153Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6649311Z               "line": 278
2026-08-28T09:54:46.6649462Z             },
2026-08-28T09:54:46.6649611Z             {
2026-08-28T09:54:46.6649839Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6649993Z               "line": 289
2026-08-28T09:54:46.6650149Z             },
2026-08-28T09:54:46.6650303Z             {
2026-08-28T09:54:46.6650532Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6650698Z               "line": 301
2026-08-28T09:54:46.6650847Z             },
2026-08-28T09:54:46.6650998Z             {
2026-08-28T09:54:46.6651218Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6651380Z               "line": 312
2026-08-28T09:54:46.6651529Z             },
2026-08-28T09:54:46.6651679Z             {
2026-08-28T09:54:46.6651907Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6652072Z               "line": 323
2026-08-28T09:54:46.6652230Z             },
2026-08-28T09:54:46.6652425Z             {
2026-08-28T09:54:46.6652677Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6652836Z               "line": 332
2026-08-28T09:54:46.6652992Z             },
2026-08-28T09:54:46.6653146Z             {
2026-08-28T09:54:46.6653389Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6653555Z               "line": 342
2026-08-28T09:54:46.6653694Z             },
2026-08-28T09:54:46.6653995Z             {
2026-08-28T09:54:46.6654231Z               "path": "crates/spt-daemon/src/deadline.rs",
2026-08-28T09:54:46.6654398Z               "line": 358
2026-08-28T09:54:46.6654548Z             },
2026-08-28T09:54:46.6654701Z             {
2026-08-28T09:54:46.6654939Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.6655107Z               "line": 3580
2026-08-28T09:54:46.6655259Z             },
2026-08-28T09:54:46.6655407Z             {
2026-08-28T09:54:46.6655646Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.6655803Z               "line": 3616
2026-08-28T09:54:46.6655961Z             },
2026-08-28T09:54:46.6656113Z             {
2026-08-28T09:54:46.6656338Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:46.6656503Z               "line": 1450
2026-08-28T09:54:46.6656653Z             },
2026-08-28T09:54:46.6656809Z             {
2026-08-28T09:54:46.6657042Z               "path": "crates/spt-daemon/tests/resume.rs",
2026-08-28T09:54:46.6657208Z               "line": 143
2026-08-28T09:54:46.6657357Z             },
2026-08-28T09:54:46.6657513Z             {
2026-08-28T09:54:46.6657737Z               "path": "crates/spt-daemon/tests/resume.rs",
2026-08-28T09:54:46.6657901Z               "line": 222
2026-08-28T09:54:46.6658057Z             },
2026-08-28T09:54:46.6658205Z             {
2026-08-28T09:54:46.6658433Z               "path": "crates/spt-daemon/tests/resume.rs",
2026-08-28T09:54:46.6658592Z               "line": 291
2026-08-28T09:54:46.6658748Z             },
2026-08-28T09:54:46.6658893Z             {
2026-08-28T09:54:46.6659226Z               "path": "crates/spt/tests/brain_split.rs",
2026-08-28T09:54:46.6659386Z               "line": 17
2026-08-28T09:54:46.6659548Z             },
2026-08-28T09:54:46.6659699Z             {
2026-08-28T09:54:46.6659924Z               "path": "crates/spt/tests/brain_split.rs",
2026-08-28T09:54:46.6660205Z               "line": 104
2026-08-28T09:54:46.6660352Z             }
2026-08-28T09:54:46.6660515Z           ]
2026-08-28T09:54:46.6660667Z         }
2026-08-28T09:54:46.6660820Z       }
2026-08-28T09:54:46.6660967Z     },
2026-08-28T09:54:46.6661116Z     {
2026-08-28T09:54:46.6661329Z       "id": "REQ-HAZARD-BROKER-QUIC-DEADLINE",
2026-08-28T09:54:46.6667964Z       "title": "The broker bounds every brain-waiting QUIC op (dial / open_stream / send_stream) so a black-holed or dead peer fails PROMPTLY with an ORDINARY error the broker REPLIES, never an unbounded await. The bound (< the brain's 30s PUMP_PEER_IO_TIMEOUT so the BROKER fires first) surfaces to the pump as a normal broker error reply → peer_outcome's non-TimedOut arm → drop conn + redial next tick, the round CONTINUES and the heartbeat keeps advancing — it must NEVER manifest as the brain's own read-deadline (the A-half poison → supervised-restart path REQ-HAZARD-PUMP-IPC-DEADLINE guards). Exactly-once is preserved: a timed-out journaled op fails INSIDE its apply_once closure so no phantom conn_id/stream_id is recorded and a fresh tick re-dials cleanly. The happy path is unchanged (a live peer completes with zero added latency; the bound only bites a non-responsive peer). This is the ROOT-cause cure for the 2.2h hfenduleam pump wedge — a dead roster peer whose QUIC path the broker awaited unbounded — recurring on hfenduleam 2026-06-16.",
2026-08-28T09:54:46.6668155Z       "requiredStages": [
2026-08-28T09:54:46.6668307Z         "doc",
2026-08-28T09:54:46.6668451Z         "impl",
2026-08-28T09:54:46.6668608Z         "unit",
2026-08-28T09:54:46.6668746Z         "int"
2026-08-28T09:54:46.6668894Z       ],
2026-08-28T09:54:46.6669152Z       "stages": {
2026-08-28T09:54:46.6669313Z         "doc": {
2026-08-28T09:54:46.6669490Z           "complete": true,
2026-08-28T09:54:46.6669647Z           "evidence": [
2026-08-28T09:54:46.6669810Z             {
2026-08-28T09:54:46.6670003Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6670164Z               "line": 499
2026-08-28T09:54:46.6670320Z             }
2026-08-28T09:54:46.6670593Z           ]
2026-08-28T09:54:46.6670746Z         },
2026-08-28T09:54:46.6670907Z         "impl": {
2026-08-28T09:54:46.6671075Z           "complete": true,
2026-08-28T09:54:46.6671231Z           "evidence": [
2026-08-28T09:54:46.6671385Z             {
2026-08-28T09:54:46.6671613Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.6671780Z               "line": 1445
2026-08-28T09:54:46.6671918Z             },
2026-08-28T09:54:46.6672066Z             {
2026-08-28T09:54:46.6672287Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.6672447Z               "line": 1468
2026-08-28T09:54:46.6672654Z             }
2026-08-28T09:54:46.6672866Z           ]
2026-08-28T09:54:46.6673093Z         },
2026-08-28T09:54:46.6673342Z         "int": {
2026-08-28T09:54:46.6673594Z           "complete": true,
2026-08-28T09:54:46.6673826Z           "evidence": [
2026-08-28T09:54:46.6674065Z             {
2026-08-28T09:54:46.6674432Z               "path": "crates/spt-daemon/tests/netbroker.rs",
2026-08-28T09:54:46.6674685Z               "line": 234
2026-08-28T09:54:46.6674920Z             },
2026-08-28T09:54:46.6675154Z             {
2026-08-28T09:54:46.6675505Z               "path": "crates/spt-daemon/tests/pump.rs",
2026-08-28T09:54:46.6675740Z               "line": 481
2026-08-28T09:54:46.6675960Z             }
2026-08-28T09:54:46.6676175Z           ]
2026-08-28T09:54:46.6676417Z         },
2026-08-28T09:54:46.6676656Z         "unit": {
2026-08-28T09:54:46.6676918Z           "complete": true,
2026-08-28T09:54:46.6677091Z           "evidence": [
2026-08-28T09:54:46.6677238Z             {
2026-08-28T09:54:46.6677482Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.6677721Z               "line": 2666
2026-08-28T09:54:46.6677967Z             }
2026-08-28T09:54:46.6678135Z           ]
2026-08-28T09:54:46.6678276Z         }
2026-08-28T09:54:46.6678415Z       }
2026-08-28T09:54:46.6678720Z     },
2026-08-28T09:54:46.6678863Z     {
2026-08-28T09:54:46.6679187Z       "id": "REQ-HAZARD-BROKER-SEED-WIRE-SKEW",
2026-08-28T09:54:46.6687327Z       "title": "A daemon-state wire-format change (e.g. the v0.9.0 adapter-agnostic Seed) does NOT take effect until a DELIBERATE full broker restart: the broker serves the seed-control channel and is RESIDENT across a brain-only self-update (ADR-0004 no-terminate-during-update forbids auto-killing it), so a NEW-version CLI talking to a still-resident OLD broker fails the seed handshake — the old broker cannot deserialize the new Seed (its formerly-required `adapter` field is gone) and drops the conn without an ack, which surfaces to the CLI as a raw UnexpectedEof 'failed to fill whole buffer'. spt-core must (a) surface an ACTIONABLE diagnostic on that seed-ack EOF (name the stale-broker cause + the `spt daemon stop` fix — the broker restarts on the next api call), never the cryptic io error; and (b) document the operational rule (a deliberate broker restart is required on any daemon-state wire change — NOT automatic) + the FORWARD discipline (daemon-state/Seed schema changes stay additive + serde-default so a resident OLD broker tolerates a NEW CLI across a brain-only update; note this would NOT have rescued 0.9.0 itself, since the old broker's `adapter` was a required field). perri PREP-4 FINDING 1 (v0.9.0 CLI vs stale 0.8.x broker).",
2026-08-28T09:54:46.6687526Z       "requiredStages": [
2026-08-28T09:54:46.6687679Z         "doc",
2026-08-28T09:54:46.6687841Z         "impl",
2026-08-28T09:54:46.6688023Z         "unit"
2026-08-28T09:54:46.6688193Z       ],
2026-08-28T09:54:46.6688352Z       "stages": {
2026-08-28T09:54:46.6688499Z         "doc": {
2026-08-28T09:54:46.6688672Z           "complete": true,
2026-08-28T09:54:46.6688831Z           "evidence": [
2026-08-28T09:54:46.6693721Z             {
2026-08-28T09:54:46.6693990Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6694157Z               "line": 506
2026-08-28T09:54:46.6694327Z             }
2026-08-28T09:54:46.6694486Z           ]
2026-08-28T09:54:46.6694800Z         },
2026-08-28T09:54:46.6694961Z         "impl": {
2026-08-28T09:54:46.6695134Z           "complete": true,
2026-08-28T09:54:46.6695291Z           "evidence": [
2026-08-28T09:54:46.6695443Z             {
2026-08-28T09:54:46.6695659Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6695824Z               "line": 76
2026-08-28T09:54:46.6695974Z             }
2026-08-28T09:54:46.6696129Z           ]
2026-08-28T09:54:46.6696279Z         },
2026-08-28T09:54:46.6696434Z         "int": {
2026-08-28T09:54:46.6696605Z           "complete": false,
2026-08-28T09:54:46.6696761Z           "evidence": []
2026-08-28T09:54:46.6697005Z         },
2026-08-28T09:54:46.6697156Z         "unit": {
2026-08-28T09:54:46.6697319Z           "complete": true,
2026-08-28T09:54:46.6697476Z           "evidence": [
2026-08-28T09:54:46.6697629Z             {
2026-08-28T09:54:46.6697843Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.6698010Z               "line": 1852
2026-08-28T09:54:46.6698172Z             }
2026-08-28T09:54:46.6698320Z           ]
2026-08-28T09:54:46.6698472Z         }
2026-08-28T09:54:46.6698616Z       }
2026-08-28T09:54:46.6698768Z     },
2026-08-28T09:54:46.6698912Z     {
2026-08-28T09:54:46.6699269Z       "id": "REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE",
2026-08-28T09:54:46.6708132Z       "title": "W2 (LIFECYCLE-TRUTH, KNOWN-HAZARDS, flagship — the update wedge): PTY viewer fan-out and control mutations must not depend synchronously on a live draining brain. ROOT rig-CONFIRMED (NtSuspendProcess on the brain, no update involved): brain-subscriber session-output writes ride UNDER the per-session log lock (broker.rs:19-20); failed writes are handled (cursor freeze + detach :3486) but BLOCKED writes are not. Suspended brain => within seconds attached rc output freezes; detach does NOT release the control stamp (release routes through the brain); reattach REFUSED (controlled-by); rc --take hangs; daemon status stays healthy. Field: every brain cycle (incl. every update apply) has a freeze window; a stalled/slow-draining new brain = permanent wedge until bounce; brain.ready != subscribers drained. FIX SHAPE (todlando proposes, doyle RULES BEFORE IMPL): subscriber writes move OFF the log lock (bounded/nonblocking, stall => detach-subscriber like viewer eviction — broker already buffers + replays on re-attach, so a detached-stalled brain self-heals by rewind); control stamp release/take completes against the BROKER without brain round-trip (or bounded with loud timeout). doc = KNOWN-HAZARDS entry. Int (tonight's rig, encoded): suspend brain child mid-session -> attached viewer ticks CONTINUE + rc --take completes; resume -> no output lost (cursor replay).",
2026-08-28T09:54:46.6708527Z       "requiredStages": [
2026-08-28T09:54:46.6708684Z         "doc",
2026-08-28T09:54:46.6708847Z         "impl",
2026-08-28T09:54:46.6709086Z         "unit",
2026-08-28T09:54:46.6709242Z         "int"
2026-08-28T09:54:46.6709401Z       ],
2026-08-28T09:54:46.6709561Z       "stages": {
2026-08-28T09:54:46.6709720Z         "doc": {
2026-08-28T09:54:46.6709885Z           "complete": true,
2026-08-28T09:54:46.6710047Z           "evidence": [
2026-08-28T09:54:46.6710200Z             {
2026-08-28T09:54:46.6710401Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6710562Z               "line": 710
2026-08-28T09:54:46.6710725Z             }
2026-08-28T09:54:46.6710877Z           ]
2026-08-28T09:54:46.6711026Z         },
2026-08-28T09:54:46.6711311Z         "impl": {
2026-08-28T09:54:46.6711482Z           "complete": true,
2026-08-28T09:54:46.6711646Z           "evidence": [
2026-08-28T09:54:46.6711792Z             {
2026-08-28T09:54:46.6712050Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.6712211Z               "line": 1761
2026-08-28T09:54:46.6712363Z             },
2026-08-28T09:54:46.6712523Z             {
2026-08-28T09:54:46.6712757Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6712934Z               "line": 211
2026-08-28T09:54:46.6713219Z             },
2026-08-28T09:54:46.6713377Z             {
2026-08-28T09:54:46.6713611Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6713777Z               "line": 220
2026-08-28T09:54:46.6713911Z             },
2026-08-28T09:54:46.6714073Z             {
2026-08-28T09:54:46.6714302Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6714459Z               "line": 392
2026-08-28T09:54:46.6714617Z             },
2026-08-28T09:54:46.6714784Z             {
2026-08-28T09:54:46.6715007Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6715164Z               "line": 404
2026-08-28T09:54:46.6715319Z             },
2026-08-28T09:54:46.6715462Z             {
2026-08-28T09:54:46.6715685Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6715849Z               "line": 409
2026-08-28T09:54:46.6716000Z             },
2026-08-28T09:54:46.6716159Z             {
2026-08-28T09:54:46.6716377Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6716540Z               "line": 418
2026-08-28T09:54:46.6716682Z             },
2026-08-28T09:54:46.6716841Z             {
2026-08-28T09:54:46.6717065Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6717226Z               "line": 2630
2026-08-28T09:54:46.6717370Z             },
2026-08-28T09:54:46.6717517Z             {
2026-08-28T09:54:46.6717750Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6717914Z               "line": 2666
2026-08-28T09:54:46.6718072Z             },
2026-08-28T09:54:46.6718219Z             {
2026-08-28T09:54:46.6718449Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6718615Z               "line": 3572
2026-08-28T09:54:46.6718768Z             },
2026-08-28T09:54:46.6718925Z             {
2026-08-28T09:54:46.6719273Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6719564Z               "line": 8793
2026-08-28T09:54:46.6719717Z             },
2026-08-28T09:54:46.6719874Z             {
2026-08-28T09:54:46.6720069Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.6720227Z               "line": 8301
2026-08-28T09:54:46.6720384Z             },
2026-08-28T09:54:46.6720530Z             {
2026-08-28T09:54:46.6720732Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.6720893Z               "line": 8734
2026-08-28T09:54:46.6721051Z             }
2026-08-28T09:54:46.6721193Z           ]
2026-08-28T09:54:46.6721347Z         },
2026-08-28T09:54:46.6721498Z         "int": {
2026-08-28T09:54:46.6721661Z           "complete": true,
2026-08-28T09:54:46.6721818Z           "evidence": [
2026-08-28T09:54:46.6721962Z             {
2026-08-28T09:54:46.6722239Z               "path": "crates/spt-daemon/tests/brain_decouple.rs",
2026-08-28T09:54:46.6722400Z               "line": 217
2026-08-28T09:54:46.6722564Z             }
2026-08-28T09:54:46.6722714Z           ]
2026-08-28T09:54:46.6722881Z         },
2026-08-28T09:54:46.6723031Z         "unit": {
2026-08-28T09:54:46.6723203Z           "complete": true,
2026-08-28T09:54:46.6723365Z           "evidence": [
2026-08-28T09:54:46.6723513Z             {
2026-08-28T09:54:46.6723736Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6723895Z               "line": 12353
2026-08-28T09:54:46.6724051Z             },
2026-08-28T09:54:46.6724204Z             {
2026-08-28T09:54:46.6724433Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6724590Z               "line": 12430
2026-08-28T09:54:46.6724748Z             },
2026-08-28T09:54:46.6724905Z             {
2026-08-28T09:54:46.6725130Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6725296Z               "line": 12459
2026-08-28T09:54:46.6725445Z             },
2026-08-28T09:54:46.6725595Z             {
2026-08-28T09:54:46.6725795Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.6726079Z               "line": 34838
2026-08-28T09:54:46.6726237Z             }
2026-08-28T09:54:46.6726385Z           ]
2026-08-28T09:54:46.6726547Z         }
2026-08-28T09:54:46.6726695Z       }
2026-08-28T09:54:46.6726848Z     },
2026-08-28T09:54:46.6726995Z     {
2026-08-28T09:54:46.6727209Z       "id": "REQ-HAZARD-CASCADE-WIPE-GUARD",
2026-08-28T09:54:46.6727567Z       "title": "No hard-delete of a parent hosting non-empty children (6.3)",
2026-08-28T09:54:46.6727749Z       "requiredStages": [
2026-08-28T09:54:46.6727911Z         "impl",
2026-08-28T09:54:46.6728069Z         "unit"
2026-08-28T09:54:46.6728224Z       ],
2026-08-28T09:54:46.6728376Z       "stages": {
2026-08-28T09:54:46.6728531Z         "doc": {
2026-08-28T09:54:46.6728699Z           "complete": false,
2026-08-28T09:54:46.6728870Z           "evidence": []
2026-08-28T09:54:46.6729113Z         },
2026-08-28T09:54:46.6729272Z         "impl": {
2026-08-28T09:54:46.6729442Z           "complete": true,
2026-08-28T09:54:46.6729610Z           "evidence": [
2026-08-28T09:54:46.6729766Z             {
2026-08-28T09:54:46.6729995Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.6730162Z               "line": 333
2026-08-28T09:54:46.6730315Z             },
2026-08-28T09:54:46.6730472Z             {
2026-08-28T09:54:46.6730686Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.6730855Z               "line": 18
2026-08-28T09:54:46.6731015Z             },
2026-08-28T09:54:46.6731167Z             {
2026-08-28T09:54:46.6731382Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.6731540Z               "line": 152
2026-08-28T09:54:46.6731696Z             }
2026-08-28T09:54:46.6731846Z           ]
2026-08-28T09:54:46.6731997Z         },
2026-08-28T09:54:46.6732146Z         "int": {
2026-08-28T09:54:46.6732326Z           "complete": false,
2026-08-28T09:54:46.6732494Z           "evidence": []
2026-08-28T09:54:46.6732761Z         },
2026-08-28T09:54:46.6732927Z         "unit": {
2026-08-28T09:54:46.6733100Z           "complete": true,
2026-08-28T09:54:46.6733274Z           "evidence": [
2026-08-28T09:54:46.6733427Z             {
2026-08-28T09:54:46.6733657Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.6733821Z               "line": 1672
2026-08-28T09:54:46.6733977Z             },
2026-08-28T09:54:46.6734136Z             {
2026-08-28T09:54:46.6734349Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.6734512Z               "line": 267
2026-08-28T09:54:46.6734669Z             },
2026-08-28T09:54:46.6734822Z             {
2026-08-28T09:54:46.6735032Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.6735193Z               "line": 339
2026-08-28T09:54:46.6735343Z             }
2026-08-28T09:54:46.6735498Z           ]
2026-08-28T09:54:46.6735657Z         }
2026-08-28T09:54:46.6735808Z       }
2026-08-28T09:54:46.6735962Z     },
2026-08-28T09:54:46.6736113Z     {
2026-08-28T09:54:46.6736332Z       "id": "REQ-HAZARD-CEREMONY-CLOCK-STEP",
2026-08-28T09:54:46.6744823Z       "title": "W1/D3 (JOIN-TRUTH, KNOWN-HAZARDS): the cached ceremony offset goes stale-WRONG when the OS clock STEPS under a live daemon — an offset measured against the OLD clock keeps applying for up to the 15-min TTL. Field-proven timeline (enlyzeam): refresh cadence 15:08/15:23/15:38/15:53; operator `w32tm /resync` stepped the clock −210s at 15:45:46; every `subnet join` returned NO_SEED_HOLDER until a daemon bounce forced a fresh query. Fix: the cache snapshot stores an (Instant, SystemTime) PAIR; on read, if |wall-elapsed − mono-elapsed| > ~2s the clock stepped ⇒ force an immediate refresh (offset recomputed against the new clock). PLUS: `meet_seed_holder` (pairhost.rs), on search-deadline exhaustion, forces ONE fresh NTP refresh + one final sweep before returning NO_SEED_HOLDER — so a stepped-clock join self-heals without a bounce. Clock reads must be seam-injectable for the hazard unit (inject the (mono,wall) pair — do NOT sleep 15 min).",
2026-08-28T09:54:46.6745152Z       "requiredStages": [
2026-08-28T09:54:46.6745320Z         "impl",
2026-08-28T09:54:46.6745472Z         "unit"
2026-08-28T09:54:46.6745616Z       ],
2026-08-28T09:54:46.6745782Z       "stages": {
2026-08-28T09:54:46.6745931Z         "doc": {
2026-08-28T09:54:46.6746125Z           "complete": false,
2026-08-28T09:54:46.6746302Z           "evidence": []
2026-08-28T09:54:46.6746454Z         },
2026-08-28T09:54:46.6746612Z         "impl": {
2026-08-28T09:54:46.6746772Z           "complete": true,
2026-08-28T09:54:46.6746929Z           "evidence": [
2026-08-28T09:54:46.6747084Z             {
2026-08-28T09:54:46.6747371Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.6747529Z               "line": 510
2026-08-28T09:54:46.6747691Z             },
2026-08-28T09:54:46.6747835Z             {
2026-08-28T09:54:46.6748140Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6748306Z               "line": 111
2026-08-28T09:54:46.6748465Z             },
2026-08-28T09:54:46.6748620Z             {
2026-08-28T09:54:46.6748921Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6749165Z               "line": 118
2026-08-28T09:54:46.6749311Z             },
2026-08-28T09:54:46.6749463Z             {
2026-08-28T09:54:46.6749757Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6749924Z               "line": 174
2026-08-28T09:54:46.6750077Z             },
2026-08-28T09:54:46.6750234Z             {
2026-08-28T09:54:46.6750525Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6750693Z               "line": 195
2026-08-28T09:54:46.6750854Z             },
2026-08-28T09:54:46.6751002Z             {
2026-08-28T09:54:46.6751297Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6751459Z               "line": 202
2026-08-28T09:54:46.6751612Z             }
2026-08-28T09:54:46.6751878Z           ]
2026-08-28T09:54:46.6752037Z         },
2026-08-28T09:54:46.6752197Z         "int": {
2026-08-28T09:54:46.6752379Z           "complete": false,
2026-08-28T09:54:46.6752550Z           "evidence": []
2026-08-28T09:54:46.6752698Z         },
2026-08-28T09:54:46.6752860Z         "unit": {
2026-08-28T09:54:46.6753032Z           "complete": true,
2026-08-28T09:54:46.6753203Z           "evidence": [
2026-08-28T09:54:46.6753347Z             {
2026-08-28T09:54:46.6753624Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.6753794Z               "line": 1121
2026-08-28T09:54:46.6753944Z             },
2026-08-28T09:54:46.6754099Z             {
2026-08-28T09:54:46.6754371Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:46.6754542Z               "line": 1154
2026-08-28T09:54:46.6754692Z             },
2026-08-28T09:54:46.6754850Z             {
2026-08-28T09:54:46.6755136Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6755308Z               "line": 477
2026-08-28T09:54:46.6755465Z             },
2026-08-28T09:54:46.6755618Z             {
2026-08-28T09:54:46.6755932Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:46.6756104Z               "line": 537
2026-08-28T09:54:46.6756266Z             }
2026-08-28T09:54:46.6756409Z           ]
2026-08-28T09:54:46.6756571Z         }
2026-08-28T09:54:46.6756709Z       }
2026-08-28T09:54:46.6756867Z     },
2026-08-28T09:54:46.6757020Z     {
2026-08-28T09:54:46.6757252Z       "id": "REQ-HAZARD-CHILD-CONSOLE-FLASH",
2026-08-28T09:54:46.6758747Z       "title": "Console-subsystem children of the console-less daemon spawn with CREATE_NO_WINDOW, or each spawn flashes a visible blank window on the user's desktop (5.8)",
2026-08-28T09:54:46.6758923Z       "requiredStages": [
2026-08-28T09:54:46.6759171Z         "impl",
2026-08-28T09:54:46.6759320Z         "unit"
2026-08-28T09:54:46.6759481Z       ],
2026-08-28T09:54:46.6759640Z       "stages": {
2026-08-28T09:54:46.6759805Z         "doc": {
2026-08-28T09:54:46.6760108Z           "complete": true,
2026-08-28T09:54:46.6760274Z           "evidence": [
2026-08-28T09:54:46.6760432Z             {
2026-08-28T09:54:46.6760651Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6760818Z               "line": 259
2026-08-28T09:54:46.6760961Z             }
2026-08-28T09:54:46.6761113Z           ]
2026-08-28T09:54:46.6761262Z         },
2026-08-28T09:54:46.6761433Z         "impl": {
2026-08-28T09:54:46.6761615Z           "complete": true,
2026-08-28T09:54:46.6761771Z           "evidence": [
2026-08-28T09:54:46.6761925Z             {
2026-08-28T09:54:46.6762192Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.6762372Z               "line": 637
2026-08-28T09:54:46.6762526Z             },
2026-08-28T09:54:46.6762677Z             {
2026-08-28T09:54:46.6762982Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:46.6763153Z               "line": 244
2026-08-28T09:54:46.6763311Z             },
2026-08-28T09:54:46.6763463Z             {
2026-08-28T09:54:46.6763768Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:46.6763930Z               "line": 259
2026-08-28T09:54:46.6764092Z             },
2026-08-28T09:54:46.6764241Z             {
2026-08-28T09:54:46.6764527Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.6764703Z               "line": 883
2026-08-28T09:54:46.6764851Z             },
2026-08-28T09:54:46.6765007Z             {
2026-08-28T09:54:46.6765305Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.6765477Z               "line": 1105
2026-08-28T09:54:46.6765629Z             },
2026-08-28T09:54:46.6765783Z             {
2026-08-28T09:54:46.6766059Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.6766225Z               "line": 107
2026-08-28T09:54:46.6766379Z             }
2026-08-28T09:54:46.6766531Z           ]
2026-08-28T09:54:46.6766807Z         },
2026-08-28T09:54:46.6766969Z         "int": {
2026-08-28T09:54:46.6767154Z           "complete": false,
2026-08-28T09:54:46.6767328Z           "evidence": []
2026-08-28T09:54:46.6767483Z         },
2026-08-28T09:54:46.6767638Z         "unit": {
2026-08-28T09:54:46.6767822Z           "complete": true,
2026-08-28T09:54:46.6767993Z           "evidence": [
2026-08-28T09:54:46.6768148Z             {
2026-08-28T09:54:46.6768468Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:46.6768641Z               "line": 402
2026-08-28T09:54:46.6768796Z             },
2026-08-28T09:54:46.6769040Z             {
2026-08-28T09:54:46.6769336Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.6769507Z               "line": 1705
2026-08-28T09:54:46.6769660Z             },
2026-08-28T09:54:46.6769822Z             {
2026-08-28T09:54:46.6770108Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.6770276Z               "line": 1743
2026-08-28T09:54:46.6770450Z             },
2026-08-28T09:54:46.6770602Z             {
2026-08-28T09:54:46.6770887Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.6771053Z               "line": 198
2026-08-28T09:54:46.6771207Z             }
2026-08-28T09:54:46.6771363Z           ]
2026-08-28T09:54:46.6771522Z         }
2026-08-28T09:54:46.6771669Z       }
2026-08-28T09:54:46.6771813Z     },
2026-08-28T09:54:46.6771964Z     {
2026-08-28T09:54:46.6772241Z       "id": "REQ-HAZARD-CODE-SEAL-SEED-ORACLE",
2026-08-28T09:54:46.6788191Z       "title": "THE CODE SEAL MUST NEVER BECOME AN ORACLE AGAINST THE SUBNET SEED. The seed is live credential material with an existing TOTP use, and the sealed code is a string DESIGNED TO BE HANDED AROUND OUT OF BAND -- so the envelope reaches populations the seed never should. The invariant: the seal touches the seed ONLY through HKDF-derived keys under domain-separated, VERSIONED labels distinct from every other derivation the seed already feeds, so possession of any number of envelopes yields nothing about the seed and nothing about any other key derived from it. THE RAW SEED NEVER ENTERS THE ENVELOPE, the cipher key and the authentication key are SEPARATE derivations rather than one key used twice, and derived key material is wiped after use in the shape the membership-key primitive already established. This is the KDF no-reveal invariant ADR-0054 records, stated as a hazard because it is the kind of property that survives review and dies to a later refactor that 'simplifies' two derivations into one. Gate: impl -- the domain-separated derivations and the wipe; unit -- the encryption and authentication keys derived from one seed are DIFFERENT (the assertion a collapsed refactor fails), the derivation label is versioned and distinct from the membership-key and seed-proof domains, and no envelope byte equals any seed byte run for a real seed -- with a contrasting fixture proving the scan can see a match it is looking for.",
2026-08-28T09:54:46.6788524Z       "requiredStages": [
2026-08-28T09:54:46.6788695Z         "impl",
2026-08-28T09:54:46.6788858Z         "unit"
2026-08-28T09:54:46.6789099Z       ],
2026-08-28T09:54:46.6789264Z       "stages": {
2026-08-28T09:54:46.6789417Z         "doc": {
2026-08-28T09:54:46.6789597Z           "complete": false,
2026-08-28T09:54:46.6789770Z           "evidence": []
2026-08-28T09:54:46.6789922Z         },
2026-08-28T09:54:46.6790085Z         "impl": {
2026-08-28T09:54:46.6790264Z           "complete": true,
2026-08-28T09:54:46.6790433Z           "evidence": [
2026-08-28T09:54:46.6790589Z             {
2026-08-28T09:54:46.6790890Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:46.6791058Z               "line": 49
2026-08-28T09:54:46.6791209Z             }
2026-08-28T09:54:46.6791363Z           ]
2026-08-28T09:54:46.6791513Z         },
2026-08-28T09:54:46.6791685Z         "int": {
2026-08-28T09:54:46.6791878Z           "complete": false,
2026-08-28T09:54:46.6792050Z           "evidence": []
2026-08-28T09:54:46.6792313Z         },
2026-08-28T09:54:46.6792469Z         "unit": {
2026-08-28T09:54:46.6792652Z           "complete": true,
2026-08-28T09:54:46.6792822Z           "evidence": [
2026-08-28T09:54:46.6792981Z             {
2026-08-28T09:54:46.6793272Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:46.6793442Z               "line": 697
2026-08-28T09:54:46.6793601Z             },
2026-08-28T09:54:46.6793747Z             {
2026-08-28T09:54:46.6794028Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:46.6794192Z               "line": 718
2026-08-28T09:54:46.6794347Z             }
2026-08-28T09:54:46.6794505Z           ]
2026-08-28T09:54:46.6794662Z         }
2026-08-28T09:54:46.6794809Z       }
2026-08-28T09:54:46.6794968Z     },
2026-08-28T09:54:46.6795124Z     {
2026-08-28T09:54:46.6795415Z       "id": "REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE",
2026-08-28T09:54:46.6818077Z       "title": "F-032 (perri field finding 2026-07-08, LEGACY-SPT-PARITY-GAP, data-loss): commune/signoff ingest MUST NOT delete a drop until its content is DURABLY COMMITTED to every APPLICABLE tier — a slice that cannot be committed this ingest must leave the drop in place for a later ingest (retry when the precondition resolves) OR durably preserve the un-committed slice, NEVER delete-then-lose. ROOT (doyle triage, code-grounded): ingest_drops (spt-live/src/ingest.rs:200) unconditionally `remove_file(&drop_path)?` AFTER route_slices (ingest.rs:121), but route_slices GATES the project tier on `!project_id.is_empty()` (ingest.rs:156) — when the endpoint's cwd is unresolved/owlery-internal at ingest time the project_id is empty, so the `<project-context>` slice is PARSED but never write_context'd/commit_project'd, yet the source drop is still deleted → the project-context content is permanently lost (black-hole). perri's repro: a two-sliced echo-commune (<live-context> role+release recipe + <project-context> v0.17.4 status + Items 3-5 map) INGESTED (file deleted) yet never surfaced at her next SessionStart resume-pull; adapter exonerated (file-write + slicing tags correct); fixture at (system temp)/F-032-commune-2026-07-08T222721Z.md (5595B, sha256 9bc27e18cf385958; perri wrote it verbatim from session log 0841835d.jsonl). Legacy spt held commit-first-then-delete parity; the modern two-slice ingest broke it. FIX distinguishes: a write SUPPRESSED-by-precedence (incoming older than durable → already-superseded → safe to delete) from a slice NOT-committed-because-un-committable-now (empty project_id / write error → must NOT delete; retry or preserve). Gate: an ingest with a non-empty <project-context> slice but an EMPTY project_id must NOT delete the drop (or must durably preserve the project slice) — the content survives to the next resolvable ingest / SessionStart; the live-tier commit path stays unchanged; a genuinely superseded (precedence-suppressed) drop still deletes. KNOWN-HAZARDS entry on landing (REQ-HAZARD-* = conformance-checklist, needs a test).",
2026-08-28T09:54:46.6818425Z       "requiredStages": [
2026-08-28T09:54:46.6818588Z         "impl",
2026-08-28T09:54:46.6818740Z         "unit",
2026-08-28T09:54:46.6818898Z         "int"
2026-08-28T09:54:46.6819111Z       ],
2026-08-28T09:54:46.6819274Z       "stages": {
2026-08-28T09:54:46.6819422Z         "doc": {
2026-08-28T09:54:46.6819593Z           "complete": true,
2026-08-28T09:54:46.6819760Z           "evidence": [
2026-08-28T09:54:46.6819908Z             {
2026-08-28T09:54:46.6820143Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6820304Z               "line": 742
2026-08-28T09:54:46.6820463Z             }
2026-08-28T09:54:46.6820618Z           ]
2026-08-28T09:54:46.6820770Z         },
2026-08-28T09:54:46.6820930Z         "impl": {
2026-08-28T09:54:46.6821112Z           "complete": true,
2026-08-28T09:54:46.6821278Z           "evidence": [
2026-08-28T09:54:46.6821436Z             {
2026-08-28T09:54:46.6821693Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6821969Z               "line": 257
2026-08-28T09:54:46.6822127Z             },
2026-08-28T09:54:46.6822284Z             {
2026-08-28T09:54:46.6822541Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6822729Z               "line": 289
2026-08-28T09:54:46.6822880Z             },
2026-08-28T09:54:46.6823034Z             {
2026-08-28T09:54:46.6823313Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6823502Z               "line": 309
2026-08-28T09:54:46.6823659Z             }
2026-08-28T09:54:46.6823807Z           ]
2026-08-28T09:54:46.6823954Z         },
2026-08-28T09:54:46.6824108Z         "int": {
2026-08-28T09:54:46.6824294Z           "complete": true,
2026-08-28T09:54:46.6824460Z           "evidence": [
2026-08-28T09:54:46.6824614Z             {
2026-08-28T09:54:46.6824860Z               "path": "crates/spt-live/src/pulse.rs",
2026-08-28T09:54:46.6825033Z               "line": 161
2026-08-28T09:54:46.6825189Z             }
2026-08-28T09:54:46.6825356Z           ]
2026-08-28T09:54:46.6825514Z         },
2026-08-28T09:54:46.6825676Z         "unit": {
2026-08-28T09:54:46.6825863Z           "complete": true,
2026-08-28T09:54:46.6826028Z           "evidence": [
2026-08-28T09:54:46.6826194Z             {
2026-08-28T09:54:46.6826442Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6826615Z               "line": 743
2026-08-28T09:54:46.6826771Z             },
2026-08-28T09:54:46.6826925Z             {
2026-08-28T09:54:46.6827177Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6827349Z               "line": 785
2026-08-28T09:54:46.6827502Z             },
2026-08-28T09:54:46.6827654Z             {
2026-08-28T09:54:46.6827912Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6828074Z               "line": 845
2026-08-28T09:54:46.6828236Z             },
2026-08-28T09:54:46.6828386Z             {
2026-08-28T09:54:46.6828642Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6828809Z               "line": 881
2026-08-28T09:54:46.6829042Z             },
2026-08-28T09:54:46.6829314Z             {
2026-08-28T09:54:46.6829563Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6829735Z               "line": 908
2026-08-28T09:54:46.6829882Z             },
2026-08-28T09:54:46.6830040Z             {
2026-08-28T09:54:46.6830287Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6830459Z               "line": 984
2026-08-28T09:54:46.6830630Z             },
2026-08-28T09:54:46.6830774Z             {
2026-08-28T09:54:46.6831032Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.6831197Z               "line": 1032
2026-08-28T09:54:46.6831349Z             }
2026-08-28T09:54:46.6831500Z           ]
2026-08-28T09:54:46.6831652Z         }
2026-08-28T09:54:46.6831795Z       }
2026-08-28T09:54:46.6831948Z     },
2026-08-28T09:54:46.6832101Z     {
2026-08-28T09:54:46.6832377Z       "id": "REQ-HAZARD-CONFLICT-BOTH-PRESERVED",
2026-08-28T09:54:46.6834447Z       "title": "A surfaced concurrent context pair is durably preserved (both versions, tracked artifacts) until a strictly dominating write clears it; no reconcile failure path discards an unmerged version (6.6, ADR-0013)",
2026-08-28T09:54:46.6834644Z       "requiredStages": [
2026-08-28T09:54:46.6834815Z         "impl",
2026-08-28T09:54:46.6834977Z         "unit"
2026-08-28T09:54:46.6835135Z       ],
2026-08-28T09:54:46.6835302Z       "stages": {
2026-08-28T09:54:46.6835468Z         "doc": {
2026-08-28T09:54:46.6835650Z           "complete": false,
2026-08-28T09:54:46.6835823Z           "evidence": []
2026-08-28T09:54:46.6835978Z         },
2026-08-28T09:54:46.6836132Z         "impl": {
2026-08-28T09:54:46.6836317Z           "complete": true,
2026-08-28T09:54:46.6836480Z           "evidence": [
2026-08-28T09:54:46.6836636Z             {
2026-08-28T09:54:46.6836922Z               "path": "crates/spt-daemon/src/reconcile.rs",
2026-08-28T09:54:46.6837099Z               "line": 22
2026-08-28T09:54:46.6837370Z             },
2026-08-28T09:54:46.6837523Z             {
2026-08-28T09:54:46.6837785Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:46.6837951Z               "line": 538
2026-08-28T09:54:46.6838114Z             },
2026-08-28T09:54:46.6838261Z             {
2026-08-28T09:54:46.6838537Z               "path": "crates/spt-live/src/reconcile.rs",
2026-08-28T09:54:46.6838819Z               "line": 17
2026-08-28T09:54:46.6839047Z             },
2026-08-28T09:54:46.6839202Z             {
2026-08-28T09:54:46.6839470Z               "path": "crates/spt-live/src/reconcile.rs",
2026-08-28T09:54:46.6839646Z               "line": 147
2026-08-28T09:54:46.6839799Z             },
2026-08-28T09:54:46.6839961Z             {
2026-08-28T09:54:46.6840276Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6840452Z               "line": 252
2026-08-28T09:54:46.6840610Z             },
2026-08-28T09:54:46.6840762Z             {
2026-08-28T09:54:46.6841066Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6841235Z               "line": 277
2026-08-28T09:54:46.6841390Z             },
2026-08-28T09:54:46.6841545Z             {
2026-08-28T09:54:46.6841847Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6842018Z               "line": 303
2026-08-28T09:54:46.6842179Z             },
2026-08-28T09:54:46.6842337Z             {
2026-08-28T09:54:46.6842613Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:46.6842789Z               "line": 124
2026-08-28T09:54:46.6842942Z             },
2026-08-28T09:54:46.6843099Z             {
2026-08-28T09:54:46.6843380Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:46.6843549Z               "line": 224
2026-08-28T09:54:46.6843705Z             }
2026-08-28T09:54:46.6843859Z           ]
2026-08-28T09:54:46.6844015Z         },
2026-08-28T09:54:46.6844169Z         "int": {
2026-08-28T09:54:46.6844352Z           "complete": false,
2026-08-28T09:54:46.6844528Z           "evidence": []
2026-08-28T09:54:46.6844818Z         },
2026-08-28T09:54:46.6844979Z         "unit": {
2026-08-28T09:54:46.6845156Z           "complete": true,
2026-08-28T09:54:46.6845323Z           "evidence": [
2026-08-28T09:54:46.6845480Z             {
2026-08-28T09:54:46.6845772Z               "path": "crates/spt-daemon/src/reconcile.rs",
2026-08-28T09:54:46.6845937Z               "line": 69
2026-08-28T09:54:46.6846091Z             },
2026-08-28T09:54:46.6846243Z             {
2026-08-28T09:54:46.6846534Z               "path": "crates/spt-daemon/src/reconcile.rs",
2026-08-28T09:54:46.6846692Z               "line": 79
2026-08-28T09:54:46.6846858Z             },
2026-08-28T09:54:46.6847012Z             {
2026-08-28T09:54:46.6847291Z               "path": "crates/spt-daemon/src/reconcile.rs",
2026-08-28T09:54:46.6847459Z               "line": 91
2026-08-28T09:54:46.6847610Z             },
2026-08-28T09:54:46.6847768Z             {
2026-08-28T09:54:46.6848040Z               "path": "crates/spt-daemon/tests/sync.rs",
2026-08-28T09:54:46.6848215Z               "line": 344
2026-08-28T09:54:46.6848369Z             },
2026-08-28T09:54:46.6848525Z             {
2026-08-28T09:54:46.6848807Z               "path": "crates/spt-live/src/reconcile.rs",
2026-08-28T09:54:46.6849065Z               "line": 281
2026-08-28T09:54:46.6849218Z             },
2026-08-28T09:54:46.6849374Z             {
2026-08-28T09:54:46.6849645Z               "path": "crates/spt-live/src/reconcile.rs",
2026-08-28T09:54:46.6849810Z               "line": 322
2026-08-28T09:54:46.6849978Z             },
2026-08-28T09:54:46.6850124Z             {
2026-08-28T09:54:46.6850401Z               "path": "crates/spt-live/src/reconcile.rs",
2026-08-28T09:54:46.6850569Z               "line": 360
2026-08-28T09:54:46.6850726Z             },
2026-08-28T09:54:46.6850888Z             {
2026-08-28T09:54:46.6851184Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.6851355Z               "line": 949
2026-08-28T09:54:46.6851613Z             },
2026-08-28T09:54:46.6851770Z             {
2026-08-28T09:54:46.6852046Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:46.6852214Z               "line": 397
2026-08-28T09:54:46.6852374Z             },
2026-08-28T09:54:46.6852522Z             {
2026-08-28T09:54:46.6852806Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:46.6852972Z               "line": 440
2026-08-28T09:54:46.6853131Z             }
2026-08-28T09:54:46.6853287Z           ]
2026-08-28T09:54:46.6853441Z         }
2026-08-28T09:54:46.6853597Z       }
2026-08-28T09:54:46.6853746Z     },
2026-08-28T09:54:46.6853894Z     {
2026-08-28T09:54:46.6854104Z       "id": "REQ-HAZARD-CONPTY-DSR",
2026-08-28T09:54:46.6854767Z       "title": "ConPTY reader must auto-answer DSR (ESC[6n) or all child output stalls (5.5)",
2026-08-28T09:54:46.6854959Z       "requiredStages": [
2026-08-28T09:54:46.6855121Z         "impl",
2026-08-28T09:54:46.6855281Z         "unit"
2026-08-28T09:54:46.6855436Z       ],
2026-08-28T09:54:46.6855611Z       "stages": {
2026-08-28T09:54:46.6855769Z         "doc": {
2026-08-28T09:54:46.6855950Z           "complete": false,
2026-08-28T09:54:46.6856126Z           "evidence": []
2026-08-28T09:54:46.6856294Z         },
2026-08-28T09:54:46.6856450Z         "impl": {
2026-08-28T09:54:46.6856633Z           "complete": true,
2026-08-28T09:54:46.6856803Z           "evidence": [
2026-08-28T09:54:46.6856962Z             {
2026-08-28T09:54:46.6857214Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.6857370Z               "line": 254
2026-08-28T09:54:46.6857534Z             }
2026-08-28T09:54:46.6857704Z           ]
2026-08-28T09:54:46.6857861Z         },
2026-08-28T09:54:46.6858019Z         "int": {
2026-08-28T09:54:46.6858204Z           "complete": true,
2026-08-28T09:54:46.6858376Z           "evidence": [
2026-08-28T09:54:46.6858534Z             {
2026-08-28T09:54:46.6858780Z               "path": "crates/spt-term/tests/dsr.rs",
2026-08-28T09:54:46.6859038Z               "line": 45
2026-08-28T09:54:46.6859320Z             },
2026-08-28T09:54:46.6859478Z             {
2026-08-28T09:54:46.6859730Z               "path": "crates/spt-term/tests/dsr.rs",
2026-08-28T09:54:46.6859892Z               "line": 67
2026-08-28T09:54:46.6860063Z             }
2026-08-28T09:54:46.6860215Z           ]
2026-08-28T09:54:46.6860370Z         },
2026-08-28T09:54:46.6860529Z         "unit": {
2026-08-28T09:54:46.6860703Z           "complete": true,
2026-08-28T09:54:46.6860871Z           "evidence": [
2026-08-28T09:54:46.6861023Z             {
2026-08-28T09:54:46.6861281Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.6861444Z               "line": 309
2026-08-28T09:54:46.6861605Z             },
2026-08-28T09:54:46.6861758Z             {
2026-08-28T09:54:46.6862016Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.6862187Z               "line": 398
2026-08-28T09:54:46.6862345Z             },
2026-08-28T09:54:46.6862506Z             {
2026-08-28T09:54:46.6862760Z               "path": "crates/spt-term/src/reader.rs",
2026-08-28T09:54:46.6862929Z               "line": 464
2026-08-28T09:54:46.6863082Z             }
2026-08-28T09:54:46.6863242Z           ]
2026-08-28T09:54:46.6863391Z         }
2026-08-28T09:54:46.6863547Z       }
2026-08-28T09:54:46.6863701Z     },
2026-08-28T09:54:46.6863847Z     {
2026-08-28T09:54:46.6864144Z       "id": "REQ-HAZARD-CONTROL-STAMP-CONVERGENCE",
2026-08-28T09:54:46.6878820Z       "title": "Control/viewer stamps must CONVERGE to broker session-table truth for every session-backed endpoint, not merely edge-trigger — the UPWARD companion to the DOWNWARD edge-clear REQ-HAZARD-CONTROL-STAMP-LIFETIME (7.27); same 'stamps == broker truth' family. ROOT (F-026 stamp-gap, hall-b/ball-b): a picker-created endpoint's broker spawn become_controller->stamp_driven_by->set_controlled(true) fires BEFORE the adapter binds its perch (a fresh endpoint has no perch until claude boots + binds), so mutate_info returns NotFound and the edge stamp is SWALLOWED (let _); the adapter's bind then writes InfoJson::new with controlled:false DEFAULT and no later edge re-stamps -> the endpoint reads uncontrolled FOREVER while driven (the #3 display fix is correct but datum-starved on this creation path). FIX: the broker (SINGLE WRITER) re-asserts each live session's control/viewer stamps to session-table truth, DIVERGENCE-GATED (read info; compare driven_by/controlled/viewer_count; write ONLY on diff — no per-poll fsync storm), on the KIND_SESSIONS handler (piggyback: the daemon reconcile + picker poll it, so a fresh perch converges within one reconcile-poll window after bind = the BOUNDED window, no new timer). Event-on-input rejected (an idle controlled session like hall-b never converges). Writes run OFF the log lock (snapshot truth under the lock, converge off it) per the lock-across-effect discipline (KH 7.12/5.16).",
2026-08-28T09:54:46.6879224Z       "requiredStages": [
2026-08-28T09:54:46.6879387Z         "doc",
2026-08-28T09:54:46.6879548Z         "impl",
2026-08-28T09:54:46.6879711Z         "unit",
2026-08-28T09:54:46.6879872Z         "int"
2026-08-28T09:54:46.6880031Z       ],
2026-08-28T09:54:46.6880192Z       "stages": {
2026-08-28T09:54:46.6880351Z         "doc": {
2026-08-28T09:54:46.6880531Z           "complete": true,
2026-08-28T09:54:46.6880707Z           "evidence": [
2026-08-28T09:54:46.6880855Z             {
2026-08-28T09:54:46.6881093Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6881254Z               "line": 660
2026-08-28T09:54:46.6881414Z             }
2026-08-28T09:54:46.6881567Z           ]
2026-08-28T09:54:46.6881719Z         },
2026-08-28T09:54:46.6881886Z         "impl": {
2026-08-28T09:54:46.6882063Z           "complete": true,
2026-08-28T09:54:46.6882240Z           "evidence": [
2026-08-28T09:54:46.6882391Z             {
2026-08-28T09:54:46.6882669Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6882840Z               "line": 973
2026-08-28T09:54:46.6883002Z             },
2026-08-28T09:54:46.6883269Z             {
2026-08-28T09:54:46.6883546Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6883713Z               "line": 1034
2026-08-28T09:54:46.6883861Z             },
2026-08-28T09:54:46.6884026Z             {
2026-08-28T09:54:46.6884291Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6884463Z               "line": 5976
2026-08-28T09:54:46.6884620Z             }
2026-08-28T09:54:46.6884783Z           ]
2026-08-28T09:54:46.6884939Z         },
2026-08-28T09:54:46.6885093Z         "int": {
2026-08-28T09:54:46.6885273Z           "complete": true,
2026-08-28T09:54:46.6885446Z           "evidence": [
2026-08-28T09:54:46.6885602Z             {
2026-08-28T09:54:46.6886003Z               "path": "crates/spt-daemon/tests/control_stamp_lifetime.rs",
2026-08-28T09:54:46.6886179Z               "line": 284
2026-08-28T09:54:46.6886342Z             },
2026-08-28T09:54:46.6886499Z             {
2026-08-28T09:54:46.6886872Z               "path": "crates/spt-daemon/tests/driven_by_selfheal.rs",
2026-08-28T09:54:46.6887039Z               "line": 345
2026-08-28T09:54:46.6891396Z             }
2026-08-28T09:54:46.6891610Z           ]
2026-08-28T09:54:46.6891761Z         },
2026-08-28T09:54:46.6891928Z         "unit": {
2026-08-28T09:54:46.6892118Z           "complete": true,
2026-08-28T09:54:46.6892284Z           "evidence": [
2026-08-28T09:54:46.6892446Z             {
2026-08-28T09:54:46.6892722Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6892900Z               "line": 9675
2026-08-28T09:54:46.6893052Z             }
2026-08-28T09:54:46.6893214Z           ]
2026-08-28T09:54:46.6893362Z         }
2026-08-28T09:54:46.6893514Z       }
2026-08-28T09:54:46.6893672Z     },
2026-08-28T09:54:46.6893820Z     {
2026-08-28T09:54:46.6894093Z       "id": "REQ-HAZARD-CONTROL-STAMP-LIFETIME",
2026-08-28T09:54:46.6902808Z       "title": "#2: a control/viewer stamp never outlives its session — every teardown path clears what attach stamped. The broker exit-waiter (broker.rs ~:1844) sends the exit frame + sessions.remove(&id) but does NOT clear the perch's controller/viewer stamps; clear_controller()->stamp_driven_by() (clears driven_by+controlled) runs ONLY on controller-detach/evict/displace. /exit kills the CHILD not the controller conn, so the OutputLog drops with controlled:true, viewer_count, (and driven_by for a remote controller) latched in info.json forever — and hfenduleam keeps gossiping controller_node=self cross-node. Fix: on session reap, clear the perch's controller/viewer stamps (set_driven_by(None)+set_controlled(false)+set_viewer_count(0) via the known endpoint id) — broker stays the single writer. KNOWN-HAZARDS invariant. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #2.",
2026-08-28T09:54:46.6903169Z       "requiredStages": [
2026-08-28T09:54:46.6903331Z         "doc",
2026-08-28T09:54:46.6903489Z         "impl",
2026-08-28T09:54:46.6903651Z         "int"
2026-08-28T09:54:46.6903804Z       ],
2026-08-28T09:54:46.6903966Z       "stages": {
2026-08-28T09:54:46.6904128Z         "doc": {
2026-08-28T09:54:46.6904305Z           "complete": true,
2026-08-28T09:54:46.6904480Z           "evidence": [
2026-08-28T09:54:46.6904629Z             {
2026-08-28T09:54:46.6904857Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6905033Z               "line": 641
2026-08-28T09:54:46.6905280Z             }
2026-08-28T09:54:46.6905463Z           ]
2026-08-28T09:54:46.6905612Z         },
2026-08-28T09:54:46.6905764Z         "impl": {
2026-08-28T09:54:46.6905941Z           "complete": true,
2026-08-28T09:54:46.6906112Z           "evidence": [
2026-08-28T09:54:46.6906265Z             {
2026-08-28T09:54:46.6906552Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6906722Z               "line": 3433
2026-08-28T09:54:46.6906872Z             },
2026-08-28T09:54:46.6907046Z             {
2026-08-28T09:54:46.6907347Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6907544Z               "line": 8160
2026-08-28T09:54:46.6907917Z             }
2026-08-28T09:54:46.6908102Z           ]
2026-08-28T09:54:46.6908269Z         },
2026-08-28T09:54:46.6908450Z         "int": {
2026-08-28T09:54:46.6908631Z           "complete": true,
2026-08-28T09:54:46.6908794Z           "evidence": [
2026-08-28T09:54:46.6909080Z             {
2026-08-28T09:54:46.6909485Z               "path": "crates/spt-daemon/tests/control_stamp_lifetime.rs",
2026-08-28T09:54:46.6909656Z               "line": 208
2026-08-28T09:54:46.6909805Z             }
2026-08-28T09:54:46.6909966Z           ]
2026-08-28T09:54:46.6910110Z         },
2026-08-28T09:54:46.6910272Z         "unit": {
2026-08-28T09:54:46.6910449Z           "complete": false,
2026-08-28T09:54:46.6910628Z           "evidence": []
2026-08-28T09:54:46.6910777Z         }
2026-08-28T09:54:46.6910942Z       }
2026-08-28T09:54:46.6911101Z     },
2026-08-28T09:54:46.6911247Z     {
2026-08-28T09:54:46.6911524Z       "id": "REQ-HAZARD-CONTROLLER-GAP-RESUME",
2026-08-28T09:54:46.6932470Z       "title": "A serving CONTROLLER whose serve-brain hits a b4 drop-don't-block FORWARD output gap must RESUME-FROM-FLOOR (re-subscribe from delivered_through and re-fetch the dropped frames from the ring), NOT snap-above and NOT fatal. ROOT (v0.13.0 forkpty re-run, post-keystone): b4 made the controller a non-blocking try_send that DROPS frames when its bounded channel fills (a controller that falls behind its OWN echo under a hard flood), so the next read is a forward gap the strict reject-gap (brain.rs:624/628, B2 exactly-once) FATALS — wedged_viewer_does_not_stall_controller (attach.rs:1048) drove ctrl.read_event() raw and fataled on `output gap got 6134 want 4643`. Pre-b4 the inline sleep-poll BLOCKED the drain to the controller's rate (no drops, no gaps); this is a b4 SIDE-EFFECT, not a new class. A controller CANNOT snap (it is authoritative — advances delivered_through; skipping rolled frames = not-exactly-once = B2 violation), so REQ-HAZARD-VIEWER-RING-ROLL-SNAP does NOT apply. B2 INVARIANT (doyle, broker.rs:327-330): the ring trim is delivered_through-BLIND (`while ring.len() > cap_chunks { pop_front() }`), so re-fetch is exactly-once IFF tail - delivered_through <= cap_chunks (4096) — NOT guaranteed in general, but the common case (burst < ring; wedged_viewer ~1492 < 4096) holds. FIX: serve_attach catches the output-gap on the controller path (does not ?-propagate) and re-subscribes from Brain::controller_resume_floor (= delivered_through = the gap's `want`; NO mid-stream KIND_SESSIONS round-trip — sessions() loops on read_event and would re-fatal on the same gap + discard Output); the broker replays the dropped frames. The IRRECOVERABLE edge (floor unchanged across two resumes = ring rolled past delivered_through = frames gone) surfaces a MARKED truncation to the operator (never silent-skip = B2 lie, never spin) and ends cleanly — full graceful handling deferred to REQ-HAZARD-CONTROLLER-IRRECOVERABLE-BEHIND. Do NOT make the ring trim delivered_through-aware (that risks an unbounded ring under a stuck controller; the 5s eviction + 4096 ring is the practical bound). (v0.13.0)",
2026-08-28T09:54:46.6932803Z       "requiredStages": [
2026-08-28T09:54:46.6932969Z         "impl",
2026-08-28T09:54:46.6933123Z         "unit",
2026-08-28T09:54:46.6933274Z         "int"
2026-08-28T09:54:46.6933428Z       ],
2026-08-28T09:54:46.6933593Z       "stages": {
2026-08-28T09:54:46.6933757Z         "doc": {
2026-08-28T09:54:46.6933936Z           "complete": false,
2026-08-28T09:54:46.6934117Z           "evidence": []
2026-08-28T09:54:46.6934267Z         },
2026-08-28T09:54:46.6934430Z         "impl": {
2026-08-28T09:54:46.6934610Z           "complete": true,
2026-08-28T09:54:46.6934788Z           "evidence": [
2026-08-28T09:54:46.6934934Z             {
2026-08-28T09:54:46.6935226Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.6935393Z               "line": 173
2026-08-28T09:54:46.6935550Z             },
2026-08-28T09:54:46.6935713Z             {
2026-08-28T09:54:46.6935976Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.6936286Z               "line": 220
2026-08-28T09:54:46.6936442Z             },
2026-08-28T09:54:46.6936600Z             {
2026-08-28T09:54:46.6936865Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.6937054Z               "line": 547
2026-08-28T09:54:46.6937230Z             },
2026-08-28T09:54:46.6937374Z             {
2026-08-28T09:54:46.6937641Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.6937806Z               "line": 1635
2026-08-28T09:54:46.6937965Z             }
2026-08-28T09:54:46.6938111Z           ]
2026-08-28T09:54:46.6938265Z         },
2026-08-28T09:54:46.6938431Z         "int": {
2026-08-28T09:54:46.6938698Z           "complete": true,
2026-08-28T09:54:46.6938876Z           "evidence": [
2026-08-28T09:54:46.6939119Z             {
2026-08-28T09:54:46.6939403Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.6939575Z               "line": 1357
2026-08-28T09:54:46.6939734Z             }
2026-08-28T09:54:46.6939892Z           ]
2026-08-28T09:54:46.6940054Z         },
2026-08-28T09:54:46.6940212Z         "unit": {
2026-08-28T09:54:46.6940388Z           "complete": true,
2026-08-28T09:54:46.6940560Z           "evidence": [
2026-08-28T09:54:46.6940707Z             {
2026-08-28T09:54:46.6940974Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.6941143Z               "line": 2711
2026-08-28T09:54:46.6941298Z             },
2026-08-28T09:54:46.6941452Z             {
2026-08-28T09:54:46.6941715Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.6941889Z               "line": 11846
2026-08-28T09:54:46.6942048Z             }
2026-08-28T09:54:46.6942204Z           ]
2026-08-28T09:54:46.6942352Z         }
2026-08-28T09:54:46.6942509Z       }
2026-08-28T09:54:46.6942656Z     },
2026-08-28T09:54:46.6942810Z     {
2026-08-28T09:54:46.6943262Z       "id": "REQ-HAZARD-CONTROLLER-IRRECOVERABLE-BEHIND",
2026-08-28T09:54:46.6952831Z       "title": "DEFERRED EDGE of REQ-HAZARD-CONTROLLER-GAP-RESUME: when a serving controller falls behind the live ring FURTHER than the ring holds (tail - delivered_through > cap_chunks, the ring trim being delivered_through-blind, broker.rs:327-330), the dropped frames have rolled OUT of the ring and an exactly-once re-fetch is IMPOSSIBLE. v0.13.0 DETECTS this (resume floor unchanged across two consecutive resumes) and surfaces a MARKED truncation notice to the operator then ends the attach cleanly — it never silent-skips (a B2 lie) and never spins. FULL graceful handling (a clearly-marked snap-with-data-loss that keeps the operator on the live tail, or a structured truncation record the rc renders distinctly, plus the controller-too-slow + ring-too-small backpressure/sizing policy) is DEFERRED — staging it needs a netsplit / deep-behind harness (the in-process loopback rig keeps up; wedged_viewer's gap is recoverable at ~1492 < 4096). (v0.13.0+)",
2026-08-28T09:54:46.6953037Z       "requiredStages": [],
2026-08-28T09:54:46.6953211Z       "stages": {
2026-08-28T09:54:46.6953370Z         "doc": {
2026-08-28T09:54:46.6953556Z           "complete": false,
2026-08-28T09:54:46.6953723Z           "evidence": []
2026-08-28T09:54:46.6953875Z         },
2026-08-28T09:54:46.6954037Z         "impl": {
2026-08-28T09:54:46.6954219Z           "complete": false,
2026-08-28T09:54:46.6954385Z           "evidence": []
2026-08-28T09:54:46.6954543Z         },
2026-08-28T09:54:46.6954704Z         "int": {
2026-08-28T09:54:46.6954887Z           "complete": false,
2026-08-28T09:54:46.6955066Z           "evidence": []
2026-08-28T09:54:46.6955223Z         },
2026-08-28T09:54:46.6955388Z         "unit": {
2026-08-28T09:54:46.6955570Z           "complete": false,
2026-08-28T09:54:46.6955745Z           "evidence": []
2026-08-28T09:54:46.6955894Z         }
2026-08-28T09:54:46.6956046Z       }
2026-08-28T09:54:46.6956199Z     },
2026-08-28T09:54:46.6956351Z     {
2026-08-28T09:54:46.6956585Z       "id": "REQ-HAZARD-CONTROLLER-LEASE",
2026-08-28T09:54:46.6965967Z       "title": "RC-RENDER-TRUTH W2 (KNOWN-HAZARDS 7.48 — umbrella conformance seam for ADR-0044): at most one input-capable controller lease per PTY session; takeover revokes atomically and loudly; input is fenced to the active lease; node identity is never a lease. The full hertz 8-step deterministic two-loopback-client broker regression rides verbatim: A subscribes Control from node N and controls; B subscribes Take from the SAME node with a different lease; A receives Displaced{by:N} then terminal stream completion (rc exits via existing PumpEnd::Displaced); output post-takeover reaches B not A; A's Input+Resize post-takeover mutate nothing; B's both apply; controlled/driven_by metadata identifies B with exactly one controller slot; a separate equal-lease/equal-generation replay test proves genuine dispatcher recovery remains silent and never self-displaces. Gate: int — the matrix; doc — KNOWN-HAZARDS 7.48.",
2026-08-28T09:54:46.6966178Z       "requiredStages": [
2026-08-28T09:54:46.6966353Z         "doc",
2026-08-28T09:54:46.6966511Z         "int"
2026-08-28T09:54:46.6966668Z       ],
2026-08-28T09:54:46.6966840Z       "stages": {
2026-08-28T09:54:46.6966993Z         "doc": {
2026-08-28T09:54:46.6967178Z           "complete": true,
2026-08-28T09:54:46.6967341Z           "evidence": [
2026-08-28T09:54:46.6967493Z             {
2026-08-28T09:54:46.6967718Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.6967888Z               "line": 805
2026-08-28T09:54:46.6968037Z             }
2026-08-28T09:54:46.6968189Z           ]
2026-08-28T09:54:46.6968348Z         },
2026-08-28T09:54:46.6968503Z         "impl": {
2026-08-28T09:54:46.6968684Z           "complete": false,
2026-08-28T09:54:46.6968853Z           "evidence": []
2026-08-28T09:54:46.6969091Z         },
2026-08-28T09:54:46.6969249Z         "int": {
2026-08-28T09:54:46.6969430Z           "complete": true,
2026-08-28T09:54:46.6969717Z           "evidence": [
2026-08-28T09:54:46.6969883Z             {
2026-08-28T09:54:46.6970242Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.6970407Z               "line": 261
2026-08-28T09:54:46.6970562Z             },
2026-08-28T09:54:46.6970712Z             {
2026-08-28T09:54:46.6971069Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.6971231Z               "line": 370
2026-08-28T09:54:46.6971391Z             },
2026-08-28T09:54:46.6971554Z             {
2026-08-28T09:54:46.6971888Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.6972058Z               "line": 452
2026-08-28T09:54:46.6972207Z             },
2026-08-28T09:54:46.6972359Z             {
2026-08-28T09:54:46.6972688Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:46.6972855Z               "line": 547
2026-08-28T09:54:46.6973003Z             }
2026-08-28T09:54:46.6973156Z           ]
2026-08-28T09:54:46.6973318Z         },
2026-08-28T09:54:46.6973476Z         "unit": {
2026-08-28T09:54:46.6973661Z           "complete": false,
2026-08-28T09:54:46.6973833Z           "evidence": []
2026-08-28T09:54:46.6973993Z         }
2026-08-28T09:54:46.6974142Z       }
2026-08-28T09:54:46.6974294Z     },
2026-08-28T09:54:46.6974443Z     {
2026-08-28T09:54:46.6974719Z       "id": "REQ-HAZARD-CONTROLLER-RETAKE-FLOOR",
2026-08-28T09:54:46.6989134Z       "title": "`become_controller` should STRUCTURALLY refuse a controller re-take whose `from_seq` falls below the connection's already-delivered contiguous floor — making the P1c reorder invariant un-reintroducible by a future caller, not just removed at the one caller. ROOT/SCOPE (doyle proposed, P1c gate dialogue): P1c fixes REQ-HAZARD-CONTROLLER-WRITER-REORDER three ways (handoff single-take + epoch-gate-under-lock + session_cursors seed), removing the one decreasing-floor double-take and bounding any other to already-committed-only. A self-enforcing broker guard would refuse the bad SHAPE outright. BLOCKER: the obvious predicate (`from_seq >= delivered_through`) is UNSAFE because `delivered_through` is SESSION-WIDE (the `Arc<AtomicU64>` on `OutputLog`, shared by all controllers/viewers, advanced monotonic-MAX; `resume_seq` reads it) — a normal fresh-operator `from_seq=0` attach to a producing session legitimately sits below it (full ring replay + consumer dedup-below/snap-above), and monotonic-MAX can't distinguish the hazard (a `seq1`-without-`seq0` write reads as `2`). The structurally-correct guard needs a NEW per-connection contiguous-sent cursor (the true highest-contiguous seq this socket has received) that does not exist today; the guard then refuses a re-take below THAT. Bigger than P1c; no live gap (P1c fully fixes the actual bug). Mint/refine stages when the per-connection cursor is built. (v0.13.0 follow-up, post-ship)",
2026-08-28T09:54:46.6989501Z       "requiredStages": [],
2026-08-28T09:54:46.6989666Z       "stages": {
2026-08-28T09:54:46.6989823Z         "doc": {
2026-08-28T09:54:46.6989992Z           "complete": false,
2026-08-28T09:54:46.6990165Z           "evidence": []
2026-08-28T09:54:46.6990326Z         },
2026-08-28T09:54:46.6990474Z         "impl": {
2026-08-28T09:54:46.6990645Z           "complete": false,
2026-08-28T09:54:46.6990808Z           "evidence": []
2026-08-28T09:54:46.6990951Z         },
2026-08-28T09:54:46.6991099Z         "int": {
2026-08-28T09:54:46.6991284Z           "complete": false,
2026-08-28T09:54:46.6991456Z           "evidence": []
2026-08-28T09:54:46.6991609Z         },
2026-08-28T09:54:46.6991771Z         "unit": {
2026-08-28T09:54:46.6991949Z           "complete": false,
2026-08-28T09:54:46.6992118Z           "evidence": []
2026-08-28T09:54:46.6992271Z         }
2026-08-28T09:54:46.6992426Z       }
2026-08-28T09:54:46.6992573Z     },
2026-08-28T09:54:46.6992723Z     {
2026-08-28T09:54:46.6993008Z       "id": "REQ-HAZARD-CONTROLLER-WRITER-REORDER",
2026-08-28T09:54:46.7035439Z       "title": "Two `controller_writer` threads must never race ONE brain↔broker connection's socket. ROOT (doyle, instrumented RACEDIAG repro on kitsubito): on a brain-restart re-serve the handoff brain registers as controller on the SAME session TWICE over the SAME `Brain::conn` socket — (1) `Brain::handoff` eagerly `subscribe(prior.session_id, prior.next_seq=1)` → `become_controller(from_seq=1)`, initial=[1], spawns writer-A (writes seq 1); (2) `serve_attach` re-handles the replayed `Request{from_seq:0}` → `attach_as(sid,0)` → `become_controller(from_seq=0)`, initial=[0,1], spawns writer-B (writes 0 then 1). `become_controller` (broker.rs) drops the prior `ControllerSink` (its `tx`) but does NOT stop the prior writer thread — writer-A keeps flushing its owned `initial` batch, and both writers hold clones of the same `SharedSend` (`Arc<Mutex<socket>>`) with NO inter-thread ordering. When writer-A's seq 1 wins the socket before writer-B's seq 0, the strict legacy consumer (brain.rs read_event reject-gap path) sees `output gap: got seq 1 want 0` → the test `attach_survives_target_brain_restart_exactly_once` panics at `.expect(\"re-serve\")` OR HANGS in `render_until` (serve thread died on the gap → MARKER_TWO never reaches the wire). `prior.next_seq` is life1's CONSUMPTION cursor, NOT life2's connection state — life2's socket has been sent NOTHING, so a `from_seq=0` full replay on a connection that already streamed seq 1 is contradictory. Snap-above tolerance ALONE can't fix it (it would dedup-drop the late seq 0 → byte loss → the exactly-once byte-identity assert fails). PRE-EXISTING, surfaced by the v0.13.0 green-both-runners release gate; P1b is INNOCENT (its diff touches only input-ack machinery, proven mechanically + the test passes post-P1b in isolation). Sibling flaky cluster: `inject_control_wedge::g2`, `broker::spawn_env_reaches_child`. INVARIANT: on a single brain↔broker connection the controller output-frame stream is monotonic non-decreasing in seq (modulo dedup re-sends); exactly ONE `controller_writer` is ever live per connection; a SUPERSEDED writer writes NO further frames; a re-serve never replays a seq below what the connection already received. FIX (doyle design, corrected at the gate 2026-06-20): fix #1 as designed ('drop handoff's eager subscribe so serve_attach's attach_as is the sole registration') was REVERTED — handoff's `subscribe(prior.next_seq)` IS the standalone-resume mechanism (the brain-only update engine `apply_brain_only` + the `handoff`/`idempotent`/`daemon_e2e` int tests replay output through it with NO `serve_attach`; dropping it hung every resume-via-handoff test). The shipped fix is three parts: (1) CORRECTNESS — `Brain::handoff` seeds `session_cursors` at `prior.next_seq` so the consumer runs the production dedup-below+snap-above path, never the strict reject-gap legacy trap; this is COMPLETE (not merely tolerant) because every `controller_writer` emits an ASCENDING seq stream and the surviving writer (serve_attach's attach_as(sid,0)) offers the complete `[0,end]` range, so a snap-above merge of ascending writers delivers `[K,end]` with no skip/dup (first sighting of any seq>M is preceded by M on that writer). (2) INVARIANT — `controller_writer`'s INITIAL-BATCH replay is epoch-gated: `controller_epoch` is a shared `Arc<AtomicU64>`, the writer re-reads it UNDER `send.lock()` (atomically with `write_frame`) and returns the instant it is superseded — no check-then-block-then-write window, no superseded replay (W1-safe: never blocks the drain under `Mutex<OutputLog>`). The LIVE loop is NOT gated (new output only flows to the current controller; a superseded writer must still deliver its terminal `Displaced` kick — gating it suppressed the loud-take notice; it ends on `tx`-drop). (3) EXPLICIT-RESUME / OPERATOR-STREAM BOUNDARY (the LOAD-BEARING fix — kitsubito RACEDIAG ~33% repro the keystones missed) — `Brain::subscribe_with` (shared by attach/attach_as) resets the resume-mode dedup cursor to `from_seq`. The handoff eager subscribe makes serve_attach's brain receive the replay's seq K BEFORE the operator Request is processed (`attached`=false); that frame is dropped by the if-attached forward gate but the snap-above cursor already advanced past K, and `attach_as(sid,0)`'s re-subscribe used to leave the cursor advanced → the broker's re-send of seq K arrives below it, deduped, never forwarded → operator viewport forward-gap (silent content loss in the real rc consumer). Resetting to from_seq on the attach_as re-subscribe re-delivers from 0 (operator dedups the overlap) so seq K reaches the viewport. The epoch gate (2) is sound (RACEDIAG: zero socket interleaving above K); cold-start brains (empty map — production dispatch serve) keep the legacy next_seq path, so production is unaffected. (v0.13.0)",
2026-08-28T09:54:46.7036030Z       "requiredStages": [
2026-08-28T09:54:46.7036193Z         "doc",
2026-08-28T09:54:46.7036354Z         "impl",
2026-08-28T09:54:46.7036508Z         "unit",
2026-08-28T09:54:46.7036664Z         "int"
2026-08-28T09:54:46.7036818Z       ],
2026-08-28T09:54:46.7036984Z       "stages": {
2026-08-28T09:54:46.7037142Z         "doc": {
2026-08-28T09:54:46.7037326Z           "complete": true,
2026-08-28T09:54:46.7037503Z           "evidence": [
2026-08-28T09:54:46.7037659Z             {
2026-08-28T09:54:46.7037894Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7038056Z               "line": 581
2026-08-28T09:54:46.7038214Z             }
2026-08-28T09:54:46.7038366Z           ]
2026-08-28T09:54:46.7038528Z         },
2026-08-28T09:54:46.7038739Z         "impl": {
2026-08-28T09:54:46.7038918Z           "complete": true,
2026-08-28T09:54:46.7039228Z           "evidence": [
2026-08-28T09:54:46.7039387Z             {
2026-08-28T09:54:46.7039647Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.7039798Z               "line": 523
2026-08-28T09:54:46.7039945Z             },
2026-08-28T09:54:46.7040099Z             {
2026-08-28T09:54:46.7040356Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.7040555Z               "line": 2404
2026-08-28T09:54:46.7040708Z             },
2026-08-28T09:54:46.7040860Z             {
2026-08-28T09:54:46.7041238Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7041410Z               "line": 3700
2026-08-28T09:54:46.7041553Z             }
2026-08-28T09:54:46.7041709Z           ]
2026-08-28T09:54:46.7041858Z         },
2026-08-28T09:54:46.7042019Z         "int": {
2026-08-28T09:54:46.7042197Z           "complete": true,
2026-08-28T09:54:46.7042376Z           "evidence": [
2026-08-28T09:54:46.7042538Z             {
2026-08-28T09:54:46.7042797Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.7042971Z               "line": 1594
2026-08-28T09:54:46.7043122Z             },
2026-08-28T09:54:46.7043280Z             {
2026-08-28T09:54:46.7043538Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.7043704Z               "line": 1701
2026-08-28T09:54:46.7043853Z             },
2026-08-28T09:54:46.7044009Z             {
2026-08-28T09:54:46.7044281Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7044444Z               "line": 1214
2026-08-28T09:54:46.7044595Z             }
2026-08-28T09:54:46.7044745Z           ]
2026-08-28T09:54:46.7044901Z         },
2026-08-28T09:54:46.7045057Z         "unit": {
2026-08-28T09:54:46.7045236Z           "complete": true,
2026-08-28T09:54:46.7045408Z           "evidence": [
2026-08-28T09:54:46.7045561Z             {
2026-08-28T09:54:46.7045814Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7045974Z               "line": 11699
2026-08-28T09:54:46.7046133Z             }
2026-08-28T09:54:46.7046280Z           ]
2026-08-28T09:54:46.7046438Z         }
2026-08-28T09:54:46.7046585Z       }
2026-08-28T09:54:46.7046739Z     },
2026-08-28T09:54:46.7046886Z     {
2026-08-28T09:54:46.7047148Z       "id": "REQ-HAZARD-CORRUPT-PERCH-COHERENCE",
2026-08-28T09:54:46.7048435Z       "title": "Corrupt (present-but-unparseable) info.json is NOT absent: liveness/status readers agree a destroyed record is neither alive nor Active (counter-39 #2)",
2026-08-28T09:54:46.7048726Z       "requiredStages": [
2026-08-28T09:54:46.7048888Z         "impl",
2026-08-28T09:54:46.7049121Z         "unit"
2026-08-28T09:54:46.7049275Z       ],
2026-08-28T09:54:46.7049441Z       "stages": {
2026-08-28T09:54:46.7049594Z         "doc": {
2026-08-28T09:54:46.7049789Z           "complete": true,
2026-08-28T09:54:46.7049947Z           "evidence": [
2026-08-28T09:54:46.7050107Z             {
2026-08-28T09:54:46.7050321Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7050486Z               "line": 303
2026-08-28T09:54:46.7050635Z             }
2026-08-28T09:54:46.7050786Z           ]
2026-08-28T09:54:46.7050935Z         },
2026-08-28T09:54:46.7051096Z         "impl": {
2026-08-28T09:54:46.7051363Z           "complete": true,
2026-08-28T09:54:46.7051612Z           "evidence": [
2026-08-28T09:54:46.7051778Z             {
2026-08-28T09:54:46.7052084Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.7052308Z               "line": 999
2026-08-28T09:54:46.7052461Z             },
2026-08-28T09:54:46.7052612Z             {
2026-08-28T09:54:46.7052885Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7053050Z               "line": 135
2026-08-28T09:54:46.7053202Z             },
2026-08-28T09:54:46.7053344Z             {
2026-08-28T09:54:46.7053568Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.7053726Z               "line": 77
2026-08-28T09:54:46.7053883Z             }
2026-08-28T09:54:46.7054031Z           ]
2026-08-28T09:54:46.7054189Z         },
2026-08-28T09:54:46.7054336Z         "int": {
2026-08-28T09:54:46.7054517Z           "complete": false,
2026-08-28T09:54:46.7054699Z           "evidence": []
2026-08-28T09:54:46.7054850Z         },
2026-08-28T09:54:46.7055009Z         "unit": {
2026-08-28T09:54:46.7055184Z           "complete": true,
2026-08-28T09:54:46.7055348Z           "evidence": [
2026-08-28T09:54:46.7055499Z             {
2026-08-28T09:54:46.7055806Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.7056107Z               "line": 2283
2026-08-28T09:54:46.7056268Z             },
2026-08-28T09:54:46.7056417Z             {
2026-08-28T09:54:46.7056674Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7056840Z               "line": 330
2026-08-28T09:54:46.7056993Z             },
2026-08-28T09:54:46.7057145Z             {
2026-08-28T09:54:46.7057365Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.7057581Z               "line": 376
2026-08-28T09:54:46.7057794Z             }
2026-08-28T09:54:46.7057990Z           ]
2026-08-28T09:54:46.7058147Z         }
2026-08-28T09:54:46.7058300Z       }
2026-08-28T09:54:46.7058455Z     },
2026-08-28T09:54:46.7058605Z     {
2026-08-28T09:54:46.7058862Z       "id": "REQ-HAZARD-DAEMON-HOSTED-LIVENESS",
2026-08-28T09:54:46.7060320Z       "title": "Daemon-hosted perches (Psyche, spt-hosted Self) derive liveness from the daemon endpoint table + info.json status, never is_process_alive(info.pid) (2.5)",
2026-08-28T09:54:46.7060521Z       "requiredStages": [
2026-08-28T09:54:46.7060677Z         "impl",
2026-08-28T09:54:46.7060834Z         "unit",
2026-08-28T09:54:46.7060989Z         "int"
2026-08-28T09:54:46.7061142Z       ],
2026-08-28T09:54:46.7061303Z       "stages": {
2026-08-28T09:54:46.7061457Z         "doc": {
2026-08-28T09:54:46.7061632Z           "complete": false,
2026-08-28T09:54:46.7061801Z           "evidence": []
2026-08-28T09:54:46.7061961Z         },
2026-08-28T09:54:46.7062120Z         "impl": {
2026-08-28T09:54:46.7062300Z           "complete": true,
2026-08-28T09:54:46.7062472Z           "evidence": [
2026-08-28T09:54:46.7062624Z             {
2026-08-28T09:54:46.7062906Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.7063074Z               "line": 848
2026-08-28T09:54:46.7063230Z             },
2026-08-28T09:54:46.7063379Z             {
2026-08-28T09:54:46.7063748Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:46.7063913Z               "line": 85
2026-08-28T09:54:46.7064071Z             },
2026-08-28T09:54:46.7064218Z             {
2026-08-28T09:54:46.7064453Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.7064658Z               "line": 103
2026-08-28T09:54:46.7064810Z             },
2026-08-28T09:54:46.7064968Z             {
2026-08-28T09:54:46.7065206Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7065368Z               "line": 479
2026-08-28T09:54:46.7065516Z             },
2026-08-28T09:54:46.7065655Z             {
2026-08-28T09:54:46.7065946Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7066101Z               "line": 27
2026-08-28T09:54:46.7066259Z             },
2026-08-28T09:54:46.7066409Z             {
2026-08-28T09:54:46.7066672Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7066833Z               "line": 134
2026-08-28T09:54:46.7066991Z             },
2026-08-28T09:54:46.7067148Z             {
2026-08-28T09:54:46.7067405Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7067577Z               "line": 159
2026-08-28T09:54:46.7067730Z             },
2026-08-28T09:54:46.7067883Z             {
2026-08-28T09:54:46.7068131Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.7068302Z               "line": 116
2026-08-28T09:54:46.7068455Z             }
2026-08-28T09:54:46.7068611Z           ]
2026-08-28T09:54:46.7068790Z         },
2026-08-28T09:54:46.7069025Z         "int": {
2026-08-28T09:54:46.7069208Z           "complete": true,
2026-08-28T09:54:46.7069383Z           "evidence": [
2026-08-28T09:54:46.7069541Z             {
2026-08-28T09:54:46.7069832Z               "path": "crates/spt-daemon/tests/daemon_e2e.rs",
2026-08-28T09:54:46.7070003Z               "line": 43
2026-08-28T09:54:46.7070151Z             }
2026-08-28T09:54:46.7070303Z           ]
2026-08-28T09:54:46.7070461Z         },
2026-08-28T09:54:46.7070618Z         "unit": {
2026-08-28T09:54:46.7070909Z           "complete": true,
2026-08-28T09:54:46.7071077Z           "evidence": [
2026-08-28T09:54:46.7071237Z             {
2026-08-28T09:54:46.7071483Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7071659Z               "line": 1192
2026-08-28T09:54:46.7071807Z             },
2026-08-28T09:54:46.7071959Z             {
2026-08-28T09:54:46.7072221Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7072380Z               "line": 248
2026-08-28T09:54:46.7072540Z             },
2026-08-28T09:54:46.7072685Z             {
2026-08-28T09:54:46.7072952Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7073113Z               "line": 267
2026-08-28T09:54:46.7073272Z             },
2026-08-28T09:54:46.7073418Z             {
2026-08-28T09:54:46.7073686Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7073858Z               "line": 284
2026-08-28T09:54:46.7074010Z             },
2026-08-28T09:54:46.7074180Z             {
2026-08-28T09:54:46.7074430Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7074599Z               "line": 311
2026-08-28T09:54:46.7074750Z             },
2026-08-28T09:54:46.7074904Z             {
2026-08-28T09:54:46.7075146Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:46.7075309Z               "line": 458
2026-08-28T09:54:46.7075461Z             },
2026-08-28T09:54:46.7075609Z             {
2026-08-28T09:54:46.7075862Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.7076019Z               "line": 229
2026-08-28T09:54:46.7076172Z             }
2026-08-28T09:54:46.7076314Z           ]
2026-08-28T09:54:46.7076463Z         }
2026-08-28T09:54:46.7076619Z       }
2026-08-28T09:54:46.7076762Z     },
2026-08-28T09:54:46.7076908Z     {
2026-08-28T09:54:46.7077189Z       "id": "REQ-HAZARD-DAEMON-IDENTITY-ENV-SANITIZE",
2026-08-28T09:54:46.7094024Z       "title": "MSG-IDENTITY W1 / F-036 leg a (perri field RCA 2026-07-09/10, psyche seat-theft — doyle ACCEPTED primary fix): the daemon MUST sanitize inherited per-session identity env (SPT_ENDPOINT_ID / OWL_SESSION_ID / SPT_AGENT_ID) at startup AND before EVERY role spawn — these are per-session identity and are NEVER correct inherited state for a daemon or its role children. ROOT: a daemon restarted from inside an agent session (routine during core dev / `spt update apply`) carries the session's SPT_ENDPOINT_ID and passes it verbatim to every [session.psyche_resume] spawn; core only strips each role's DECLARED env_remove list (runtime.rs:728), so ONE adapter env_remove miss infects the whole node — every psyche claude turn fires SessionStart, the adapter hook sees the endpoint id, takes the bind path, and ROTATES the victim's perch to the psyche's own sid with a valid prior-sid proof, every pulse (field: lia/deployah/doyle psyches ALL briefed as <sptc-active-perch id=doyle>; 37 peer msgs drained into lia's psyche transcript; victim deliveries eaten, communes dark, sends downgraded from:cli@node). Adapter half FIXED v0.18.8 (env_remove += SPT_ENDPOINT_ID + shim scrub + SPT_PSYCHE_TURN hook-bail) — this REQ is the CORE-LAYER defense so no adapter miss can ever leak identity again. FOLD (F-036 leg b docs-fix, doyle-owned): broaden the recursion_guard_env schema description (manifest.rs:314 + crates/spt-runtime/manifest.schema.json:306) — core honors it on ANY role declaring the field (runtime.rs:740, keyed on the FIELD not the role name); drop the 'summarizer children' wording (perri adopted on both psyche roles v0.18.8, proven live). Gate: a daemon started with SPT_ENDPOINT_ID/OWL_SESSION_ID/SPT_AGENT_ID in its env spawns role children WITHOUT those vars (unit: role-spawn env assembly scrubs the identity set regardless of the role's declared env_remove); KNOWN-HAZARDS entry on landing. Kin psyche-custody/session-pin cluster, [[spt-core-findings-backlog]] F-036.",
2026-08-28T09:54:46.7094291Z       "requiredStages": [
2026-08-28T09:54:46.7094568Z         "doc",
2026-08-28T09:54:46.7094722Z         "impl",
2026-08-28T09:54:46.7094872Z         "unit"
2026-08-28T09:54:46.7095022Z       ],
2026-08-28T09:54:46.7095173Z       "stages": {
2026-08-28T09:54:46.7095324Z         "doc": {
2026-08-28T09:54:46.7095489Z           "complete": true,
2026-08-28T09:54:46.7095642Z           "evidence": [
2026-08-28T09:54:46.7095804Z             {
2026-08-28T09:54:46.7096024Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7096180Z               "line": 733
2026-08-28T09:54:46.7096324Z             }
2026-08-28T09:54:46.7096476Z           ]
2026-08-28T09:54:46.7096635Z         },
2026-08-28T09:54:46.7096786Z         "impl": {
2026-08-28T09:54:46.7096964Z           "complete": true,
2026-08-28T09:54:46.7097139Z           "evidence": [
2026-08-28T09:54:46.7097297Z             {
2026-08-28T09:54:46.7097565Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7097735Z               "line": 54
2026-08-28T09:54:46.7097886Z             },
2026-08-28T09:54:46.7098037Z             {
2026-08-28T09:54:46.7098304Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7098475Z               "line": 457
2026-08-28T09:54:46.7098629Z             },
2026-08-28T09:54:46.7098785Z             {
2026-08-28T09:54:46.7099158Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:46.7099329Z               "line": 456
2026-08-28T09:54:46.7099482Z             },
2026-08-28T09:54:46.7099644Z             {
2026-08-28T09:54:46.7099906Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7100078Z               "line": 44
2026-08-28T09:54:46.7100235Z             },
2026-08-28T09:54:46.7100388Z             {
2026-08-28T09:54:46.7100653Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7100811Z               "line": 58
2026-08-28T09:54:46.7100972Z             },
2026-08-28T09:54:46.7101250Z             {
2026-08-28T09:54:46.7101512Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7101679Z               "line": 72
2026-08-28T09:54:46.7101832Z             },
2026-08-28T09:54:46.7101984Z             {
2026-08-28T09:54:46.7102241Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7102405Z               "line": 83
2026-08-28T09:54:46.7102556Z             },
2026-08-28T09:54:46.7102705Z             {
2026-08-28T09:54:46.7102969Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7103131Z               "line": 873
2026-08-28T09:54:46.7103286Z             }
2026-08-28T09:54:46.7103436Z           ]
2026-08-28T09:54:46.7103592Z         },
2026-08-28T09:54:46.7103745Z         "int": {
2026-08-28T09:54:46.7103930Z           "complete": false,
2026-08-28T09:54:46.7104093Z           "evidence": []
2026-08-28T09:54:46.7104245Z         },
2026-08-28T09:54:46.7104398Z         "unit": {
2026-08-28T09:54:46.7104661Z           "complete": true,
2026-08-28T09:54:46.7104841Z           "evidence": [
2026-08-28T09:54:46.7104986Z             {
2026-08-28T09:54:46.7105238Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7105394Z               "line": 2340
2026-08-28T09:54:46.7105549Z             },
2026-08-28T09:54:46.7105695Z             {
2026-08-28T09:54:46.7105984Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:46.7106149Z               "line": 2415
2026-08-28T09:54:46.7106308Z             },
2026-08-28T09:54:46.7106473Z             {
2026-08-28T09:54:46.7106726Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7106899Z               "line": 1435
2026-08-28T09:54:46.7107055Z             },
2026-08-28T09:54:46.7107209Z             {
2026-08-28T09:54:46.7107471Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7107646Z               "line": 1457
2026-08-28T09:54:46.7107795Z             },
2026-08-28T09:54:46.7107951Z             {
2026-08-28T09:54:46.7108215Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.7108494Z               "line": 1480
2026-08-28T09:54:46.7108654Z             }
2026-08-28T09:54:46.7108802Z           ]
2026-08-28T09:54:46.7109025Z         }
2026-08-28T09:54:46.7109170Z       }
2026-08-28T09:54:46.7109321Z     },
2026-08-28T09:54:46.7109475Z     {
2026-08-28T09:54:46.7109743Z       "id": "REQ-HAZARD-DAEMON-SCHED-NONBLOCKING",
2026-08-28T09:54:46.7111824Z       "title": "Per-agent pulse/psyche/echo-commune scheduling must not serialize across agents: each agent's bounded LLM call (echo-commune summarizer, Psyche turn) runs off the shared scheduler so one slow/hung call cannot stall another agent's tick (7.4)",
2026-08-28T09:54:46.7112011Z       "requiredStages": [
2026-08-28T09:54:46.7112172Z         "impl",
2026-08-28T09:54:46.7112330Z         "unit"
2026-08-28T09:54:46.7112492Z       ],
2026-08-28T09:54:46.7112650Z       "stages": {
2026-08-28T09:54:46.7112811Z         "doc": {
2026-08-28T09:54:46.7112993Z           "complete": false,
2026-08-28T09:54:46.7113168Z           "evidence": []
2026-08-28T09:54:46.7113327Z         },
2026-08-28T09:54:46.7113478Z         "impl": {
2026-08-28T09:54:46.7113663Z           "complete": true,
2026-08-28T09:54:46.7113828Z           "evidence": [
2026-08-28T09:54:46.7113981Z             {
2026-08-28T09:54:46.7114238Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7114409Z               "line": 5435
2026-08-28T09:54:46.7114568Z             },
2026-08-28T09:54:46.7114720Z             {
2026-08-28T09:54:46.7114973Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7115129Z               "line": 6106
2026-08-28T09:54:46.7115282Z             }
2026-08-28T09:54:46.7115425Z           ]
2026-08-28T09:54:46.7115588Z         },
2026-08-28T09:54:46.7115764Z         "int": {
2026-08-28T09:54:46.7115935Z           "complete": false,
2026-08-28T09:54:46.7116094Z           "evidence": []
2026-08-28T09:54:46.7116350Z         },
2026-08-28T09:54:46.7116507Z         "unit": {
2026-08-28T09:54:46.7116686Z           "complete": true,
2026-08-28T09:54:46.7116858Z           "evidence": [
2026-08-28T09:54:46.7117015Z             {
2026-08-28T09:54:46.7117300Z               "path": "crates/spt-daemon/tests/shellchan.rs",
2026-08-28T09:54:46.7117469Z               "line": 161
2026-08-28T09:54:46.7117625Z             }
2026-08-28T09:54:46.7117788Z           ]
2026-08-28T09:54:46.7117935Z         }
2026-08-28T09:54:46.7118089Z       }
2026-08-28T09:54:46.7118240Z     },
2026-08-28T09:54:46.7118389Z     {
2026-08-28T09:54:46.7118626Z       "id": "REQ-HAZARD-DAEMON-STOP-BARRIER",
2026-08-28T09:54:46.7123743Z       "title": "B3: `spt daemon stop` then an immediate `spt daemon start` does NOT race — stop fully completes before it returns. Today request_stop (seedmap.rs:240-255) returns on the KIND_STOPPING ack (sent seedmap.rs:174-176) BEFORE the seed socket unbinds, so a following is_running ping (daemon.rs:375) wins the exit window and start reports ALREADY_RUNNING (operator: daemon stop → STOPPED then start → ALREADY_RUNNING). FIX: unbind/stop-gate the seed socket BEFORE acking KIND_STOPPING, OR request_stop waits for a ping-to-fail before returning. Unit: stop then immediate is_running()==false. (v0.12.0)",
2026-08-28T09:54:46.7123938Z       "requiredStages": [
2026-08-28T09:54:46.7124099Z         "impl",
2026-08-28T09:54:46.7124251Z         "unit"
2026-08-28T09:54:46.7124402Z       ],
2026-08-28T09:54:46.7124561Z       "stages": {
2026-08-28T09:54:46.7124717Z         "doc": {
2026-08-28T09:54:46.7124894Z           "complete": false,
2026-08-28T09:54:46.7125070Z           "evidence": []
2026-08-28T09:54:46.7125223Z         },
2026-08-28T09:54:46.7125380Z         "impl": {
2026-08-28T09:54:46.7125557Z           "complete": true,
2026-08-28T09:54:46.7125734Z           "evidence": [
2026-08-28T09:54:46.7125886Z             {
2026-08-28T09:54:46.7126153Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7126334Z               "line": 5463
2026-08-28T09:54:46.7126605Z             },
2026-08-28T09:54:46.7126760Z             {
2026-08-28T09:54:46.7127024Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:46.7127193Z               "line": 276
2026-08-28T09:54:46.7127341Z             },
2026-08-28T09:54:46.7127508Z             {
2026-08-28T09:54:46.7127761Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:46.7127927Z               "line": 301
2026-08-28T09:54:46.7128085Z             },
2026-08-28T09:54:46.7128233Z             {
2026-08-28T09:54:46.7128504Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:46.7128663Z               "line": 332
2026-08-28T09:54:46.7128824Z             }
2026-08-28T09:54:46.7129053Z           ]
2026-08-28T09:54:46.7129211Z         },
2026-08-28T09:54:46.7129363Z         "int": {
2026-08-28T09:54:46.7129548Z           "complete": false,
2026-08-28T09:54:46.7129717Z           "evidence": []
2026-08-28T09:54:46.7129875Z         },
2026-08-28T09:54:46.7130032Z         "unit": {
2026-08-28T09:54:46.7130199Z           "complete": true,
2026-08-28T09:54:46.7130371Z           "evidence": [
2026-08-28T09:54:46.7130519Z             {
2026-08-28T09:54:46.7130785Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:46.7130952Z               "line": 488
2026-08-28T09:54:46.7131109Z             }
2026-08-28T09:54:46.7131262Z           ]
2026-08-28T09:54:46.7131415Z         }
2026-08-28T09:54:46.7131563Z       }
2026-08-28T09:54:46.7131710Z     },
2026-08-28T09:54:46.7131864Z     {
2026-08-28T09:54:46.7132088Z       "id": "REQ-HAZARD-DAEMON-STOP-REAP",
2026-08-28T09:54:46.7137517Z       "title": "Breap: `spt daemon stop` REAPS the spt-hosted children it spawned — no orphaned psyche/harness processes. Today a stop leaves ~8 orphaned claude-spt-psyche.exe + spt.exe: Psyches are spawned DETACHED (runtime.rs:342-356, the Child is dropped — 'Detached' ~349) and the livehost stop flag Arc<AtomicBool> is NEVER raised (brainproc.rs:227-230 holds it 'for symmetry'). FIX: on stop, raise the livehost stop flag AND kill the spawned psyche/spt-hosted children — via a Windows job object / Unix process-group so the children die with the daemon (not detached-immortal). Folds with B3 (both the stop path). (v0.12.0)",
2026-08-28T09:54:46.7137825Z       "requiredStages": [
2026-08-28T09:54:46.7137988Z         "impl",
2026-08-28T09:54:46.7138154Z         "unit"
2026-08-28T09:54:46.7138307Z       ],
2026-08-28T09:54:46.7138473Z       "stages": {
2026-08-28T09:54:46.7138627Z         "doc": {
2026-08-28T09:54:46.7138880Z           "complete": false,
2026-08-28T09:54:46.7139136Z           "evidence": []
2026-08-28T09:54:46.7139284Z         },
2026-08-28T09:54:46.7139442Z         "impl": {
2026-08-28T09:54:46.7139613Z           "complete": true,
2026-08-28T09:54:46.7139781Z           "evidence": [
2026-08-28T09:54:46.7139933Z             {
2026-08-28T09:54:46.7140250Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.7140420Z               "line": 1258
2026-08-28T09:54:46.7140588Z             },
2026-08-28T09:54:46.7140740Z             {
2026-08-28T09:54:46.7141002Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7141169Z               "line": 401
2026-08-28T09:54:46.7141321Z             },
2026-08-28T09:54:46.7141480Z             {
2026-08-28T09:54:46.7141732Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7141908Z               "line": 438
2026-08-28T09:54:46.7142062Z             },
2026-08-28T09:54:46.7142208Z             {
2026-08-28T09:54:46.7142457Z               "path": "crates/spt-daemon/src/reap.rs",
2026-08-28T09:54:46.7142614Z               "line": 26
2026-08-28T09:54:46.7142767Z             },
2026-08-28T09:54:46.7142918Z             {
2026-08-28T09:54:46.7143166Z               "path": "crates/spt-daemon/src/reap.rs",
2026-08-28T09:54:46.7143323Z               "line": 224
2026-08-28T09:54:46.7143476Z             }
2026-08-28T09:54:46.7143638Z           ]
2026-08-28T09:54:46.7143786Z         },
2026-08-28T09:54:46.7144058Z         "int": {
2026-08-28T09:54:46.7144233Z           "complete": false,
2026-08-28T09:54:46.7144410Z           "evidence": []
2026-08-28T09:54:46.7144563Z         },
2026-08-28T09:54:46.7144730Z         "unit": {
2026-08-28T09:54:46.7144907Z           "complete": true,
2026-08-28T09:54:46.7145092Z           "evidence": [
2026-08-28T09:54:46.7145258Z             {
2026-08-28T09:54:46.7145489Z               "path": "crates/spt-daemon/src/reap.rs",
2026-08-28T09:54:46.7145657Z               "line": 294
2026-08-28T09:54:46.7145827Z             },
2026-08-28T09:54:46.7145982Z             {
2026-08-28T09:54:46.7149731Z               "path": "crates/spt-daemon/src/reap.rs",
2026-08-28T09:54:46.7149921Z               "line": 371
2026-08-28T09:54:46.7150079Z             },
2026-08-28T09:54:46.7150230Z             {
2026-08-28T09:54:46.7150484Z               "path": "crates/spt-daemon/src/reap.rs",
2026-08-28T09:54:46.7150663Z               "line": 379
2026-08-28T09:54:46.7150810Z             }
2026-08-28T09:54:46.7150970Z           ]
2026-08-28T09:54:46.7151125Z         }
2026-08-28T09:54:46.7151271Z       }
2026-08-28T09:54:46.7151415Z     },
2026-08-28T09:54:46.7151562Z     {
2026-08-28T09:54:46.7151782Z       "id": "REQ-HAZARD-DEAD-REC-PID",
2026-08-28T09:54:46.7162586Z       "title": "E-1 rider (F-026 #11 dead-pid class, doyle-ruled SCOPED 2026-07-05 — KNOWN-HAZARDS 7.34): a dead `rec.pid` on an spt-hosted perch is EXPECTED, not staleness — the recorded pid is the ephemeral bind-CLI pid, which dies immediately after bind (the broker holds the PTY; no resident harness process at that pid). NO reader may alive-gate on `rec.pid` alone: spt-hosted LIVENESS comes from the daemon-managed status field (KH 2.5 — status present ⇒ authoritative, never a per-pid probe); IDENTITY comes from session/ancestry resolution where `rec.parent_pid` (the harness pid, the stable session-binding anchor) is the ancestry candidate (REQ-SELF-DETECT-PARENT-PID). Re-stamping rec.pid with the harness pid (shape (a)) is OVERRULED: ADR-0021 demoted pid to a bind-time seed hint (re-anchoring truth there reverses the design); every pre-existing record keeps the old CLI pid so readers need the scoped discipline anyway (migration hole); blast radius (every rec.pid consumer + KH 2.5 external-perch probe semantics) buys nothing the reader-side fix doesn't. CLASS rule: any newly sighted rec.pid-alive-gating reader gets the same scoped fix and EXTENDS this requirement's evidence — no new REQ per reader.",
2026-08-28T09:54:46.7162953Z       "requiredStages": [
2026-08-28T09:54:46.7163110Z         "doc",
2026-08-28T09:54:46.7163263Z         "int"
2026-08-28T09:54:46.7163419Z       ],
2026-08-28T09:54:46.7163587Z       "stages": {
2026-08-28T09:54:46.7163739Z         "doc": {
2026-08-28T09:54:46.7163921Z           "complete": true,
2026-08-28T09:54:46.7164090Z           "evidence": [
2026-08-28T09:54:46.7164240Z             {
2026-08-28T09:54:46.7164458Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7164630Z               "line": 697
2026-08-28T09:54:46.7164783Z             }
2026-08-28T09:54:46.7164944Z           ]
2026-08-28T09:54:46.7165489Z         },
2026-08-28T09:54:46.7165650Z         "impl": {
2026-08-28T09:54:46.7165822Z           "complete": false,
2026-08-28T09:54:46.7165979Z           "evidence": []
2026-08-28T09:54:46.7166146Z         },
2026-08-28T09:54:46.7166283Z         "int": {
2026-08-28T09:54:46.7166459Z           "complete": true,
2026-08-28T09:54:46.7166619Z           "evidence": [
2026-08-28T09:54:46.7166763Z             {
2026-08-28T09:54:46.7166991Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.7167158Z               "line": 505
2026-08-28T09:54:46.7167311Z             }
2026-08-28T09:54:46.7167449Z           ]
2026-08-28T09:54:46.7167601Z         },
2026-08-28T09:54:46.7167754Z         "unit": {
2026-08-28T09:54:46.7167930Z           "complete": false,
2026-08-28T09:54:46.7168097Z           "evidence": []
2026-08-28T09:54:46.7168255Z         }
2026-08-28T09:54:46.7168560Z       }
2026-08-28T09:54:46.7168703Z     },
2026-08-28T09:54:46.7168861Z     {
2026-08-28T09:54:46.7169169Z       "id": "REQ-HAZARD-DEFERRED-DRAIN",
2026-08-28T09:54:46.7169645Z       "title": "Deferred spool rows excluded from the event-stream drain (1.4)",
2026-08-28T09:54:46.7169824Z       "requiredStages": [
2026-08-28T09:54:46.7169983Z         "impl",
2026-08-28T09:54:46.7170134Z         "unit"
2026-08-28T09:54:46.7170283Z       ],
2026-08-28T09:54:46.7170440Z       "stages": {
2026-08-28T09:54:46.7170598Z         "doc": {
2026-08-28T09:54:46.7170774Z           "complete": false,
2026-08-28T09:54:46.7170937Z           "evidence": []
2026-08-28T09:54:46.7171089Z         },
2026-08-28T09:54:46.7171242Z         "impl": {
2026-08-28T09:54:46.7171422Z           "complete": true,
2026-08-28T09:54:46.7171590Z           "evidence": [
2026-08-28T09:54:46.7171745Z             {
2026-08-28T09:54:46.7171987Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7172154Z               "line": 91
2026-08-28T09:54:46.7172311Z             },
2026-08-28T09:54:46.7172464Z             {
2026-08-28T09:54:46.7172711Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7172879Z               "line": 335
2026-08-28T09:54:46.7173035Z             },
2026-08-28T09:54:46.7173179Z             {
2026-08-28T09:54:46.7173423Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7173584Z               "line": 471
2026-08-28T09:54:46.7173733Z             },
2026-08-28T09:54:46.7173884Z             {
2026-08-28T09:54:46.7174124Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7174284Z               "line": 793
2026-08-28T09:54:46.7174434Z             }
2026-08-28T09:54:46.7174584Z           ]
2026-08-28T09:54:46.7174732Z         },
2026-08-28T09:54:46.7174884Z         "int": {
2026-08-28T09:54:46.7175067Z           "complete": false,
2026-08-28T09:54:46.7175237Z           "evidence": []
2026-08-28T09:54:46.7175500Z         },
2026-08-28T09:54:46.7175662Z         "unit": {
2026-08-28T09:54:46.7175843Z           "complete": true,
2026-08-28T09:54:46.7176006Z           "evidence": [
2026-08-28T09:54:46.7176163Z             {
2026-08-28T09:54:46.7176401Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7176573Z               "line": 1028
2026-08-28T09:54:46.7176725Z             },
2026-08-28T09:54:46.7176876Z             {
2026-08-28T09:54:46.7177117Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7177280Z               "line": 1100
2026-08-28T09:54:46.7177437Z             },
2026-08-28T09:54:46.7177585Z             {
2026-08-28T09:54:46.7177832Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7177995Z               "line": 1163
2026-08-28T09:54:46.7178157Z             },
2026-08-28T09:54:46.7178310Z             {
2026-08-28T09:54:46.7178549Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7178719Z               "line": 1184
2026-08-28T09:54:46.7178878Z             }
2026-08-28T09:54:46.7179183Z           ]
2026-08-28T09:54:46.7179334Z         }
2026-08-28T09:54:46.7179488Z       }
2026-08-28T09:54:46.7179634Z     },
2026-08-28T09:54:46.7179782Z     {
2026-08-28T09:54:46.7180009Z       "id": "REQ-HAZARD-DEFERRED-MANIFEST",
2026-08-28T09:54:46.7186886Z       "title": "A pointer-mode (delegated / GhReleaseManaged) adapter whose binary/manifest is not yet extracted is reported with a CLEAR diagnostic, never silently dropped. Today such an adapter reads its manifest LIVE from source_dir (registry.rs manifest_dir ~146/149); a deferred / un-extracted install makes load_manifest fail → registered() (~410, filter_map(.ok())) SILENTLY DROPS the row → downstream ADAPTER_UNRESOLVED + a cryptic os-error-2 on `spt adapter use`. FIX: surface a clear diagnostic at the resolver + at `adapter use` (name the adapter + the deferred/missing-manifest cause + the fix), not a silent filter-drop and not a bare os-error-2; consider an eager manifest copy at register time so host_binaries survive before the binary download completes. doyle Finding A. (post-v0.10.0)",
2026-08-28T09:54:46.7187201Z       "requiredStages": [
2026-08-28T09:54:46.7187365Z         "impl",
2026-08-28T09:54:46.7187518Z         "unit"
2026-08-28T09:54:46.7187673Z       ],
2026-08-28T09:54:46.7187830Z       "stages": {
2026-08-28T09:54:46.7187992Z         "doc": {
2026-08-28T09:54:46.7188164Z           "complete": false,
2026-08-28T09:54:46.7188330Z           "evidence": []
2026-08-28T09:54:46.7188480Z         },
2026-08-28T09:54:46.7188664Z         "impl": {
2026-08-28T09:54:46.7188847Z           "complete": true,
2026-08-28T09:54:46.7189099Z           "evidence": [
2026-08-28T09:54:46.7189261Z             {
2026-08-28T09:54:46.7189542Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.7189705Z               "line": 463
2026-08-28T09:54:46.7189852Z             },
2026-08-28T09:54:46.7190005Z             {
2026-08-28T09:54:46.7190271Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.7190447Z               "line": 507
2026-08-28T09:54:46.7190597Z             }
2026-08-28T09:54:46.7190746Z           ]
2026-08-28T09:54:46.7190897Z         },
2026-08-28T09:54:46.7191047Z         "int": {
2026-08-28T09:54:46.7191221Z           "complete": false,
2026-08-28T09:54:46.7191385Z           "evidence": []
2026-08-28T09:54:46.7191536Z         },
2026-08-28T09:54:46.7191690Z         "unit": {
2026-08-28T09:54:46.7191880Z           "complete": true,
2026-08-28T09:54:46.7192047Z           "evidence": [
2026-08-28T09:54:46.7192194Z             {
2026-08-28T09:54:46.7192461Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:46.7192625Z               "line": 1119
2026-08-28T09:54:46.7192781Z             }
2026-08-28T09:54:46.7192927Z           ]
2026-08-28T09:54:46.7193078Z         }
2026-08-28T09:54:46.7193226Z       }
2026-08-28T09:54:46.7193375Z     },
2026-08-28T09:54:46.7193632Z     {
2026-08-28T09:54:46.7193889Z       "id": "REQ-HAZARD-DEFERRED-SURVIVE-DRAIN",
2026-08-28T09:54:46.7194170Z       "title": "Deferred rows survive poll drain (4.4)",
2026-08-28T09:54:46.7194347Z       "requiredStages": [
2026-08-28T09:54:46.7194504Z         "impl",
2026-08-28T09:54:46.7194656Z         "unit"
2026-08-28T09:54:46.7194814Z       ],
2026-08-28T09:54:46.7194971Z       "stages": {
2026-08-28T09:54:46.7195139Z         "doc": {
2026-08-28T09:54:46.7195309Z           "complete": false,
2026-08-28T09:54:46.7195478Z           "evidence": []
2026-08-28T09:54:46.7195633Z         },
2026-08-28T09:54:46.7195790Z         "impl": {
2026-08-28T09:54:46.7195972Z           "complete": true,
2026-08-28T09:54:46.7196134Z           "evidence": [
2026-08-28T09:54:46.7196291Z             {
2026-08-28T09:54:46.7196535Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7196700Z               "line": 364
2026-08-28T09:54:46.7196854Z             },
2026-08-28T09:54:46.7197006Z             {
2026-08-28T09:54:46.7197254Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7197413Z               "line": 454
2026-08-28T09:54:46.7197569Z             }
2026-08-28T09:54:46.7197712Z           ]
2026-08-28T09:54:46.7197864Z         },
2026-08-28T09:54:46.7198011Z         "int": {
2026-08-28T09:54:46.7198191Z           "complete": false,
2026-08-28T09:54:46.7198376Z           "evidence": []
2026-08-28T09:54:46.7198529Z         },
2026-08-28T09:54:46.7198691Z         "unit": {
2026-08-28T09:54:46.7198863Z           "complete": true,
2026-08-28T09:54:46.7199120Z           "evidence": [
2026-08-28T09:54:46.7199282Z             {
2026-08-28T09:54:46.7199530Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7199698Z               "line": 1055
2026-08-28T09:54:46.7199850Z             },
2026-08-28T09:54:46.7200013Z             {
2026-08-28T09:54:46.7200246Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.7200417Z               "line": 1136
2026-08-28T09:54:46.7200570Z             }
2026-08-28T09:54:46.7200836Z           ]
2026-08-28T09:54:46.7200988Z         }
2026-08-28T09:54:46.7201138Z       }
2026-08-28T09:54:46.7201286Z     },
2026-08-28T09:54:46.7201438Z     {
2026-08-28T09:54:46.7201682Z       "id": "REQ-HAZARD-DELIVERY-STARVATION",
2026-08-28T09:54:46.7210690Z       "title": "A NON-DEFERRED message that has REACHED a node's spool (WAN-arrived or locally spooled-while-active) is NEVER dependent on an adapter HOOK-POLL cadence for its eventual delivery to an spt-hosted (relay-less) endpoint — the daemon itself drives delivery on the events it owns (WAN ingress + the ACTIVE→IDLE edge). Hazard class: delivery starvation. Without this, cross-node and post-active messages to an spt-hosted perch strand indefinitely whenever the adapter's hooks are quiet (idle session, no user turns), presenting as 'sent but never lands' with a healthy binary and an idle perch (F-023). SCOPE NARROWED 2026-07-26 (FIELD-TRUTH W1 roll-in, operator ruling): the deferred (active_only) class is EXPLICITLY OUTSIDE this guarantee — per ADR-0028 it is hook-carried background context that never wakes an idle agent; with no hook cadence it waits by design. The no-starvation guarantee binds the default and idle_only classes only. Guarded by REQ-WAN-SPT-HOSTED-DELIVERY (WAN ingress leg) + REQ-MSG-IDLE-EDGE-DRAIN (idle-edge drain, as amended). (F-023)",
2026-08-28T09:54:46.7210916Z       "requiredStages": [
2026-08-28T09:54:46.7211077Z         "doc",
2026-08-28T09:54:46.7211231Z         "int"
2026-08-28T09:54:46.7211386Z       ],
2026-08-28T09:54:46.7211543Z       "stages": {
2026-08-28T09:54:46.7211698Z         "doc": {
2026-08-28T09:54:46.7211881Z           "complete": true,
2026-08-28T09:54:46.7212036Z           "evidence": [
2026-08-28T09:54:46.7212186Z             {
2026-08-28T09:54:46.7212399Z               "path": "docs/F-035-CONFLICT.md",
2026-08-28T09:54:46.7212557Z               "line": 5
2026-08-28T09:54:46.7212699Z             },
2026-08-28T09:54:46.7212976Z             {
2026-08-28T09:54:46.7213192Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7213363Z               "line": 604
2026-08-28T09:54:46.7213520Z             },
2026-08-28T09:54:46.7213668Z             {
2026-08-28T09:54:46.7213886Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7214048Z               "line": 1046
2026-08-28T09:54:46.7214194Z             },
2026-08-28T09:54:46.7214326Z             {
2026-08-28T09:54:46.7214852Z               "path": "docs/adr/0028-activity-gated-delivery-and-send-modifier-axes.md",
2026-08-28T09:54:46.7215014Z               "line": 11
2026-08-28T09:54:46.7215172Z             }
2026-08-28T09:54:46.7215325Z           ]
2026-08-28T09:54:46.7215471Z         },
2026-08-28T09:54:46.7215629Z         "impl": {
2026-08-28T09:54:46.7215801Z           "complete": true,
2026-08-28T09:54:46.7215973Z           "evidence": [
2026-08-28T09:54:46.7216124Z             {
2026-08-28T09:54:46.7216383Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:46.7216554Z               "line": 109
2026-08-28T09:54:46.7216712Z             },
2026-08-28T09:54:46.7216862Z             {
2026-08-28T09:54:46.7217101Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.7217268Z               "line": 1063
2026-08-28T09:54:46.7217416Z             },
2026-08-28T09:54:46.7217569Z             {
2026-08-28T09:54:46.7217816Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.7217979Z               "line": 626
2026-08-28T09:54:46.7218131Z             }
2026-08-28T09:54:46.7218280Z           ]
2026-08-28T09:54:46.7218436Z         },
2026-08-28T09:54:46.7218585Z         "int": {
2026-08-28T09:54:46.7218761Z           "complete": true,
2026-08-28T09:54:46.7218928Z           "evidence": [
2026-08-28T09:54:46.7219189Z             {
2026-08-28T09:54:46.7219559Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7219835Z               "line": 3003
2026-08-28T09:54:46.7220002Z             },
2026-08-28T09:54:46.7220141Z             {
2026-08-28T09:54:46.7220560Z               "path": "crates/spt/tests/idle_edge_drain_e2e.rs",
2026-08-28T09:54:46.7220707Z               "line": 74
2026-08-28T09:54:46.7220846Z             },
2026-08-28T09:54:46.7221003Z             {
2026-08-28T09:54:46.7221218Z               "path": "docs/F-035-CONFLICT.md",
2026-08-28T09:54:46.7221376Z               "line": 47
2026-08-28T09:54:46.7221532Z             }
2026-08-28T09:54:46.7221681Z           ]
2026-08-28T09:54:46.7221833Z         },
2026-08-28T09:54:46.7221994Z         "unit": {
2026-08-28T09:54:46.7222174Z           "complete": false,
2026-08-28T09:54:46.7222339Z           "evidence": []
2026-08-28T09:54:46.7222488Z         }
2026-08-28T09:54:46.7222640Z       }
2026-08-28T09:54:46.7222779Z     },
2026-08-28T09:54:46.7222935Z     {
2026-08-28T09:54:46.7223184Z       "id": "REQ-HAZARD-DETACHED-DAEMON-STDIO",
2026-08-28T09:54:46.7239804Z       "title": "A daemon DETACHED-IN-FACT (no interactive console, or an inherited stderr PIPE nobody drains) that never nulled its std handles will BLOCK on stdio writes when the pipe fills, and/or pop a visible conhost window (REQ-HAZARD-WMI-DAEMON-WINDOW is a covered surface of this hazard). detach_console nulls the 3 handles only under the --detached flag; a rung that omits it (the bare line-82 elevated->deelevated respawn; a STALE installer at-logon task registered as bare `daemon run`, confirmed live field-drift on ENLYZEAM) is exposed. FIX: (load-bearing) inside `daemon run`, null the 3 std handles when stderr GetFileType==FILE_TYPE_PIPE — a pipe is the ONLY std sink that BLOCKS the daemon when it fills; catches every rung whose inherited stderr is an undrained pipe, independent of whether each caller passed --detached, while a FILE (2>run.log AND every int-test Stdio::from(file) brain-log capture), a CONSOLE (scrolls), and a NULL/absent handle (DETACHED_PROCESS rungs, already discard) all SURVIVE. DELIBERATELY NOT gated on GetConsoleWindow==NULL: a CREATE_NO_WINDOW daemon has no console window yet a drained FILE stderr — nulling it would blank the capture for ZERO safety gain (a file never blocks) and mass-red the int-test brain-log assertions. (belt) pass --detached on the bare line-82 respawn; (drift nag) parse the schtasks /Query action argv and LOUDLY nag when the at-logon task is the stale bare `daemon run` form (manual/installer re-registers; the daemon must NOT self-elevate to rewrite it). Defense-in-depth — no current spt Windows spawn path was proven to yield a BLOCKING inherited pipe (all rungs null-discard or scrolling-conhost), so this is hardening, not a confirmed incident root.",
2026-08-28T09:54:46.7240261Z       "requiredStages": [
2026-08-28T09:54:46.7240422Z         "impl",
2026-08-28T09:54:46.7240588Z         "unit"
2026-08-28T09:54:46.7240742Z       ],
2026-08-28T09:54:46.7240912Z       "stages": {
2026-08-28T09:54:46.7241070Z         "doc": {
2026-08-28T09:54:46.7241256Z           "complete": false,
2026-08-28T09:54:46.7241460Z           "evidence": []
2026-08-28T09:54:46.7241614Z         },
2026-08-28T09:54:46.7241784Z         "impl": {
2026-08-28T09:54:46.7241957Z           "complete": true,
2026-08-28T09:54:46.7242128Z           "evidence": [
2026-08-28T09:54:46.7242291Z             {
2026-08-28T09:54:46.7242559Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7242729Z               "line": 2050
2026-08-28T09:54:46.7242878Z             },
2026-08-28T09:54:46.7243029Z             {
2026-08-28T09:54:46.7243284Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7243450Z               "line": 2068
2026-08-28T09:54:46.7243599Z             },
2026-08-28T09:54:46.7243750Z             {
2026-08-28T09:54:46.7244013Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.7244176Z               "line": 225
2026-08-28T09:54:46.7244332Z             },
2026-08-28T09:54:46.7244477Z             {
2026-08-28T09:54:46.7244757Z               "path": "crates/spt-daemon/src/stderrlog.rs",
2026-08-28T09:54:46.7244924Z               "line": 24
2026-08-28T09:54:46.7245358Z             }
2026-08-28T09:54:46.7245502Z           ]
2026-08-28T09:54:46.7245652Z         },
2026-08-28T09:54:46.7245809Z         "int": {
2026-08-28T09:54:46.7245978Z           "complete": false,
2026-08-28T09:54:46.7246147Z           "evidence": []
2026-08-28T09:54:46.7246298Z         },
2026-08-28T09:54:46.7246457Z         "unit": {
2026-08-28T09:54:46.7246632Z           "complete": true,
2026-08-28T09:54:46.7246800Z           "evidence": [
2026-08-28T09:54:46.7246951Z             {
2026-08-28T09:54:46.7247205Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7247377Z               "line": 3062
2026-08-28T09:54:46.7247529Z             },
2026-08-28T09:54:46.7247668Z             {
2026-08-28T09:54:46.7247925Z               "path": "crates/spt-daemon/src/service.rs",
2026-08-28T09:54:46.7248082Z               "line": 342
2026-08-28T09:54:46.7248230Z             }
2026-08-28T09:54:46.7248388Z           ]
2026-08-28T09:54:46.7248538Z         }
2026-08-28T09:54:46.7248697Z       }
2026-08-28T09:54:46.7248843Z     },
2026-08-28T09:54:46.7249059Z     {
2026-08-28T09:54:46.7249383Z       "id": "REQ-HAZARD-DETACHED-PIPE-INHERIT",
2026-08-28T09:54:46.7252636Z       "title": "Windows detached long-lived children must not inherit a captured caller's pipe: every detach-spawn of an immortal child (daemon, shell binary) runs bInheritHandles=FALSE, or a caller capturing output anywhere up the process chain hangs forever on a pipe that never EOFs — std-handle flag stripping is NOT sufficient (grandparent strays still flow) (5.6)",
2026-08-28T09:54:46.7252851Z       "requiredStages": [
2026-08-28T09:54:46.7253041Z         "impl",
2026-08-28T09:54:46.7253217Z         "unit"
2026-08-28T09:54:46.7253400Z       ],
2026-08-28T09:54:46.7253555Z       "stages": {
2026-08-28T09:54:46.7253718Z         "doc": {
2026-08-28T09:54:46.7253896Z           "complete": true,
2026-08-28T09:54:46.7254063Z           "evidence": [
2026-08-28T09:54:46.7254334Z             {
2026-08-28T09:54:46.7254549Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7254732Z               "line": 244
2026-08-28T09:54:46.7254878Z             }
2026-08-28T09:54:46.7255032Z           ]
2026-08-28T09:54:46.7255184Z         },
2026-08-28T09:54:46.7255337Z         "impl": {
2026-08-28T09:54:46.7255512Z           "complete": true,
2026-08-28T09:54:46.7255690Z           "evidence": [
2026-08-28T09:54:46.7255846Z             {
2026-08-28T09:54:46.7256104Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7256270Z               "line": 933
2026-08-28T09:54:46.7256421Z             },
2026-08-28T09:54:46.7256572Z             {
2026-08-28T09:54:46.7256830Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7256993Z               "line": 1052
2026-08-28T09:54:46.7257145Z             },
2026-08-28T09:54:46.7257298Z             {
2026-08-28T09:54:46.7257546Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7257712Z               "line": 1362
2026-08-28T09:54:46.7257870Z             },
2026-08-28T09:54:46.7258013Z             {
2026-08-28T09:54:46.7258271Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7258437Z               "line": 1679
2026-08-28T09:54:46.7258586Z             },
2026-08-28T09:54:46.7258733Z             {
2026-08-28T09:54:46.7259056Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7259233Z               "line": 2259
2026-08-28T09:54:46.7259385Z             },
2026-08-28T09:54:46.7259543Z             {
2026-08-28T09:54:46.7259805Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.7259972Z               "line": 487
2026-08-28T09:54:46.7260129Z             }
2026-08-28T09:54:46.7260272Z           ]
2026-08-28T09:54:46.7260429Z         },
2026-08-28T09:54:46.7260577Z         "int": {
2026-08-28T09:54:46.7260754Z           "complete": false,
2026-08-28T09:54:46.7260915Z           "evidence": []
2026-08-28T09:54:46.7261078Z         },
2026-08-28T09:54:46.7261348Z         "unit": {
2026-08-28T09:54:46.7261529Z           "complete": true,
2026-08-28T09:54:46.7261703Z           "evidence": [
2026-08-28T09:54:46.7261848Z             {
2026-08-28T09:54:46.7262110Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7262270Z               "line": 2381
2026-08-28T09:54:46.7262425Z             },
2026-08-28T09:54:46.7262571Z             {
2026-08-28T09:54:46.7262819Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7262996Z               "line": 3100
2026-08-28T09:54:46.7263139Z             },
2026-08-28T09:54:46.7263291Z             {
2026-08-28T09:54:46.7263577Z               "path": "crates/spt/tests/bounded_output_e2e.rs",
2026-08-28T09:54:46.7263741Z               "line": 43
2026-08-28T09:54:46.7263887Z             }
2026-08-28T09:54:46.7264042Z           ]
2026-08-28T09:54:46.7264187Z         }
2026-08-28T09:54:46.7264340Z       }
2026-08-28T09:54:46.7264494Z     },
2026-08-28T09:54:46.7264642Z     {
2026-08-28T09:54:46.7264909Z       "id": "REQ-HAZARD-DIRECT-WRITE-PRECEDENCE",
2026-08-28T09:54:46.7265481Z       "title": "Direct-write precedence marker (with node id) guards stale overwrite (6.5)",
2026-08-28T09:54:46.7265668Z       "requiredStages": [
2026-08-28T09:54:46.7265806Z         "impl",
2026-08-28T09:54:46.7265955Z         "unit"
2026-08-28T09:54:46.7266106Z       ],
2026-08-28T09:54:46.7266270Z       "stages": {
2026-08-28T09:54:46.7266430Z         "doc": {
2026-08-28T09:54:46.7266608Z           "complete": false,
2026-08-28T09:54:46.7266772Z           "evidence": []
2026-08-28T09:54:46.7266920Z         },
2026-08-28T09:54:46.7267080Z         "impl": {
2026-08-28T09:54:46.7267253Z           "complete": true,
2026-08-28T09:54:46.7267414Z           "evidence": [
2026-08-28T09:54:46.7267562Z             {
2026-08-28T09:54:46.7267815Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7267982Z               "line": 26
2026-08-28T09:54:46.7268244Z             },
2026-08-28T09:54:46.7268396Z             {
2026-08-28T09:54:46.7268640Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7268808Z               "line": 135
2026-08-28T09:54:46.7269045Z             },
2026-08-28T09:54:46.7269197Z             {
2026-08-28T09:54:46.7269540Z               "path": "crates/spt-store/src/contextmark.rs",
2026-08-28T09:54:46.7269750Z               "line": 26
2026-08-28T09:54:46.7269907Z             },
2026-08-28T09:54:46.7270060Z             {
2026-08-28T09:54:46.7270331Z               "path": "crates/spt-store/src/contextmark.rs",
2026-08-28T09:54:46.7270494Z               "line": 237
2026-08-28T09:54:46.7270656Z             }
2026-08-28T09:54:46.7270804Z           ]
2026-08-28T09:54:46.7270955Z         },
2026-08-28T09:54:46.7271109Z         "int": {
2026-08-28T09:54:46.7271285Z           "complete": false,
2026-08-28T09:54:46.7271461Z           "evidence": []
2026-08-28T09:54:46.7271614Z         },
2026-08-28T09:54:46.7271771Z         "unit": {
2026-08-28T09:54:46.7271951Z           "complete": true,
2026-08-28T09:54:46.7272117Z           "evidence": [
2026-08-28T09:54:46.7272263Z             {
2026-08-28T09:54:46.7272511Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7272675Z               "line": 161
2026-08-28T09:54:46.7272831Z             },
2026-08-28T09:54:46.7272989Z             {
2026-08-28T09:54:46.7273222Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7273384Z               "line": 170
2026-08-28T09:54:46.7273532Z             },
2026-08-28T09:54:46.7273685Z             {
2026-08-28T09:54:46.7273929Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7274090Z               "line": 179
2026-08-28T09:54:46.7274244Z             },
2026-08-28T09:54:46.7274400Z             {
2026-08-28T09:54:46.7274644Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7274804Z               "line": 190
2026-08-28T09:54:46.7274956Z             },
2026-08-28T09:54:46.7275232Z             {
2026-08-28T09:54:46.7275479Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7275637Z               "line": 199
2026-08-28T09:54:46.7275789Z             },
2026-08-28T09:54:46.7275937Z             {
2026-08-28T09:54:46.7276176Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7276337Z               "line": 217
2026-08-28T09:54:46.7276486Z             },
2026-08-28T09:54:46.7276638Z             {
2026-08-28T09:54:46.7276877Z               "path": "crates/spt-live/src/context.rs",
2026-08-28T09:54:46.7277043Z               "line": 243
2026-08-28T09:54:46.7277187Z             },
2026-08-28T09:54:46.7277342Z             {
2026-08-28T09:54:46.7277583Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.7277745Z               "line": 649
2026-08-28T09:54:46.7277898Z             },
2026-08-28T09:54:46.7278046Z             {
2026-08-28T09:54:46.7278284Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.7278451Z               "line": 244
2026-08-28T09:54:46.7278603Z             },
2026-08-28T09:54:46.7278762Z             {
2026-08-28T09:54:46.7279152Z               "path": "crates/spt-store/src/contextmark.rs",
2026-08-28T09:54:46.7279334Z               "line": 265
2026-08-28T09:54:46.7279485Z             },
2026-08-28T09:54:46.7279635Z             {
2026-08-28T09:54:46.7279901Z               "path": "crates/spt-store/src/contextmark.rs",
2026-08-28T09:54:46.7280068Z               "line": 293
2026-08-28T09:54:46.7280214Z             },
2026-08-28T09:54:46.7280372Z             {
2026-08-28T09:54:46.7280634Z               "path": "crates/spt-store/src/contextmark.rs",
2026-08-28T09:54:46.7280810Z               "line": 317
2026-08-28T09:54:46.7280964Z             },
2026-08-28T09:54:46.7281115Z             {
2026-08-28T09:54:46.7281387Z               "path": "crates/spt-store/src/contextmark.rs",
2026-08-28T09:54:46.7281550Z               "line": 327
2026-08-28T09:54:46.7281812Z             },
2026-08-28T09:54:46.7281960Z             {
2026-08-28T09:54:46.7282228Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:46.7282393Z               "line": 540
2026-08-28T09:54:46.7282540Z             }
2026-08-28T09:54:46.7282691Z           ]
2026-08-28T09:54:46.7282843Z         }
2026-08-28T09:54:46.7282996Z       }
2026-08-28T09:54:46.7283143Z     },
2026-08-28T09:54:46.7283296Z     {
2026-08-28T09:54:46.7283573Z       "id": "REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT",
2026-08-28T09:54:46.7297330Z       "title": "An spt-hosted endpoint driven by a REMOTE controller whose remote is gone but whose broker connection stays OPEN (a wedged/lost pump that never delivers the detach) AND whose session is IDLE (no output) stays latched ONLINE+CONTROLLED forever: the W1 drain-evict only fires on OUTPUT (CONTROLLER_WRITE_DEADLINE on a backed-up write), a clean disconnect self-heals via detach_if→clear_controller, but an idle session with a half-open/wedged controller connection produces neither signal. PROVED repro-first on a real broker (v0.13.0 W5, inject_control_wedge.rs w5_a2): controller_by STAYS Some(origin) and driven_by STAYS Some after the remote is abandoned without a clean EOF on an idle session — so the brain reconcile CANNOT detect it from KIND_SESSIONS controller_by (the broker still reports it controlled). FIX DIRECTION (doyle ruling 2026-06-19, broker-side single-writer — the broker owns driven_by/clear_controller): wire the EXISTING D4c NetPresence connection-disconnect event → clear_controller for any session whose controller identity == the dead origin (become_controller already stores Some(origin); presence events already exist — modest wiring, NOT a new probe). The liveness ORACLE is QUIC's own keepalive/idle-timeout: a presence-disconnect IS a real QUIC conn close, already tolerant of transient blips within the keepalive window, so NO heavy partition ADR is needed UNLESS the QUIC timeout proves too slow for the UX (then mint an ADR for a faster controller-heartbeat + its false-evict bound). Composes with W1 (output path) + W5 Gap B (no-session) — this is the third, idle-remote, leg. (v0.13.0 follow-up)",
2026-08-28T09:54:46.7297691Z       "requiredStages": [
2026-08-28T09:54:46.7297854Z         "int"
2026-08-28T09:54:46.7298002Z       ],
2026-08-28T09:54:46.7298169Z       "stages": {
2026-08-28T09:54:46.7298326Z         "doc": {
2026-08-28T09:54:46.7298505Z           "complete": true,
2026-08-28T09:54:46.7298671Z           "evidence": [
2026-08-28T09:54:46.7298822Z             {
2026-08-28T09:54:46.7299481Z               "path": "docs/adr/0040-bounded-stream-seat-lifecycle-one-way-terminal.md",
2026-08-28T09:54:46.7299643Z               "line": 118
2026-08-28T09:54:46.7299796Z             }
2026-08-28T09:54:46.7299943Z           ]
2026-08-28T09:54:46.7300096Z         },
2026-08-28T09:54:46.7300253Z         "impl": {
2026-08-28T09:54:46.7300425Z           "complete": false,
2026-08-28T09:54:46.7300596Z           "evidence": []
2026-08-28T09:54:46.7300770Z         },
2026-08-28T09:54:46.7300929Z         "int": {
2026-08-28T09:54:46.7301103Z           "complete": true,
2026-08-28T09:54:46.7301277Z           "evidence": [
2026-08-28T09:54:46.7301430Z             {
2026-08-28T09:54:46.7301784Z               "path": "crates/spt-daemon/tests/transport_death_eof.rs",
2026-08-28T09:54:46.7301954Z               "line": 655
2026-08-28T09:54:46.7302108Z             }
2026-08-28T09:54:46.7302254Z           ]
2026-08-28T09:54:46.7302399Z         },
2026-08-28T09:54:46.7302555Z         "unit": {
2026-08-28T09:54:46.7302733Z           "complete": false,
2026-08-28T09:54:46.7302903Z           "evidence": []
2026-08-28T09:54:46.7303057Z         }
2026-08-28T09:54:46.7303208Z       }
2026-08-28T09:54:46.7303358Z     },
2026-08-28T09:54:46.7303504Z     {
2026-08-28T09:54:46.7303736Z       "id": "REQ-HAZARD-DRIVEN-BY-SELFHEAL",
2026-08-28T09:54:46.7308204Z       "title": "An spt-hosted endpoint's ONLINE+CONTROLLED state (`driven_by`) must CLEAR even when the detach IPC is lost — do NOT rely on the detach signal (same lesson as REQ-HAZARD-HOSTED-LIVENESS-RECONCILE B2): the reconcile loop clears `driven_by` when the endpoint has no live controller/session. Today a wedged or lost pump never delivers the detach, so the endpoint stays latched CONTROLLED forever. Composes with W1 (the wedge no longer blocks the detach) and rides the same pull-primary reconcile substrate as B2. (v0.13.0)",
2026-08-28T09:54:46.7308534Z       "requiredStages": [
2026-08-28T09:54:46.7308699Z         "impl",
2026-08-28T09:54:46.7308848Z         "unit",
2026-08-28T09:54:46.7309104Z         "int"
2026-08-28T09:54:46.7309254Z       ],
2026-08-28T09:54:46.7309436Z       "stages": {
2026-08-28T09:54:46.7309588Z         "doc": {
2026-08-28T09:54:46.7309765Z           "complete": false,
2026-08-28T09:54:46.7309926Z           "evidence": []
2026-08-28T09:54:46.7310084Z         },
2026-08-28T09:54:46.7310241Z         "impl": {
2026-08-28T09:54:46.7310413Z           "complete": true,
2026-08-28T09:54:46.7310603Z           "evidence": [
2026-08-28T09:54:46.7310757Z             {
2026-08-28T09:54:46.7311020Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7311185Z               "line": 986
2026-08-28T09:54:46.7311339Z             },
2026-08-28T09:54:46.7311490Z             {
2026-08-28T09:54:46.7311730Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.7311899Z               "line": 1517
2026-08-28T09:54:46.7312048Z             },
2026-08-28T09:54:46.7312199Z             {
2026-08-28T09:54:46.7312533Z               "path": "crates/spt-daemon/tests/driven_by_selfheal.rs",
2026-08-28T09:54:46.7312697Z               "line": 21
2026-08-28T09:54:46.7312843Z             }
2026-08-28T09:54:46.7312992Z           ]
2026-08-28T09:54:46.7313139Z         },
2026-08-28T09:54:46.7313293Z         "int": {
2026-08-28T09:54:46.7313468Z           "complete": true,
2026-08-28T09:54:46.7313636Z           "evidence": [
2026-08-28T09:54:46.7313787Z             {
2026-08-28T09:54:46.7314125Z               "path": "crates/spt-daemon/tests/driven_by_selfheal.rs",
2026-08-28T09:54:46.7314419Z               "line": 233
2026-08-28T09:54:46.7314571Z             },
2026-08-28T09:54:46.7314728Z             {
2026-08-28T09:54:46.7315047Z               "path": "crates/spt-daemon/tests/driven_by_selfheal.rs",
2026-08-28T09:54:46.7315216Z               "line": 400
2026-08-28T09:54:46.7315376Z             },
2026-08-28T09:54:46.7315511Z             {
2026-08-28T09:54:46.7315850Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7316016Z               "line": 2325
2026-08-28T09:54:46.7316170Z             },
2026-08-28T09:54:46.7316312Z             {
2026-08-28T09:54:46.7316660Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7316828Z               "line": 2513
2026-08-28T09:54:46.7316978Z             }
2026-08-28T09:54:46.7317131Z           ]
2026-08-28T09:54:46.7317276Z         },
2026-08-28T09:54:46.7317443Z         "unit": {
2026-08-28T09:54:46.7317610Z           "complete": true,
2026-08-28T09:54:46.7317782Z           "evidence": [
2026-08-28T09:54:46.7317929Z             {
2026-08-28T09:54:46.7318202Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7318378Z               "line": 1529
2026-08-28T09:54:46.7318530Z             }
2026-08-28T09:54:46.7318683Z           ]
2026-08-28T09:54:46.7318835Z         }
2026-08-28T09:54:46.7319065Z       }
2026-08-28T09:54:46.7319217Z     },
2026-08-28T09:54:46.7319371Z     {
2026-08-28T09:54:46.7319630Z       "id": "REQ-HAZARD-DROP-FILE-SINGLE-WRITER",
2026-08-28T09:54:46.7319967Z       "title": "Drop files are daemon-owned single-writer (6.4)",
2026-08-28T09:54:46.7320153Z       "requiredStages": [
2026-08-28T09:54:46.7320306Z         "impl",
2026-08-28T09:54:46.7320458Z         "unit"
2026-08-28T09:54:46.7320606Z       ],
2026-08-28T09:54:46.7320763Z       "stages": {
2026-08-28T09:54:46.7320911Z         "doc": {
2026-08-28T09:54:46.7321207Z           "complete": false,
2026-08-28T09:54:46.7321378Z           "evidence": []
2026-08-28T09:54:46.7321531Z         },
2026-08-28T09:54:46.7321688Z         "impl": {
2026-08-28T09:54:46.7321856Z           "complete": true,
2026-08-28T09:54:46.7322031Z           "evidence": [
2026-08-28T09:54:46.7322180Z             {
2026-08-28T09:54:46.7322412Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:46.7322569Z               "line": 25
2026-08-28T09:54:46.7322722Z             },
2026-08-28T09:54:46.7322870Z             {
2026-08-28T09:54:46.7323108Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.7323271Z               "line": 26
2026-08-28T09:54:46.7323422Z             },
2026-08-28T09:54:46.7323576Z             {
2026-08-28T09:54:46.7323805Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.7323971Z               "line": 339
2026-08-28T09:54:46.7324120Z             }
2026-08-28T09:54:46.7324271Z           ]
2026-08-28T09:54:46.7324429Z         },
2026-08-28T09:54:46.7324581Z         "int": {
2026-08-28T09:54:46.7324762Z           "complete": false,
2026-08-28T09:54:46.7324931Z           "evidence": []
2026-08-28T09:54:46.7325084Z         },
2026-08-28T09:54:46.7325241Z         "unit": {
2026-08-28T09:54:46.7325418Z           "complete": true,
2026-08-28T09:54:46.7325585Z           "evidence": [
2026-08-28T09:54:46.7325742Z             {
2026-08-28T09:54:46.7325965Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:46.7326138Z               "line": 237
2026-08-28T09:54:46.7326289Z             },
2026-08-28T09:54:46.7326439Z             {
2026-08-28T09:54:46.7326667Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:46.7326833Z               "line": 289
2026-08-28T09:54:46.7326987Z             },
2026-08-28T09:54:46.7327134Z             {
2026-08-28T09:54:46.7327374Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:46.7327524Z               "line": 382
2026-08-28T09:54:46.7327681Z             }
2026-08-28T09:54:46.7327836Z           ]
2026-08-28T09:54:46.7328104Z         }
2026-08-28T09:54:46.7328246Z       }
2026-08-28T09:54:46.7328394Z     },
2026-08-28T09:54:46.7328542Z     {
2026-08-28T09:54:46.7328743Z       "id": "REQ-HAZARD-EBUSY-RENAME",
2026-08-28T09:54:46.7329292Z       "title": "tmp-write + atomic-rename + retry on Windows EBUSY (5.2)",
2026-08-28T09:54:46.7329486Z       "requiredStages": [
2026-08-28T09:54:46.7329654Z         "impl",
2026-08-28T09:54:46.7329820Z         "unit"
2026-08-28T09:54:46.7329969Z       ],
2026-08-28T09:54:46.7330138Z       "stages": {
2026-08-28T09:54:46.7330290Z         "doc": {
2026-08-28T09:54:46.7330459Z           "complete": false,
2026-08-28T09:54:46.7330628Z           "evidence": []
2026-08-28T09:54:46.7330784Z         },
2026-08-28T09:54:46.7330933Z         "impl": {
2026-08-28T09:54:46.7331113Z           "complete": true,
2026-08-28T09:54:46.7331276Z           "evidence": [
2026-08-28T09:54:46.7331423Z             {
2026-08-28T09:54:46.7331672Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7331840Z               "line": 57
2026-08-28T09:54:46.7331991Z             },
2026-08-28T09:54:46.7332145Z             {
2026-08-28T09:54:46.7332391Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7332549Z               "line": 82
2026-08-28T09:54:46.7336559Z             },
2026-08-28T09:54:46.7336755Z             {
2026-08-28T09:54:46.7337032Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7337193Z               "line": 106
2026-08-28T09:54:46.7337351Z             },
2026-08-28T09:54:46.7337498Z             {
2026-08-28T09:54:46.7337756Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7337924Z               "line": 158
2026-08-28T09:54:46.7338074Z             },
2026-08-28T09:54:46.7338227Z             {
2026-08-28T09:54:46.7338463Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7338631Z               "line": 175
2026-08-28T09:54:46.7339092Z             }
2026-08-28T09:54:46.7339260Z           ]
2026-08-28T09:54:46.7339412Z         },
2026-08-28T09:54:46.7339566Z         "int": {
2026-08-28T09:54:46.7339751Z           "complete": false,
2026-08-28T09:54:46.7339918Z           "evidence": []
2026-08-28T09:54:46.7340070Z         },
2026-08-28T09:54:46.7340223Z         "unit": {
2026-08-28T09:54:46.7340399Z           "complete": true,
2026-08-28T09:54:46.7340575Z           "evidence": [
2026-08-28T09:54:46.7340731Z             {
2026-08-28T09:54:46.7340973Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7341140Z               "line": 246
2026-08-28T09:54:46.7341301Z             },
2026-08-28T09:54:46.7341451Z             {
2026-08-28T09:54:46.7341702Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7341865Z               "line": 259
2026-08-28T09:54:46.7342017Z             },
2026-08-28T09:54:46.7342165Z             {
2026-08-28T09:54:46.7342409Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7342579Z               "line": 334
2026-08-28T09:54:46.7342738Z             },
2026-08-28T09:54:46.7342890Z             {
2026-08-28T09:54:46.7343128Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7343291Z               "line": 352
2026-08-28T09:54:46.7343443Z             },
2026-08-28T09:54:46.7343594Z             {
2026-08-28T09:54:46.7343838Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.7344000Z               "line": 365
2026-08-28T09:54:46.7344147Z             }
2026-08-28T09:54:46.7344306Z           ]
2026-08-28T09:54:46.7344458Z         }
2026-08-28T09:54:46.7344605Z       }
2026-08-28T09:54:46.7344758Z     },
2026-08-28T09:54:46.7344906Z     {
2026-08-28T09:54:46.7345139Z       "id": "REQ-HAZARD-ECHO-BEFORE-SIGNOFF",
2026-08-28T09:54:46.7345612Z       "title": "Echo-commune fires before INIT_SIGNOFF on orphan teardown (3.3)",
2026-08-28T09:54:46.7345796Z       "requiredStages": [
2026-08-28T09:54:46.7345958Z         "impl",
2026-08-28T09:54:46.7346238Z         "unit"
2026-08-28T09:54:46.7346395Z       ],
2026-08-28T09:54:46.7346548Z       "stages": {
2026-08-28T09:54:46.7346728Z         "doc": {
2026-08-28T09:54:46.7346906Z           "complete": false,
2026-08-28T09:54:46.7347081Z           "evidence": []
2026-08-28T09:54:46.7347225Z         },
2026-08-28T09:54:46.7347382Z         "impl": {
2026-08-28T09:54:46.7347559Z           "complete": true,
2026-08-28T09:54:46.7347729Z           "evidence": [
2026-08-28T09:54:46.7347883Z             {
2026-08-28T09:54:46.7348151Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.7348321Z               "line": 1790
2026-08-28T09:54:46.7348466Z             },
2026-08-28T09:54:46.7348621Z             {
2026-08-28T09:54:46.7348872Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.7349114Z               "line": 26
2026-08-28T09:54:46.7349262Z             }
2026-08-28T09:54:46.7349424Z           ]
2026-08-28T09:54:46.7349591Z         },
2026-08-28T09:54:46.7349744Z         "int": {
2026-08-28T09:54:46.7349925Z           "complete": false,
2026-08-28T09:54:46.7350092Z           "evidence": []
2026-08-28T09:54:46.7350249Z         },
2026-08-28T09:54:46.7350402Z         "unit": {
2026-08-28T09:54:46.7350578Z           "complete": true,
2026-08-28T09:54:46.7350746Z           "evidence": [
2026-08-28T09:54:46.7350902Z             {
2026-08-28T09:54:46.7351150Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.7351311Z               "line": 150
2026-08-28T09:54:46.7351472Z             },
2026-08-28T09:54:46.7351623Z             {
2026-08-28T09:54:46.7351876Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.7352034Z               "line": 208
2026-08-28T09:54:46.7352195Z             }
2026-08-28T09:54:46.7352349Z           ]
2026-08-28T09:54:46.7352495Z         }
2026-08-28T09:54:46.7352645Z       }
2026-08-28T09:54:46.7352796Z     },
2026-08-28T09:54:46.7353049Z     {
2026-08-28T09:54:46.7353322Z       "id": "REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE",
2026-08-28T09:54:46.7379648Z       "title": "The effect journal serializes EVERY PTY effect under one mutex held ACROSS two fsyncs AND the blocking PTY write — so interactive input stutters and ultimately wedges the daemon hard. ROOT (doyle /diagnose, code-grounded + MEASURED on the operator's real Windows box, 2026-06-19): EffectJournal::apply_once (effect.rs:168-188) takes `inner.lock()` and holds it across `write_line(PENDING)` → `effect()` → `write_line(DONE)`, where write_line (effect.rs:235-239) does flush()+sync_all() (a full FlushFileBuffers) — so each effect pays TWO fsyncs under a GLOBAL lock, and the closure `effect()` (the actual PTY write, broker.rs:1257 EffectKind::PtyWrite via attach.rs:197 send_effect) runs while the lock is held. Two operator-visible facets, ONE root: (A) STUTTER/LAG — every keystroke is a PtyWrite effect = 2× sync_all serialized; measured fsync on %LOCALAPPDATA%\\spt-core = median 6.5ms, spikes to 198ms (C: was recently at 100%), so ~13ms+ per keystroke best case, hundreds under contention → 'many but not all keypresses take 100s of ms, choppy, worsens with volume'. (B) HARD PERMANENT WEDGE — when a PtyWrite `effect()` blocks (ConPTY input buffer full / harness not draining stdin), the journal lock is held INDEFINITELY → the single-threaded inbound-stream dispatch (dispatch.rs serve_attach, which both applies input effects AND opens attaches) can never progress → EVERY subsequent attach (`spt rc --view`/`--take`) fails with 'attach request: brain IPC read deadline elapsed' (confirmed: two retries deadline identically; broker control-plane KIND queries still answer — different thread). This REFUTES the W2-deferred ruling that park-(b)/(c) is 'Windows-benign because ConPTY absorbs 4MiB' — on the real box the input path wedges regardless. DISTINCT from W1 (REQ-HAZARD-INJECT-CONTROL-COEXIST = the OUTPUT drain, correctly fixed @8b5583e; output uses broker.rs:1106 append, NOT the fsync journal). This is the INPUT/effect-journal path W1 never touched, and it is THE wedge the operator hits with --take/--view. FIX DIRECTION (candidates, repro-first — extend inject_control_wedge.rs to a REAL backed-up-PTY-consumer + a real rc-client attach assertion, the gap W1's gate missed): (1) do NOT hold the journal lock across effect() — reserve the key + fsync PENDING under lock, RELEASE, run effect(), re-acquire to fsync DONE + mark applied (preserve crash-idempotency via the per-key reservation, not a global hold); (2) bound/fail-fast the PtyWrite itself (the W2-deferred park bound — write_input must never block indefinitely, DSR-answer must not hold the writer mutex across a blocking write); (3) drop per-keystroke fsync on the interactive path — PtyWrite effects are EPHEMERAL (a keystroke lost on a broker crash is retyped; PTY state is not reconstructed from keystroke replay), so in-memory applied-set dedup suffices (the broker survives the brain — that IS the dedup anchor), with async/batched fsync or no-fsync for EffectKind::PtyWrite while durable kinds (NetSend/NetDial/Registry/Spool) keep their fsync. Combine (1)+(3) at minimum. Add a KNOWN-HAZARDS.md entry on landing. (v0.13.0)",
2026-08-28T09:54:46.7380016Z       "requiredStages": [
2026-08-28T09:54:46.7380175Z         "impl",
2026-08-28T09:54:46.7380335Z         "unit",
2026-08-28T09:54:46.7380482Z         "int"
2026-08-28T09:54:46.7380632Z       ],
2026-08-28T09:54:46.7380795Z       "stages": {
2026-08-28T09:54:46.7380957Z         "doc": {
2026-08-28T09:54:46.7381224Z           "complete": false,
2026-08-28T09:54:46.7381486Z           "evidence": []
2026-08-28T09:54:46.7381638Z         },
2026-08-28T09:54:46.7381796Z         "impl": {
2026-08-28T09:54:46.7381958Z           "complete": true,
2026-08-28T09:54:46.7382135Z           "evidence": [
2026-08-28T09:54:46.7382287Z             {
2026-08-28T09:54:46.7382549Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.7382718Z               "line": 120
2026-08-28T09:54:46.7383001Z             },
2026-08-28T09:54:46.7383147Z             {
2026-08-28T09:54:46.7383405Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.7383570Z               "line": 415
2026-08-28T09:54:46.7383720Z             }
2026-08-28T09:54:46.7383880Z           ]
2026-08-28T09:54:46.7384029Z         },
2026-08-28T09:54:46.7384186Z         "int": {
2026-08-28T09:54:46.7384363Z           "complete": true,
2026-08-28T09:54:46.7384543Z           "evidence": [
2026-08-28T09:54:46.7384692Z             {
2026-08-28T09:54:46.7385044Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7385207Z               "line": 922
2026-08-28T09:54:46.7385359Z             }
2026-08-28T09:54:46.7385512Z           ]
2026-08-28T09:54:46.7385660Z         },
2026-08-28T09:54:46.7385815Z         "unit": {
2026-08-28T09:54:46.7385998Z           "complete": true,
2026-08-28T09:54:46.7386173Z           "evidence": [
2026-08-28T09:54:46.7386326Z             {
2026-08-28T09:54:46.7386589Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.7386759Z               "line": 822
2026-08-28T09:54:46.7386913Z             },
2026-08-28T09:54:46.7387060Z             {
2026-08-28T09:54:46.7387313Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.7387500Z               "line": 837
2026-08-28T09:54:46.7387742Z             },
2026-08-28T09:54:46.7387985Z             {
2026-08-28T09:54:46.7388250Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.7388410Z               "line": 896
2026-08-28T09:54:46.7388560Z             }
2026-08-28T09:54:46.7388707Z           ]
2026-08-28T09:54:46.7388846Z         }
2026-08-28T09:54:46.7389098Z       }
2026-08-28T09:54:46.7389237Z     },
2026-08-28T09:54:46.7389379Z     {
2026-08-28T09:54:46.7389626Z       "id": "REQ-HAZARD-ELEVATED-DAEMON-SPAWN",
2026-08-28T09:54:46.7393283Z       "title": "The daemon always runs unelevated in the invoking user's universe, regardless of which command spawns it: an elevated spawner de-elevates (Windows: UAC linked token via CreateProcessWithTokenW; Linux: drop to SUDO_UID/SUDO_GID + the invoker's HOME) — an elevated daemon's pipes deny unelevated clients (every later spt reads not-running→spawn→bind Access-denied) and a sudo'd daemon roots the user's state universe (5.7)",
2026-08-28T09:54:46.7393619Z       "requiredStages": [
2026-08-28T09:54:46.7393774Z         "doc",
2026-08-28T09:54:46.7393941Z         "impl",
2026-08-28T09:54:46.7394102Z         "unit"
2026-08-28T09:54:46.7394251Z       ],
2026-08-28T09:54:46.7394412Z       "stages": {
2026-08-28T09:54:46.7394566Z         "doc": {
2026-08-28T09:54:46.7394746Z           "complete": true,
2026-08-28T09:54:46.7394909Z           "evidence": [
2026-08-28T09:54:46.7395065Z             {
2026-08-28T09:54:46.7395285Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7395452Z               "line": 253
2026-08-28T09:54:46.7395600Z             }
2026-08-28T09:54:46.7395747Z           ]
2026-08-28T09:54:46.7395905Z         },
2026-08-28T09:54:46.7396062Z         "impl": {
2026-08-28T09:54:46.7396239Z           "complete": true,
2026-08-28T09:54:46.7396409Z           "evidence": [
2026-08-28T09:54:46.7396568Z             {
2026-08-28T09:54:46.7396825Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7396995Z               "line": 68
2026-08-28T09:54:46.7397154Z             },
2026-08-28T09:54:46.7397301Z             {
2026-08-28T09:54:46.7397553Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.7397721Z               "line": 819
2026-08-28T09:54:46.7397873Z             },
2026-08-28T09:54:46.7398021Z             {
2026-08-28T09:54:46.7398288Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7398446Z               "line": 36
2026-08-28T09:54:46.7398602Z             },
2026-08-28T09:54:46.7398759Z             {
2026-08-28T09:54:46.7399100Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7399392Z               "line": 59
2026-08-28T09:54:46.7399538Z             },
2026-08-28T09:54:46.7399702Z             {
2026-08-28T09:54:46.7399959Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7400126Z               "line": 83
2026-08-28T09:54:46.7400278Z             },
2026-08-28T09:54:46.7400435Z             {
2026-08-28T09:54:46.7400703Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7400864Z               "line": 140
2026-08-28T09:54:46.7401023Z             },
2026-08-28T09:54:46.7401174Z             {
2026-08-28T09:54:46.7401440Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7401597Z               "line": 159
2026-08-28T09:54:46.7401748Z             },
2026-08-28T09:54:46.7401905Z             {
2026-08-28T09:54:46.7402157Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7402325Z               "line": 384
2026-08-28T09:54:46.7402477Z             },
2026-08-28T09:54:46.7402630Z             {
2026-08-28T09:54:46.7402893Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7403064Z               "line": 535
2026-08-28T09:54:46.7403208Z             },
2026-08-28T09:54:46.7403359Z             {
2026-08-28T09:54:46.7403617Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7403775Z               "line": 581
2026-08-28T09:54:46.7403932Z             },
2026-08-28T09:54:46.7404078Z             {
2026-08-28T09:54:46.7404315Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.7404472Z               "line": 300
2026-08-28T09:54:46.7404629Z             },
2026-08-28T09:54:46.7404777Z             {
2026-08-28T09:54:46.7404987Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:46.7405154Z               "line": 175
2026-08-28T09:54:46.7405301Z             }
2026-08-28T09:54:46.7405455Z           ]
2026-08-28T09:54:46.7405607Z         },
2026-08-28T09:54:46.7405766Z         "int": {
2026-08-28T09:54:46.7405945Z           "complete": false,
2026-08-28T09:54:46.7406546Z           "evidence": []
2026-08-28T09:54:46.7406695Z         },
2026-08-28T09:54:46.7406846Z         "unit": {
2026-08-28T09:54:46.7407022Z           "complete": true,
2026-08-28T09:54:46.7407189Z           "evidence": [
2026-08-28T09:54:46.7407347Z             {
2026-08-28T09:54:46.7407618Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7407785Z               "line": 813
2026-08-28T09:54:46.7407928Z             },
2026-08-28T09:54:46.7408081Z             {
2026-08-28T09:54:46.7408348Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7408519Z               "line": 854
2026-08-28T09:54:46.7408673Z             },
2026-08-28T09:54:46.7408820Z             {
2026-08-28T09:54:46.7409167Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.7409333Z               "line": 928
2026-08-28T09:54:46.7409507Z             }
2026-08-28T09:54:46.7409652Z           ]
2026-08-28T09:54:46.7409807Z         }
2026-08-28T09:54:46.7409962Z       }
2026-08-28T09:54:46.7410113Z     },
2026-08-28T09:54:46.7410262Z     {
2026-08-28T09:54:46.7410539Z       "id": "REQ-HAZARD-EMPOWER-SESSION-RESURRECT",
2026-08-28T09:54:46.7441384Z       "title": "AUTHORITY MUST NOT SURVIVE AT REST ACROSS A SESSION-ID ROTATION. An engine-room empowerment is session-state (ADR-0052: empowerment is session-state, not stored grants; nothing to revoke at rest), keyed on the session id the engine room's perch is bound to and filed under that session's scratch directory. 'spt api boundary' rotates exactly that bound session id, and it is NEITHER of the two revocation edges ADR-0052 names (controller detach, local take), so before this requirement a rotation left the empowerment record filed under the OLD session id, unreachable by the seat and unswept by anything. MEASURED, not inferred (todlando red probe, 2026-08-03): rotate to a session, empower, rotate away, DROP the authority at the new session, then rotate BACK onto the old id — the seat holds the subnet again with no admin code proved since the drop. THE SCOPE IS AUTHORITY OUTLIVING ITS SESSION, NOT A STRANGER GAINING AUTHORITY: 'api boundary' is auth-gated to the perch's own harness, so the actor re-acquiring is the actor that held the grant, and this must not be re-told as privilege escalation. The empower module's own comment asserted the opposite — that a stale file is 'unreachable by construction' and that 'if this sweep never ran, no caller would gain a single grant' — which is a claim about the resolver's INPUTS and is false while an arbitrary '--to-session-id' is accepted past a guard that only refuses psyche-custody squats. THE FIX IS A MOVE, NEVER A COPY (doyle ruling): a boundary CARRIES the empowerment to the new session id, and when the boundary returns the old session's record is GONE — two records for one grant is the same leak wearing a different hat. IT FAILS CLOSED: if the move cannot be completed the boundary DROPS the empowerment with a loud diagnostic and never leaves the old record standing as a fallback. THIS REQUIREMENT CLOSES THE BOUNDARY EDGE ONLY AND MUST NOT BE READ AS CLOSING THE RESURRECTION CLASS: two further mechanisms rotate a bound session id and leave the prior session's record standing -- the dead-owner re-pin (api/auth.rs) and an establish_perch re-bind -- and their polarity is the OPPOSITE, because a boundary is ONE session lineage continuing while those are a NEW session taking over a perch whose prior owner is gone, so the authority does not follow, it DROPS. They are filed as releases#138 and are not evidence for or against this requirement. Gate additions ruled with the fix: the carry is GATED on the endpoint that can hold an empowerment, because the record is keyed by SESSION ID ALONE and an ungated carry would let an unrelated endpoint's boundary move the seat's live grant out from under it -- so one row proves the gate is not too tight and a SECOND proves it is not too loose; and the fail-closed arm is proved by INJECTING a removal failure and asserting the old record still grants nothing, since an arm no mutation can fail is untested. THE HYGIENE SWEEP IS NOT THE MECHANISM AND MUST NOT BE WIDENED INTO ONE — it is documented hygiene-only, it runs at grant time, and a re-acquire happening long afterwards is past it either way; the boundary's own move is the only thing that closes this. Gate: impl — the carry-as-move at the boundary rotation with its fail-closed drop and diagnostic; unit — the probe above, whose DISCRIMINATING construction is dropping the authority at the new session BEFORE rotating back (without that, a plain rotate-away/rotate-back cannot separate resurrection from the ruled carry, under which the grant legitimately follows the rotation), plus the assertion that the old session's record is absent the moment the rotation returns, so the two versions are distinguishable at the mechanism and not merely at the outcome.",
2026-08-28T09:54:46.7441933Z       "requiredStages": [
2026-08-28T09:54:46.7442098Z         "doc",
2026-08-28T09:54:46.7442253Z         "impl",
2026-08-28T09:54:46.7442409Z         "unit"
2026-08-28T09:54:46.7442562Z       ],
2026-08-28T09:54:46.7442728Z       "stages": {
2026-08-28T09:54:46.7442877Z         "doc": {
2026-08-28T09:54:46.7443057Z           "complete": true,
2026-08-28T09:54:46.7443221Z           "evidence": [
2026-08-28T09:54:46.7443382Z             {
2026-08-28T09:54:46.7443601Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7443766Z               "line": 970
2026-08-28T09:54:46.7443927Z             },
2026-08-28T09:54:46.7444078Z             {
2026-08-28T09:54:46.7444298Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7444466Z               "line": 1062
2026-08-28T09:54:46.7444618Z             },
2026-08-28T09:54:46.7444776Z             {
2026-08-28T09:54:46.7445115Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:46.7445285Z               "line": 241
2026-08-28T09:54:46.7445435Z             }
2026-08-28T09:54:46.7445671Z           ]
2026-08-28T09:54:46.7445820Z         },
2026-08-28T09:54:46.7445981Z         "impl": {
2026-08-28T09:54:46.7446154Z           "complete": true,
2026-08-28T09:54:46.7446328Z           "evidence": [
2026-08-28T09:54:46.7446490Z             {
2026-08-28T09:54:46.7446741Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7446926Z               "line": 211
2026-08-28T09:54:46.7447171Z             },
2026-08-28T09:54:46.7447395Z             {
2026-08-28T09:54:46.7447638Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7447809Z               "line": 222
2026-08-28T09:54:46.7447957Z             },
2026-08-28T09:54:46.7448110Z             {
2026-08-28T09:54:46.7448354Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7448515Z               "line": 259
2026-08-28T09:54:46.7448674Z             },
2026-08-28T09:54:46.7448825Z             {
2026-08-28T09:54:46.7449167Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7449339Z               "line": 268
2026-08-28T09:54:46.7449496Z             },
2026-08-28T09:54:46.7449645Z             {
2026-08-28T09:54:46.7449888Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7450055Z               "line": 275
2026-08-28T09:54:46.7450202Z             },
2026-08-28T09:54:46.7450364Z             {
2026-08-28T09:54:46.7450599Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.7450764Z               "line": 119
2026-08-28T09:54:46.7450909Z             }
2026-08-28T09:54:46.7451065Z           ]
2026-08-28T09:54:46.7451214Z         },
2026-08-28T09:54:46.7451374Z         "int": {
2026-08-28T09:54:46.7451550Z           "complete": false,
2026-08-28T09:54:46.7451715Z           "evidence": []
2026-08-28T09:54:46.7451868Z         },
2026-08-28T09:54:46.7452020Z         "unit": {
2026-08-28T09:54:46.7452197Z           "complete": true,
2026-08-28T09:54:46.7452368Z           "evidence": [
2026-08-28T09:54:46.7452535Z             {
2026-08-28T09:54:46.7452936Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7453113Z               "line": 463
2026-08-28T09:54:46.7453274Z             },
2026-08-28T09:54:46.7453423Z             {
2026-08-28T09:54:46.7453670Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7453823Z               "line": 493
2026-08-28T09:54:46.7453975Z             },
2026-08-28T09:54:46.7454119Z             {
2026-08-28T09:54:46.7454365Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:46.7454529Z               "line": 553
2026-08-28T09:54:46.7454682Z             },
2026-08-28T09:54:46.7454835Z             {
2026-08-28T09:54:46.7455078Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.7455249Z               "line": 2002
2026-08-28T09:54:46.7455393Z             },
2026-08-28T09:54:46.7455550Z             {
2026-08-28T09:54:46.7455793Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.7455965Z               "line": 2053
2026-08-28T09:54:46.7456127Z             }
2026-08-28T09:54:46.7456275Z           ]
2026-08-28T09:54:46.7456432Z         }
2026-08-28T09:54:46.7456590Z       }
2026-08-28T09:54:46.7456737Z     },
2026-08-28T09:54:46.7456888Z     {
2026-08-28T09:54:46.7457111Z       "id": "REQ-HAZARD-ENDPOINT-LIFECYCLE",
2026-08-28T09:54:46.7463181Z       "title": "REGISTRY-LIFECYCLE W2 (KNOWN-HAZARDS 7.45 — the umbrella conformance seam for ADR-0041): endpoint lifecycle state converges to truth from EVERY death path. Regression matrix from the three hertz reports + operator field: dead-PID hybrid row does not survive reconcile; raw viewport close frees the controller (full chain, broker restart included — shared with REQ-STREAM-LEASE-CLASSES int); definitive death means offline+suspended atomically and the next reconcile emits no WAKE_RESUME; explicit Wake still launches exactly once; poll-vs-reap interleave converges to cleared stamps. HEAVY nextest group at birth for any leg spawning a daemon tree. Gate: int — the matrix; doc — KNOWN-HAZARDS 7.45.",
2026-08-28T09:54:46.7463492Z       "requiredStages": [
2026-08-28T09:54:46.7463644Z         "doc",
2026-08-28T09:54:46.7463801Z         "int"
2026-08-28T09:54:46.7463949Z       ],
2026-08-28T09:54:46.7464115Z       "stages": {
2026-08-28T09:54:46.7464264Z         "doc": {
2026-08-28T09:54:46.7464444Z           "complete": true,
2026-08-28T09:54:46.7464627Z           "evidence": [
2026-08-28T09:54:46.7464778Z             {
2026-08-28T09:54:46.7464997Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7465156Z               "line": 784
2026-08-28T09:54:46.7465314Z             }
2026-08-28T09:54:46.7465461Z           ]
2026-08-28T09:54:46.7465606Z         },
2026-08-28T09:54:46.7465752Z         "impl": {
2026-08-28T09:54:46.7465930Z           "complete": false,
2026-08-28T09:54:46.7466110Z           "evidence": []
2026-08-28T09:54:46.7466264Z         },
2026-08-28T09:54:46.7466420Z         "int": {
2026-08-28T09:54:46.7466593Z           "complete": true,
2026-08-28T09:54:46.7466768Z           "evidence": [
2026-08-28T09:54:46.7466917Z             {
2026-08-28T09:54:46.7467260Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.7467420Z               "line": 169
2026-08-28T09:54:46.7467577Z             },
2026-08-28T09:54:46.7467727Z             {
2026-08-28T09:54:46.7468052Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.7468220Z               "line": 269
2026-08-28T09:54:46.7468371Z             },
2026-08-28T09:54:46.7468520Z             {
2026-08-28T09:54:46.7469034Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.7469211Z               "line": 556
2026-08-28T09:54:46.7469344Z             },
2026-08-28T09:54:46.7469507Z             {
2026-08-28T09:54:46.7469831Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.7469998Z               "line": 709
2026-08-28T09:54:46.7470155Z             },
2026-08-28T09:54:46.7470421Z             {
2026-08-28T09:54:46.7470751Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:46.7470916Z               "line": 827
2026-08-28T09:54:46.7471070Z             },
2026-08-28T09:54:46.7471222Z             {
2026-08-28T09:54:46.7471504Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:46.7471671Z               "line": 330
2026-08-28T09:54:46.7471818Z             }
2026-08-28T09:54:46.7471972Z           ]
2026-08-28T09:54:46.7472123Z         },
2026-08-28T09:54:46.7472281Z         "unit": {
2026-08-28T09:54:46.7472452Z           "complete": false,
2026-08-28T09:54:46.7472618Z           "evidence": []
2026-08-28T09:54:46.7472778Z         }
2026-08-28T09:54:46.7472926Z       }
2026-08-28T09:54:46.7473075Z     },
2026-08-28T09:54:46.7473216Z     {
2026-08-28T09:54:46.7473493Z       "id": "REQ-HAZARD-ENDPOINT-RUN-ATTACH-OUTPUT",
2026-08-28T09:54:46.7487583Z       "title": "A clean `spt rc` attach to a LIVE spt-hosted (`endpoint run`) harness must DELIVER the harness's PTY output. KEYSTONE — the operator's central 'attach shows no output' symptom, reproduced on the real dummy-harness fixture (v0.12.1 Wave 1) with NO death and NO wedge: bringup succeeds (online, harness pid alive + heartbeating, psyche hosted), the attach CONNECTS (PUMP_IPC_READER spawned, no RC_FAIL, holds the full window) — but receives EXACTLY 0 bytes over 10s of the harness's flushed [session.self] stdout. DISTINCT from REQ-HAZARD-VIEWER-CLOSE-DETACH (death) and REQ-HAZARD-ATTACH-WEDGE (dead-child backpressure): here the harness is ALIVE and the attach is a clean first subscribe. This BLOCKS the 'view is independent' invariant — re-attach is meaningless if a live endpoint-run harness shows nothing. KNOWN-GOOD (rules out 'no drain'): attach.rs `local_attach_via_loopback_conn_rides_the_same_pump` + `broker_spawns_the_pty_child_in_the_requested_cwd` prove the broker DOES drain+fan a `spawn_session` PTY child to a loopback attach over the SAME transport rc uses. Both spawn_session and endpoint-run's spawn_session_pid send KIND_SPAWN → the same dispatch_spawn (broker.rs:706/835) which starts the per-session drain+OutputLog — so the gap is NARROWER than 'no drain', endpoint-run-specific. Root candidates: (a) spawn_session_pid's SpawnReq stdio/env/cwd differs so the dummy's stdout isn't the captured ConPTY; (b) the harness stdout WRITE BLOCKS because the ConPTY buffer fills (drain not reading THIS pty) — explains alive-but-0-bytes; (c) ConPTY reader-park (KH 7.6) on this path; (d) `spt rc` resolve_session/subscribe for an endpoint-run session subscribes to the wrong/empty log. (v0.12.1)",
2026-08-28T09:54:46.7487912Z       "requiredStages": [
2026-08-28T09:54:46.7488075Z         "impl",
2026-08-28T09:54:46.7488227Z         "unit",
2026-08-28T09:54:46.7488376Z         "int"
2026-08-28T09:54:46.7488531Z       ],
2026-08-28T09:54:46.7488693Z       "stages": {
2026-08-28T09:54:46.7488848Z         "doc": {
2026-08-28T09:54:46.7489110Z           "complete": false,
2026-08-28T09:54:46.7489278Z           "evidence": []
2026-08-28T09:54:46.7489434Z         },
2026-08-28T09:54:46.7489583Z         "impl": {
2026-08-28T09:54:46.7489759Z           "complete": true,
2026-08-28T09:54:46.7489927Z           "evidence": [
2026-08-28T09:54:46.7490078Z             {
2026-08-28T09:54:46.7490336Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.7490508Z               "line": 445
2026-08-28T09:54:46.7490660Z             }
2026-08-28T09:54:46.7490808Z           ]
2026-08-28T09:54:46.7490965Z         },
2026-08-28T09:54:46.7491118Z         "int": {
2026-08-28T09:54:46.7491299Z           "complete": true,
2026-08-28T09:54:46.7491465Z           "evidence": [
2026-08-28T09:54:46.7491623Z             {
2026-08-28T09:54:46.7491900Z               "path": "crates/spt/tests/dummy_harness_e2e.rs",
2026-08-28T09:54:46.7492070Z               "line": 307
2026-08-28T09:54:46.7492228Z             }
2026-08-28T09:54:46.7492385Z           ]
2026-08-28T09:54:46.7492543Z         },
2026-08-28T09:54:46.7492820Z         "unit": {
2026-08-28T09:54:46.7493010Z           "complete": true,
2026-08-28T09:54:46.7493172Z           "evidence": [
2026-08-28T09:54:46.7493334Z             {
2026-08-28T09:54:46.7493596Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.7493763Z               "line": 503
2026-08-28T09:54:46.7493918Z             }
2026-08-28T09:54:46.7494070Z           ]
2026-08-28T09:54:46.7494218Z         }
2026-08-28T09:54:46.7494370Z       }
2026-08-28T09:54:46.7494518Z     },
2026-08-28T09:54:46.7494666Z     {
2026-08-28T09:54:46.7494866Z       "id": "REQ-HAZARD-ENV-SUBST",
2026-08-28T09:54:46.7504118Z       "title": "`spt endpoint run` HONORS manifest [env.<VAR>] direction=inject values (with {key} substitution) on the spt-hosted spawn. Today only the [session.self] command ARGV is {id}-substituted; the [env] inject value is NEITHER substituted NOR applied — manifest.schema.json promises EnvVar.value = 'Value to inject (with substitution)' but prepare_harness_spawn fills only argv and SpawnReq carries no env, so a [env.SPT_ENDPOINT_ID].value='{id}' arrives EMPTY. A FLAGLESS harness (bare `claude`, no argv slot for {id}) then routes the id via [env] → empty → SessionStart sees empty $SPT_ENDPOINT_ID → seeds-by-PPID instead of binding → ZERO perch → NO_PERCH (the actual wall-b bind blocker; perri hard-repro'd). SILENT failure (empty inject, no error). FIX (doyle ruled a): fill every [env] inject value from the SAME {key} catalog as argv/role (mirror F-009 TEMPLATE fill, whole-string fill_template for an env value), thread it through SpawnReq.env → the broker sets it on the spawned PTY child. Correctness fix — schema already promises it, NO manifest change, NO new binary. PAIRS with REQ-SEND-SPT-HOSTED to make endpoint run fully work. doyle F-013. (post-v0.10.0)",
2026-08-28T09:54:46.7504337Z       "requiredStages": [
2026-08-28T09:54:46.7504497Z         "impl",
2026-08-28T09:54:46.7504763Z         "unit",
2026-08-28T09:54:46.7504921Z         "int"
2026-08-28T09:54:46.7505078Z       ],
2026-08-28T09:54:46.7505236Z       "stages": {
2026-08-28T09:54:46.7505393Z         "doc": {
2026-08-28T09:54:46.7505750Z           "complete": false,
2026-08-28T09:54:46.7505914Z           "evidence": []
2026-08-28T09:54:46.7506061Z         },
2026-08-28T09:54:46.7506209Z         "impl": {
2026-08-28T09:54:46.7506370Z           "complete": true,
2026-08-28T09:54:46.7506534Z           "evidence": [
2026-08-28T09:54:46.7506690Z             {
2026-08-28T09:54:46.7506962Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:46.7507127Z               "line": 160
2026-08-28T09:54:46.7507279Z             },
2026-08-28T09:54:46.7507435Z             {
2026-08-28T09:54:46.7507655Z               "path": "crates/spt-term/src/pty.rs",
2026-08-28T09:54:46.7507822Z               "line": 134
2026-08-28T09:54:46.7507979Z             }
2026-08-28T09:54:46.7508122Z           ]
2026-08-28T09:54:46.7508280Z         },
2026-08-28T09:54:46.7508432Z         "int": {
2026-08-28T09:54:46.7508608Z           "complete": true,
2026-08-28T09:54:46.7508766Z           "evidence": [
2026-08-28T09:54:46.7508923Z             {
2026-08-28T09:54:46.7509275Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7509439Z               "line": 322
2026-08-28T09:54:46.7509594Z             },
2026-08-28T09:54:46.7509742Z             {
2026-08-28T09:54:46.7509997Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7510155Z               "line": 543
2026-08-28T09:54:46.7510302Z             }
2026-08-28T09:54:46.7510442Z           ]
2026-08-28T09:54:46.7510592Z         },
2026-08-28T09:54:46.7510747Z         "unit": {
2026-08-28T09:54:46.7510907Z           "complete": true,
2026-08-28T09:54:46.7511076Z           "evidence": [
2026-08-28T09:54:46.7511227Z             {
2026-08-28T09:54:46.7511504Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:46.7511667Z               "line": 588
2026-08-28T09:54:46.7511828Z             }
2026-08-28T09:54:46.7512100Z           ]
2026-08-28T09:54:46.7512258Z         }
2026-08-28T09:54:46.7512410Z       }
2026-08-28T09:54:46.7512552Z     },
2026-08-28T09:54:46.7512700Z     {
2026-08-28T09:54:46.7512952Z       "id": "REQ-HAZARD-ENVELOPE-ATTR-LINESAFE",
2026-08-28T09:54:46.7522251Z       "title": "Envelope ATTR-linesafety (4.1): attribute values are line-safe because the escaper MAKES them so, not \"by construction\" — `event_attr_escape` folds CRLF/lone-CR to `\n` and then encodes `\n` as the `&#10;` entity, so no attribute value can split the line-framed EVENT. The falsifier is the composed trust-warning (releases#170), a multi-line block that rides as a `trust-warning` ATTRIBUTE: under the old escaper one delivery rendered as SEVEN lines under the default advisory (measured at the red, 2026-08-21), six of which are not envelopes. The count varies with the operator override, which is why the invariant is stated as \"no attribute value can split the frame\" and not as a number. Decode is amp-last-preserving: `&#10;` decodes BEFORE `&amp;`, exactly as `<br>` does on the body side, so an attribute carrying the literal text `&#10;` (arriving as `&amp;#10;`) decodes to the literal and never to a linebreak. Corollary held by the same commit: the codec has ONE escaper and therefore ONE decoder — `parse_event_from_attr` calls `event_attr_unescape` rather than hand-inlining a second rule that would make `from=` decode differently from every other attribute.",
2026-08-28T09:54:46.7522469Z       "requiredStages": [
2026-08-28T09:54:46.7522623Z         "impl",
2026-08-28T09:54:46.7522784Z         "unit",
2026-08-28T09:54:46.7522938Z         "doc"
2026-08-28T09:54:46.7523083Z       ],
2026-08-28T09:54:46.7523251Z       "stages": {
2026-08-28T09:54:46.7523402Z         "doc": {
2026-08-28T09:54:46.7523575Z           "complete": true,
2026-08-28T09:54:46.7523736Z           "evidence": [
2026-08-28T09:54:46.7523900Z             {
2026-08-28T09:54:46.7524300Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:46.7524472Z               "line": 150
2026-08-28T09:54:46.7524624Z             },
2026-08-28T09:54:46.7524777Z             {
2026-08-28T09:54:46.7525024Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:46.7525187Z               "line": 71
2026-08-28T09:54:46.7525342Z             }
2026-08-28T09:54:46.7525495Z           ]
2026-08-28T09:54:46.7525650Z         },
2026-08-28T09:54:46.7525803Z         "impl": {
2026-08-28T09:54:46.7525984Z           "complete": true,
2026-08-28T09:54:46.7526156Z           "evidence": [
2026-08-28T09:54:46.7526308Z             {
2026-08-28T09:54:46.7526570Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7526734Z               "line": 83
2026-08-28T09:54:46.7526894Z             },
2026-08-28T09:54:46.7527043Z             {
2026-08-28T09:54:46.7527300Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7527467Z               "line": 110
2026-08-28T09:54:46.7527625Z             }
2026-08-28T09:54:46.7527781Z           ]
2026-08-28T09:54:46.7527925Z         },
2026-08-28T09:54:46.7528082Z         "int": {
2026-08-28T09:54:46.7528257Z           "complete": false,
2026-08-28T09:54:46.7528423Z           "evidence": []
2026-08-28T09:54:46.7528574Z         },
2026-08-28T09:54:46.7528733Z         "unit": {
2026-08-28T09:54:46.7528908Z           "complete": true,
2026-08-28T09:54:46.7529156Z           "evidence": [
2026-08-28T09:54:46.7529314Z             {
2026-08-28T09:54:46.7529533Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:46.7529700Z               "line": 528
2026-08-28T09:54:46.7529847Z             },
2026-08-28T09:54:46.7530005Z             {
2026-08-28T09:54:46.7530259Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7530425Z               "line": 237
2026-08-28T09:54:46.7530583Z             }
2026-08-28T09:54:46.7530729Z           ]
2026-08-28T09:54:46.7530891Z         }
2026-08-28T09:54:46.7531041Z       }
2026-08-28T09:54:46.7531328Z     },
2026-08-28T09:54:46.7531475Z     {
2026-08-28T09:54:46.7531718Z       "id": "REQ-HAZARD-ENVELOPE-CR-LINESAFE",
2026-08-28T09:54:46.7536510Z       "title": "Envelope CR-linesafety (4.1): the line-framed EVENT codec must neutralize raw carriage returns — `event_body_escape` folds CRLF/lone-CR to the codec's representable linebreak (`\\n`→`<br>`) BEFORE framing, so a body carrying `\\r` (Windows `echo`/CRLF text crossing nodes) cannot survive into the single-line envelope and trigger a receiver terminal CR→col0 overwrite that corrupts the frame. Robustness on unrepresentable input, NOT a wire-format change (decoder untouched, amp-last invariant held). Belt-and-suspenders: `spt send`/`ring` also trim stdin (parity with `notify`).",
2026-08-28T09:54:46.7536697Z       "requiredStages": [
2026-08-28T09:54:46.7536863Z         "impl",
2026-08-28T09:54:46.7537012Z         "unit",
2026-08-28T09:54:46.7537168Z         "doc"
2026-08-28T09:54:46.7537322Z       ],
2026-08-28T09:54:46.7537492Z       "stages": {
2026-08-28T09:54:46.7537656Z         "doc": {
2026-08-28T09:54:46.7537827Z           "complete": true,
2026-08-28T09:54:46.7537999Z           "evidence": [
2026-08-28T09:54:46.7538151Z             {
2026-08-28T09:54:46.7538399Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:46.7538553Z               "line": 82
2026-08-28T09:54:46.7538708Z             }
2026-08-28T09:54:46.7538860Z           ]
2026-08-28T09:54:46.7539149Z         },
2026-08-28T09:54:46.7539312Z         "impl": {
2026-08-28T09:54:46.7539488Z           "complete": true,
2026-08-28T09:54:46.7539655Z           "evidence": [
2026-08-28T09:54:46.7539875Z             {
2026-08-28T09:54:46.7540132Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7540279Z               "line": 37
2026-08-28T09:54:46.7540437Z             },
2026-08-28T09:54:46.7540589Z             {
2026-08-28T09:54:46.7540843Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7541115Z               "line": 85
2026-08-28T09:54:46.7541270Z             }
2026-08-28T09:54:46.7541417Z           ]
2026-08-28T09:54:46.7541568Z         },
2026-08-28T09:54:46.7541735Z         "int": {
2026-08-28T09:54:46.7541906Z           "complete": false,
2026-08-28T09:54:46.7542079Z           "evidence": []
2026-08-28T09:54:46.7542221Z         },
2026-08-28T09:54:46.7542379Z         "unit": {
2026-08-28T09:54:46.7542550Z           "complete": true,
2026-08-28T09:54:46.7542713Z           "evidence": [
2026-08-28T09:54:46.7542879Z             {
2026-08-28T09:54:46.7543146Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7543323Z               "line": 222
2026-08-28T09:54:46.7543475Z             },
2026-08-28T09:54:46.7543629Z             {
2026-08-28T09:54:46.7543881Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7544048Z               "line": 238
2026-08-28T09:54:46.7544208Z             }
2026-08-28T09:54:46.7544362Z           ]
2026-08-28T09:54:46.7544518Z         }
2026-08-28T09:54:46.7544667Z       }
2026-08-28T09:54:46.7544819Z     },
2026-08-28T09:54:46.7544963Z     {
2026-08-28T09:54:46.7545210Z       "id": "REQ-HAZARD-ENVELOPE-DECODE-ORDER",
2026-08-28T09:54:46.7545588Z       "title": "Envelope decode order, ampersand decoded last (4.1)",
2026-08-28T09:54:46.7545773Z       "requiredStages": [
2026-08-28T09:54:46.7545931Z         "impl",
2026-08-28T09:54:46.7546087Z         "unit",
2026-08-28T09:54:46.7546255Z         "doc"
2026-08-28T09:54:46.7546406Z       ],
2026-08-28T09:54:46.7546563Z       "stages": {
2026-08-28T09:54:46.7546709Z         "doc": {
2026-08-28T09:54:46.7546885Z           "complete": true,
2026-08-28T09:54:46.7547047Z           "evidence": [
2026-08-28T09:54:46.7547209Z             {
2026-08-28T09:54:46.7547447Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:46.7547605Z               "line": 89
2026-08-28T09:54:46.7547762Z             }
2026-08-28T09:54:46.7547911Z           ]
2026-08-28T09:54:46.7548067Z         },
2026-08-28T09:54:46.7548339Z         "impl": {
2026-08-28T09:54:46.7548522Z           "complete": true,
2026-08-28T09:54:46.7548687Z           "evidence": [
2026-08-28T09:54:46.7548841Z             {
2026-08-28T09:54:46.7549194Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7549349Z               "line": 55
2026-08-28T09:54:46.7549501Z             },
2026-08-28T09:54:46.7549652Z             {
2026-08-28T09:54:46.7549905Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7550062Z               "line": 84
2026-08-28T09:54:46.7550220Z             },
2026-08-28T09:54:46.7550368Z             {
2026-08-28T09:54:46.7550615Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7550783Z               "line": 111
2026-08-28T09:54:46.7550934Z             },
2026-08-28T09:54:46.7551083Z             {
2026-08-28T09:54:46.7551331Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7551497Z               "line": 123
2026-08-28T09:54:46.7551646Z             }
2026-08-28T09:54:46.7551802Z           ]
2026-08-28T09:54:46.7551949Z         },
2026-08-28T09:54:46.7552105Z         "int": {
2026-08-28T09:54:46.7552286Z           "complete": false,
2026-08-28T09:54:46.7552452Z           "evidence": []
2026-08-28T09:54:46.7552605Z         },
2026-08-28T09:54:46.7552753Z         "unit": {
2026-08-28T09:54:46.7552929Z           "complete": true,
2026-08-28T09:54:46.7553096Z           "evidence": [
2026-08-28T09:54:46.7553254Z             {
2026-08-28T09:54:46.7553492Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7553650Z               "line": 197
2026-08-28T09:54:46.7553811Z             },
2026-08-28T09:54:46.7553960Z             {
2026-08-28T09:54:46.7554242Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7554402Z               "line": 214
2026-08-28T09:54:46.7554566Z             },
2026-08-28T09:54:46.7554821Z             {
2026-08-28T09:54:46.7555074Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7555246Z               "line": 259
2026-08-28T09:54:46.7555393Z             },
2026-08-28T09:54:46.7555546Z             {
2026-08-28T09:54:46.7555785Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7555947Z               "line": 270
2026-08-28T09:54:46.7556094Z             },
2026-08-28T09:54:46.7556247Z             {
2026-08-28T09:54:46.7556496Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7556671Z               "line": 285
2026-08-28T09:54:46.7556830Z             }
2026-08-28T09:54:46.7556980Z           ]
2026-08-28T09:54:46.7557137Z         }
2026-08-28T09:54:46.7557283Z       }
2026-08-28T09:54:46.7557445Z     },
2026-08-28T09:54:46.7557598Z     {
2026-08-28T09:54:46.7557837Z       "id": "REQ-HAZARD-ENVELOPE-PARSER-SAFE",
2026-08-28T09:54:46.7558275Z       "title": "Two-slice envelope parser is panic-free and tolerant (4.2)",
2026-08-28T09:54:46.7558466Z       "requiredStages": [
2026-08-28T09:54:46.7562235Z         "impl",
2026-08-28T09:54:46.7562443Z         "unit"
2026-08-28T09:54:46.7562600Z       ],
2026-08-28T09:54:46.7562764Z       "stages": {
2026-08-28T09:54:46.7562918Z         "doc": {
2026-08-28T09:54:46.7563103Z           "complete": false,
2026-08-28T09:54:46.7563270Z           "evidence": []
2026-08-28T09:54:46.7563422Z         },
2026-08-28T09:54:46.7563585Z         "impl": {
2026-08-28T09:54:46.7563756Z           "complete": true,
2026-08-28T09:54:46.7563932Z           "evidence": [
2026-08-28T09:54:46.7564080Z             {
2026-08-28T09:54:46.7564352Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7564516Z               "line": 161
2026-08-28T09:54:46.7564671Z             }
2026-08-28T09:54:46.7564821Z           ]
2026-08-28T09:54:46.7564972Z         },
2026-08-28T09:54:46.7565126Z         "int": {
2026-08-28T09:54:46.7565300Z           "complete": false,
2026-08-28T09:54:46.7565487Z           "evidence": []
2026-08-28T09:54:46.7565634Z         },
2026-08-28T09:54:46.7565939Z         "unit": {
2026-08-28T09:54:46.7566116Z           "complete": true,
2026-08-28T09:54:46.7566287Z           "evidence": [
2026-08-28T09:54:46.7566436Z             {
2026-08-28T09:54:46.7566713Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7566879Z               "line": 301
2026-08-28T09:54:46.7567032Z             },
2026-08-28T09:54:46.7567183Z             {
2026-08-28T09:54:46.7567442Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7567616Z               "line": 310
2026-08-28T09:54:46.7567763Z             },
2026-08-28T09:54:46.7567919Z             {
2026-08-28T09:54:46.7568186Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7568344Z               "line": 318
2026-08-28T09:54:46.7568501Z             },
2026-08-28T09:54:46.7568654Z             {
2026-08-28T09:54:46.7568911Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7569164Z               "line": 328
2026-08-28T09:54:46.7569322Z             },
2026-08-28T09:54:46.7569469Z             {
2026-08-28T09:54:46.7569726Z               "path": "crates/spt-proto/src/envelope.rs",
2026-08-28T09:54:46.7569890Z               "line": 338
2026-08-28T09:54:46.7570036Z             }
2026-08-28T09:54:46.7570190Z           ]
2026-08-28T09:54:46.7570337Z         }
2026-08-28T09:54:46.7570483Z       }
2026-08-28T09:54:46.7570631Z     },
2026-08-28T09:54:46.7570786Z     {
2026-08-28T09:54:46.7571006Z       "id": "REQ-HAZARD-EPHEMERAL-CLEANUP",
2026-08-28T09:54:46.7571401Z       "title": "Ephemeral perch cleanup on every ring exit path (3.1)",
2026-08-28T09:54:46.7571588Z       "requiredStages": [
2026-08-28T09:54:46.7571739Z         "impl",
2026-08-28T09:54:46.7571898Z         "unit"
2026-08-28T09:54:46.7572045Z       ],
2026-08-28T09:54:46.7572208Z       "stages": {
2026-08-28T09:54:46.7572355Z         "doc": {
2026-08-28T09:54:46.7572641Z           "complete": false,
2026-08-28T09:54:46.7572809Z           "evidence": []
2026-08-28T09:54:46.7572969Z         },
2026-08-28T09:54:46.7573131Z         "impl": {
2026-08-28T09:54:46.7573305Z           "complete": true,
2026-08-28T09:54:46.7573478Z           "evidence": [
2026-08-28T09:54:46.7573629Z             {
2026-08-28T09:54:46.7573859Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.7574016Z               "line": 19
2026-08-28T09:54:46.7574178Z             },
2026-08-28T09:54:46.7574321Z             {
2026-08-28T09:54:46.7574551Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.7574718Z               "line": 178
2026-08-28T09:54:46.7574870Z             }
2026-08-28T09:54:46.7575028Z           ]
2026-08-28T09:54:46.7575174Z         },
2026-08-28T09:54:46.7575338Z         "int": {
2026-08-28T09:54:46.7575513Z           "complete": false,
2026-08-28T09:54:46.7575681Z           "evidence": []
2026-08-28T09:54:46.7575827Z         },
2026-08-28T09:54:46.7575994Z         "unit": {
2026-08-28T09:54:46.7576170Z           "complete": true,
2026-08-28T09:54:46.7576338Z           "evidence": [
2026-08-28T09:54:46.7576494Z             {
2026-08-28T09:54:46.7576714Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.7576876Z               "line": 392
2026-08-28T09:54:46.7577024Z             },
2026-08-28T09:54:46.7577181Z             {
2026-08-28T09:54:46.7577405Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.7577578Z               "line": 491
2026-08-28T09:54:46.7577734Z             },
2026-08-28T09:54:46.7577888Z             {
2026-08-28T09:54:46.7578110Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.7578272Z               "line": 529
2026-08-28T09:54:46.7578432Z             }
2026-08-28T09:54:46.7578580Z           ]
2026-08-28T09:54:46.7578732Z         }
2026-08-28T09:54:46.7578880Z       }
2026-08-28T09:54:46.7579108Z     },
2026-08-28T09:54:46.7579262Z     {
2026-08-28T09:54:46.7579467Z       "id": "REQ-HAZARD-EPOCH-RESET",
2026-08-28T09:54:46.7583235Z       "title": "Advertisement-epoch reset strands a node: peers' higher last-seen epoch drops the reset node's fresh advertisements as Stale until the counter outruns history. Common case (full reinstall/re-pair) is mitigated by REQ-SUBNET-7's ceremony eviction (peer-side epoch memory dies with the deleted row — acceptance-verified); the residual narrow slice (epoch file lost, identity kept) is documented, guard deferred to a field hit (4.11)",
2026-08-28T09:54:46.7583539Z       "requiredStages": [],
2026-08-28T09:54:46.7583701Z       "stages": {
2026-08-28T09:54:46.7583856Z         "doc": {
2026-08-28T09:54:46.7584038Z           "complete": true,
2026-08-28T09:54:46.7584204Z           "evidence": [
2026-08-28T09:54:46.7584353Z             {
2026-08-28T09:54:46.7584567Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7584724Z               "line": 203
2026-08-28T09:54:46.7584881Z             }
2026-08-28T09:54:46.7585025Z           ]
2026-08-28T09:54:46.7585186Z         },
2026-08-28T09:54:46.7585349Z         "impl": {
2026-08-28T09:54:46.7585525Z           "complete": false,
2026-08-28T09:54:46.7585697Z           "evidence": []
2026-08-28T09:54:46.7585840Z         },
2026-08-28T09:54:46.7585998Z         "int": {
2026-08-28T09:54:46.7586170Z           "complete": false,
2026-08-28T09:54:46.7586336Z           "evidence": []
2026-08-28T09:54:46.7586487Z         },
2026-08-28T09:54:46.7586651Z         "unit": {
2026-08-28T09:54:46.7586825Z           "complete": false,
2026-08-28T09:54:46.7586989Z           "evidence": []
2026-08-28T09:54:46.7587145Z         }
2026-08-28T09:54:46.7587298Z       }
2026-08-28T09:54:46.7587446Z     },
2026-08-28T09:54:46.7587594Z     {
2026-08-28T09:54:46.7587833Z       "id": "REQ-HAZARD-EVENTPART-REASSEMBLY",
2026-08-28T09:54:46.7588375Z       "title": "EVENT-PART split/reassembly is byte-exact; orphan parts dropped silently",
2026-08-28T09:54:46.7588557Z       "requiredStages": [
2026-08-28T09:54:46.7588842Z         "doc",
2026-08-28T09:54:46.7589092Z         "impl",
2026-08-28T09:54:46.7589254Z         "unit"
2026-08-28T09:54:46.7589407Z       ],
2026-08-28T09:54:46.7589560Z       "stages": {
2026-08-28T09:54:46.7589697Z         "doc": {
2026-08-28T09:54:46.7589880Z           "complete": true,
2026-08-28T09:54:46.7590046Z           "evidence": [
2026-08-28T09:54:46.7590204Z             {
2026-08-28T09:54:46.7590479Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:46.7590642Z               "line": 236
2026-08-28T09:54:46.7590790Z             }
2026-08-28T09:54:46.7590937Z           ]
2026-08-28T09:54:46.7591091Z         },
2026-08-28T09:54:46.7591248Z         "impl": {
2026-08-28T09:54:46.7591420Z           "complete": true,
2026-08-28T09:54:46.7591584Z           "evidence": [
2026-08-28T09:54:46.7591742Z             {
2026-08-28T09:54:46.7591983Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7592145Z               "line": 76
2026-08-28T09:54:46.7592303Z             },
2026-08-28T09:54:46.7592451Z             {
2026-08-28T09:54:46.7592689Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7592856Z               "line": 167
2026-08-28T09:54:46.7593009Z             },
2026-08-28T09:54:46.7593156Z             {
2026-08-28T09:54:46.7593390Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7593553Z               "line": 233
2026-08-28T09:54:46.7593700Z             },
2026-08-28T09:54:46.7593858Z             {
2026-08-28T09:54:46.7594090Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7594257Z               "line": 272
2026-08-28T09:54:46.7594407Z             }
2026-08-28T09:54:46.7594565Z           ]
2026-08-28T09:54:46.7594712Z         },
2026-08-28T09:54:46.7594870Z         "int": {
2026-08-28T09:54:46.7595046Z           "complete": false,
2026-08-28T09:54:46.7595213Z           "evidence": []
2026-08-28T09:54:46.7595365Z         },
2026-08-28T09:54:46.7595519Z         "unit": {
2026-08-28T09:54:46.7595694Z           "complete": true,
2026-08-28T09:54:46.7595966Z           "evidence": [
2026-08-28T09:54:46.7596124Z             {
2026-08-28T09:54:46.7596362Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7596525Z               "line": 321
2026-08-28T09:54:46.7596681Z             },
2026-08-28T09:54:46.7596830Z             {
2026-08-28T09:54:46.7597071Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7597234Z               "line": 329
2026-08-28T09:54:46.7597390Z             },
2026-08-28T09:54:46.7597539Z             {
2026-08-28T09:54:46.7597768Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7597925Z               "line": 356
2026-08-28T09:54:46.7598078Z             },
2026-08-28T09:54:46.7598231Z             {
2026-08-28T09:54:46.7598460Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7598621Z               "line": 395
2026-08-28T09:54:46.7598770Z             },
2026-08-28T09:54:46.7598926Z             {
2026-08-28T09:54:46.7599254Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7599416Z               "line": 406
2026-08-28T09:54:46.7599571Z             },
2026-08-28T09:54:46.7599720Z             {
2026-08-28T09:54:46.7599953Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7600111Z               "line": 418
2026-08-28T09:54:46.7600262Z             },
2026-08-28T09:54:46.7600411Z             {
2026-08-28T09:54:46.7600650Z               "path": "crates/spt-proto/src/chunk.rs",
2026-08-28T09:54:46.7600811Z               "line": 442
2026-08-28T09:54:46.7600974Z             }
2026-08-28T09:54:46.7601126Z           ]
2026-08-28T09:54:46.7601275Z         }
2026-08-28T09:54:46.7601431Z       }
2026-08-28T09:54:46.7601584Z     },
2026-08-28T09:54:46.7601731Z     {
2026-08-28T09:54:46.7602003Z       "id": "REQ-HAZARD-FAILED-ADDR-REINSTALL-LOOP",
2026-08-28T09:54:46.7611300Z       "title": "HAZARD: a peer is never stranded by an address that has ALREADY failed — no path may re-serve or reinstall a just-failed address such that the node retries it forever and never reaches the discovery leg. This is the second clause of KNOWN-HAZARDS 7.42, added rather than carved out: 7.42's first clause (a valid roster address must never be deleted by a failed dial) remains true and is what REQ-HAZARD-MESH-BOOTSTRAP-TRAP pins; the cross-site incident falsified the unstated assumption BEHIND it, that a retained roster address is fresher than the failed one. Forbidden state: fail -> demote to suspect -> reinstall the identical address -> fail, cycling on every roster exchange while the id-only discovery leg stays unreachable and every status surface reads healthy. Kin REQ-DIAL-FAILED-ADDR-MEMORY (the mechanism that forbids it), REQ-HAZARD-MESH-BOOTSTRAP-TRAP (the first clause, distinct anchor). Gate: doc — the KNOWN-HAZARDS 7.42 second-clause entry; int — the livelock is set up on the real pump seam (dead roster address, discovery live) and the node is proved to reach discovery and connect; a pre-fix build never converges.",
2026-08-28T09:54:46.7611653Z       "requiredStages": [
2026-08-28T09:54:46.7611806Z         "doc",
2026-08-28T09:54:46.7611957Z         "int"
2026-08-28T09:54:46.7612106Z       ],
2026-08-28T09:54:46.7612258Z       "stages": {
2026-08-28T09:54:46.7612411Z         "doc": {
2026-08-28T09:54:46.7612582Z           "complete": true,
2026-08-28T09:54:46.7612753Z           "evidence": [
2026-08-28T09:54:46.7612900Z             {
2026-08-28T09:54:46.7613123Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7613294Z               "line": 918
2026-08-28T09:54:46.7613443Z             }
2026-08-28T09:54:46.7613594Z           ]
2026-08-28T09:54:46.7613738Z         },
2026-08-28T09:54:46.7613900Z         "impl": {
2026-08-28T09:54:46.7614077Z           "complete": false,
2026-08-28T09:54:46.7614252Z           "evidence": []
2026-08-28T09:54:46.7614397Z         },
2026-08-28T09:54:46.7614548Z         "int": {
2026-08-28T09:54:46.7614726Z           "complete": true,
2026-08-28T09:54:46.7614896Z           "evidence": [
2026-08-28T09:54:46.7615153Z             {
2026-08-28T09:54:46.7615447Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:46.7615612Z               "line": 456
2026-08-28T09:54:46.7615767Z             }
2026-08-28T09:54:46.7615922Z           ]
2026-08-28T09:54:46.7616071Z         },
2026-08-28T09:54:46.7616228Z         "unit": {
2026-08-28T09:54:46.7616400Z           "complete": false,
2026-08-28T09:54:46.7616571Z           "evidence": []
2026-08-28T09:54:46.7616729Z         }
2026-08-28T09:54:46.7616881Z       }
2026-08-28T09:54:46.7617039Z     },
2026-08-28T09:54:46.7617186Z     {
2026-08-28T09:54:46.7617401Z       "id": "REQ-HAZARD-GEN-START-NOW",
2026-08-28T09:54:46.7617734Z       "title": "gen_start = now() on cold-start and handoff (2.4)",
2026-08-28T09:54:46.7617922Z       "requiredStages": [
2026-08-28T09:54:46.7618082Z         "impl",
2026-08-28T09:54:46.7618235Z         "int"
2026-08-28T09:54:46.7618397Z       ],
2026-08-28T09:54:46.7618550Z       "stages": {
2026-08-28T09:54:46.7618707Z         "doc": {
2026-08-28T09:54:46.7618879Z           "complete": false,
2026-08-28T09:54:46.7619131Z           "evidence": []
2026-08-28T09:54:46.7619279Z         },
2026-08-28T09:54:46.7619440Z         "impl": {
2026-08-28T09:54:46.7619608Z           "complete": true,
2026-08-28T09:54:46.7619775Z           "evidence": [
2026-08-28T09:54:46.7619932Z             {
2026-08-28T09:54:46.7620172Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.7620336Z               "line": 22
2026-08-28T09:54:46.7620484Z             }
2026-08-28T09:54:46.7620639Z           ]
2026-08-28T09:54:46.7620792Z         },
2026-08-28T09:54:46.7620935Z         "int": {
2026-08-28T09:54:46.7621097Z           "complete": true,
2026-08-28T09:54:46.7621254Z           "evidence": [
2026-08-28T09:54:46.7621412Z             {
2026-08-28T09:54:46.7621668Z               "path": "crates/spt-daemon/tests/handoff.rs",
2026-08-28T09:54:46.7621941Z               "line": 18
2026-08-28T09:54:46.7622099Z             }
2026-08-28T09:54:46.7622251Z           ]
2026-08-28T09:54:46.7622399Z         },
2026-08-28T09:54:46.7622551Z         "unit": {
2026-08-28T09:54:46.7622724Z           "complete": false,
2026-08-28T09:54:46.7622890Z           "evidence": []
2026-08-28T09:54:46.7623043Z         }
2026-08-28T09:54:46.7623189Z       }
2026-08-28T09:54:46.7623337Z     },
2026-08-28T09:54:46.7623483Z     {
2026-08-28T09:54:46.7623722Z       "id": "REQ-HAZARD-GRACE-BEFORE-SIGNOFF",
2026-08-28T09:54:46.7624192Z       "title": "Grace-period wait completes before composing INIT_SIGNOFF (1.1)",
2026-08-28T09:54:46.7624375Z       "requiredStages": [
2026-08-28T09:54:46.7624536Z         "impl",
2026-08-28T09:54:46.7624695Z         "unit"
2026-08-28T09:54:46.7624860Z       ],
2026-08-28T09:54:46.7625019Z       "stages": {
2026-08-28T09:54:46.7625180Z         "doc": {
2026-08-28T09:54:46.7625352Z           "complete": false,
2026-08-28T09:54:46.7625548Z           "evidence": []
2026-08-28T09:54:46.7625700Z         },
2026-08-28T09:54:46.7625860Z         "impl": {
2026-08-28T09:54:46.7626040Z           "complete": true,
2026-08-28T09:54:46.7626207Z           "evidence": [
2026-08-28T09:54:46.7626369Z             {
2026-08-28T09:54:46.7626636Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.7626807Z               "line": 1789
2026-08-28T09:54:46.7626955Z             },
2026-08-28T09:54:46.7627107Z             {
2026-08-28T09:54:46.7627346Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.7627514Z               "line": 27
2026-08-28T09:54:46.7627666Z             }
2026-08-28T09:54:46.7627814Z           ]
2026-08-28T09:54:46.7627965Z         },
2026-08-28T09:54:46.7628115Z         "int": {
2026-08-28T09:54:46.7628304Z           "complete": false,
2026-08-28T09:54:46.7628473Z           "evidence": []
2026-08-28T09:54:46.7628633Z         },
2026-08-28T09:54:46.7628790Z         "unit": {
2026-08-28T09:54:46.7629066Z           "complete": true,
2026-08-28T09:54:46.7629347Z           "evidence": [
2026-08-28T09:54:46.7629510Z             {
2026-08-28T09:54:46.7629787Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.7629948Z               "line": 3812
2026-08-28T09:54:46.7630102Z             },
2026-08-28T09:54:46.7630254Z             {
2026-08-28T09:54:46.7630492Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.7630654Z               "line": 181
2026-08-28T09:54:46.7630816Z             }
2026-08-28T09:54:46.7630968Z           ]
2026-08-28T09:54:46.7631115Z         }
2026-08-28T09:54:46.7631275Z       }
2026-08-28T09:54:46.7631424Z     },
2026-08-28T09:54:46.7631575Z     {
2026-08-28T09:54:46.7631805Z       "id": "REQ-HAZARD-HANDOFF-ARGV-COMPAT",
2026-08-28T09:54:46.7632186Z       "title": "Broker/brain IPC + handoff argv version-tolerant (2.3)",
2026-08-28T09:54:46.7632363Z       "requiredStages": [
2026-08-28T09:54:46.7632534Z         "impl",
2026-08-28T09:54:46.7632683Z         "unit"
2026-08-28T09:54:46.7632844Z       ],
2026-08-28T09:54:46.7632998Z       "stages": {
2026-08-28T09:54:46.7633154Z         "doc": {
2026-08-28T09:54:46.7633327Z           "complete": false,
2026-08-28T09:54:46.7633497Z           "evidence": []
2026-08-28T09:54:46.7633647Z         },
2026-08-28T09:54:46.7633811Z         "impl": {
2026-08-28T09:54:46.7633987Z           "complete": true,
2026-08-28T09:54:46.7634152Z           "evidence": [
2026-08-28T09:54:46.7634310Z             {
2026-08-28T09:54:46.7634573Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.7634739Z               "line": 108
2026-08-28T09:54:46.7634892Z             },
2026-08-28T09:54:46.7635044Z             {
2026-08-28T09:54:46.7635306Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.7635468Z               "line": 1207
2026-08-28T09:54:46.7635621Z             },
2026-08-28T09:54:46.7635769Z             {
2026-08-28T09:54:46.7636007Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7636279Z               "line": 20
2026-08-28T09:54:46.7636430Z             },
2026-08-28T09:54:46.7636577Z             {
2026-08-28T09:54:46.7636819Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7636981Z               "line": 100
2026-08-28T09:54:46.7637140Z             },
2026-08-28T09:54:46.7637295Z             {
2026-08-28T09:54:46.7637520Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.7637691Z               "line": 1495
2026-08-28T09:54:46.7637844Z             },
2026-08-28T09:54:46.7637997Z             {
2026-08-28T09:54:46.7638249Z               "path": "crates/spt-daemon/src/transport.rs",
2026-08-28T09:54:46.7638418Z               "line": 68
2026-08-28T09:54:46.7638564Z             },
2026-08-28T09:54:46.7638723Z             {
2026-08-28T09:54:46.7639169Z               "path": "crates/spt-daemon/src/transport.rs",
2026-08-28T09:54:46.7639331Z               "line": 80
2026-08-28T09:54:46.7639493Z             }
2026-08-28T09:54:46.7639636Z           ]
2026-08-28T09:54:46.7639803Z         },
2026-08-28T09:54:46.7639995Z         "int": {
2026-08-28T09:54:46.7640165Z           "complete": true,
2026-08-28T09:54:46.7640324Z           "evidence": [
2026-08-28T09:54:46.7640475Z             {
2026-08-28T09:54:46.7640709Z               "path": "crates/spt/tests/n1_pairing.rs",
2026-08-28T09:54:46.7640866Z               "line": 44
2026-08-28T09:54:46.7641019Z             }
2026-08-28T09:54:46.7641162Z           ]
2026-08-28T09:54:46.7641316Z         },
2026-08-28T09:54:46.7641466Z         "unit": {
2026-08-28T09:54:46.7641647Z           "complete": true,
2026-08-28T09:54:46.7641811Z           "evidence": [
2026-08-28T09:54:46.7641970Z             {
2026-08-28T09:54:46.7642232Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.7642389Z               "line": 1421
2026-08-28T09:54:46.7642542Z             },
2026-08-28T09:54:46.7642689Z             {
2026-08-28T09:54:46.7642961Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:46.7643248Z               "line": 1437
2026-08-28T09:54:46.7643405Z             },
2026-08-28T09:54:46.7643553Z             {
2026-08-28T09:54:46.7643801Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7643972Z               "line": 10161
2026-08-28T09:54:46.7644120Z             },
2026-08-28T09:54:46.7644272Z             {
2026-08-28T09:54:46.7644509Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7644683Z               "line": 152
2026-08-28T09:54:46.7644832Z             },
2026-08-28T09:54:46.7644984Z             {
2026-08-28T09:54:46.7645223Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7645375Z               "line": 175
2026-08-28T09:54:46.7645528Z             },
2026-08-28T09:54:46.7645665Z             {
2026-08-28T09:54:46.7645900Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7646063Z               "line": 186
2026-08-28T09:54:46.7646218Z             },
2026-08-28T09:54:46.7646368Z             {
2026-08-28T09:54:46.7646615Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7646778Z               "line": 202
2026-08-28T09:54:46.7646929Z             },
2026-08-28T09:54:46.7647086Z             {
2026-08-28T09:54:46.7647317Z               "path": "crates/spt-daemon/src/frame.rs",
2026-08-28T09:54:46.7647480Z               "line": 216
2026-08-28T09:54:46.7647627Z             },
2026-08-28T09:54:46.7647790Z             {
2026-08-28T09:54:46.7648043Z               "path": "crates/spt-daemon/src/transport.rs",
2026-08-28T09:54:46.7648203Z               "line": 137
2026-08-28T09:54:46.7648362Z             },
2026-08-28T09:54:46.7648509Z             {
2026-08-28T09:54:46.7648715Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7648877Z               "line": 30739
2026-08-28T09:54:46.7649115Z             },
2026-08-28T09:54:46.7649269Z             {
2026-08-28T09:54:46.7649650Z               "path": "crates/spt/tests/n1_compat.rs",
2026-08-28T09:54:46.7649819Z               "line": 30
2026-08-28T09:54:46.7649977Z             },
2026-08-28T09:54:46.7650129Z             {
2026-08-28T09:54:46.7650364Z               "path": "crates/spt/tests/n1_compat.rs",
2026-08-28T09:54:46.7650526Z               "line": 73
2026-08-28T09:54:46.7650679Z             }
2026-08-28T09:54:46.7650816Z           ]
2026-08-28T09:54:46.7650969Z         }
2026-08-28T09:54:46.7651117Z       }
2026-08-28T09:54:46.7651269Z     },
2026-08-28T09:54:46.7651422Z     {
2026-08-28T09:54:46.7651684Z       "id": "REQ-HAZARD-HOSTED-LIVENESS-RECONCILE",
2026-08-28T09:54:46.7663148Z       "title": "B2 KEYSTONE: a daemon-hosted (spt-hosted) endpoint's info.json status is RECONCILED to real liveness, not left latched online. The broker exit-waiter (broker.rs:889-910) reaps its in-mem session table + emits ExitEvent but NEVER touches info.json; lifecycle::mark_offline only fires on Psyche teardown — so a dead/exited harness (operator closed the tab) stays status=online forever (is_perch_alive returns ONLINE for daemon-hosted, liveness.rs:80-93). FIX (doyle ruled PULL-PRIMARY — the live-status analog of REQ-HAZARD-ROSTER-GHOST): the livehost reconcile loop (reconcile_once livehost.rs:226-313) queries the broker's live session set (KIND_SESSIONS) each tick and, for any status=online live_agent perch PAST the boot grace whose endpoint has NO live broker session, marks it offline (lifecycle::mark_offline → status=offline → is_perch_alive=false). GATED on spt-hosted (controllable==Some(true)) so a HARNESS-HOSTED relay live agent (api listen, legitimately online with no broker session) is NEVER mis-marked. Crash-robust + self-healing on the next tick (clear-on-event is not crash-robust alone). PUSH (brain ExitEvent→mark_offline) is an OPTIONAL fast-path only if the daemon brain is reliably subscribed to all hosted sessions; correctness rides the pull. Broker stays stateless (ADR-0004 §B — brain owns the info.json write). (v0.12.0)",
2026-08-28T09:54:46.7663361Z       "requiredStages": [
2026-08-28T09:54:46.7663643Z         "impl",
2026-08-28T09:54:46.7663801Z         "unit",
2026-08-28T09:54:46.7663953Z         "int"
2026-08-28T09:54:46.7664105Z       ],
2026-08-28T09:54:46.7664267Z       "stages": {
2026-08-28T09:54:46.7664429Z         "doc": {
2026-08-28T09:54:46.7664611Z           "complete": false,
2026-08-28T09:54:46.7664772Z           "evidence": []
2026-08-28T09:54:46.7664922Z         },
2026-08-28T09:54:46.7665082Z         "impl": {
2026-08-28T09:54:46.7665265Z           "complete": true,
2026-08-28T09:54:46.7665435Z           "evidence": [
2026-08-28T09:54:46.7665577Z             {
2026-08-28T09:54:46.7665837Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7666029Z               "line": 703
2026-08-28T09:54:46.7666171Z             },
2026-08-28T09:54:46.7666319Z             {
2026-08-28T09:54:46.7666578Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7666733Z               "line": 1292
2026-08-28T09:54:46.7666883Z             }
2026-08-28T09:54:46.7667034Z           ]
2026-08-28T09:54:46.7667188Z         },
2026-08-28T09:54:46.7667344Z         "int": {
2026-08-28T09:54:46.7667527Z           "complete": true,
2026-08-28T09:54:46.7667692Z           "evidence": [
2026-08-28T09:54:46.7667842Z             {
2026-08-28T09:54:46.7668106Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7668262Z               "line": 2017
2026-08-28T09:54:46.7668418Z             },
2026-08-28T09:54:46.7668562Z             {
2026-08-28T09:54:46.7668829Z               "path": "crates/spt/tests/attach_wedge_e2e.rs",
2026-08-28T09:54:46.7669081Z               "line": 306
2026-08-28T09:54:46.7669234Z             }
2026-08-28T09:54:46.7669396Z           ]
2026-08-28T09:54:46.7669544Z         },
2026-08-28T09:54:46.7669696Z         "unit": {
2026-08-28T09:54:46.7669868Z           "complete": true,
2026-08-28T09:54:46.7670035Z           "evidence": [
2026-08-28T09:54:46.7670292Z             {
2026-08-28T09:54:46.7670549Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7670723Z               "line": 1373
2026-08-28T09:54:46.7670874Z             }
2026-08-28T09:54:46.7671021Z           ]
2026-08-28T09:54:46.7671183Z         }
2026-08-28T09:54:46.7671336Z       }
2026-08-28T09:54:46.7671484Z     },
2026-08-28T09:54:46.7671631Z     {
2026-08-28T09:54:46.7671832Z       "id": "REQ-HAZARD-ID-CHARSET",
2026-08-28T09:54:46.7672485Z       "title": "Addressable-id charset reserves :/@ delimiters; validated at every creation seam (4.6)",
2026-08-28T09:54:46.7672672Z       "requiredStages": [
2026-08-28T09:54:46.7672824Z         "impl",
2026-08-28T09:54:46.7672987Z         "unit"
2026-08-28T09:54:46.7673132Z       ],
2026-08-28T09:54:46.7673304Z       "stages": {
2026-08-28T09:54:46.7673464Z         "doc": {
2026-08-28T09:54:46.7673636Z           "complete": true,
2026-08-28T09:54:46.7673802Z           "evidence": [
2026-08-28T09:54:46.7673965Z             {
2026-08-28T09:54:46.7674183Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7674351Z               "line": 171
2026-08-28T09:54:46.7674508Z             }
2026-08-28T09:54:46.7674661Z           ]
2026-08-28T09:54:46.7674822Z         },
2026-08-28T09:54:46.7674970Z         "impl": {
2026-08-28T09:54:46.7675152Z           "complete": true,
2026-08-28T09:54:46.7675318Z           "evidence": [
2026-08-28T09:54:46.7675477Z             {
2026-08-28T09:54:46.7675705Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:46.7675859Z               "line": 65
2026-08-28T09:54:46.7676094Z             },
2026-08-28T09:54:46.7676321Z             {
2026-08-28T09:54:46.7676650Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7676861Z               "line": 17
2026-08-28T09:54:46.7677094Z             },
2026-08-28T09:54:46.7677313Z             {
2026-08-28T09:54:46.7677699Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.7677976Z               "line": 281
2026-08-28T09:54:46.7678209Z             },
2026-08-28T09:54:46.7678618Z             {
2026-08-28T09:54:46.7678874Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7679118Z               "line": 898
2026-08-28T09:54:46.7679264Z             },
2026-08-28T09:54:46.7679437Z             {
2026-08-28T09:54:46.7679695Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7679860Z               "line": 1085
2026-08-28T09:54:46.7680010Z             },
2026-08-28T09:54:46.7680157Z             {
2026-08-28T09:54:46.7680390Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.7680542Z               "line": 53
2026-08-28T09:54:46.7680696Z             },
2026-08-28T09:54:46.7680843Z             {
2026-08-28T09:54:46.7681081Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:46.7681240Z               "line": 68
2026-08-28T09:54:46.7681396Z             },
2026-08-28T09:54:46.7681548Z             {
2026-08-28T09:54:46.7681758Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7681930Z               "line": 3943
2026-08-28T09:54:46.7682077Z             },
2026-08-28T09:54:46.7682235Z             {
2026-08-28T09:54:46.7682435Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7682597Z               "line": 4443
2026-08-28T09:54:46.7682749Z             },
2026-08-28T09:54:46.7682898Z             {
2026-08-28T09:54:46.7683111Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7683275Z               "line": 22424
2026-08-28T09:54:46.7683431Z             },
2026-08-28T09:54:46.7683580Z             {
2026-08-28T09:54:46.7683792Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7683953Z               "line": 22755
2026-08-28T09:54:46.7684104Z             }
2026-08-28T09:54:46.7684254Z           ]
2026-08-28T09:54:46.7684400Z         },
2026-08-28T09:54:46.7684558Z         "int": {
2026-08-28T09:54:46.7684729Z           "complete": false,
2026-08-28T09:54:46.7685020Z           "evidence": []
2026-08-28T09:54:46.7685178Z         },
2026-08-28T09:54:46.7685427Z         "unit": {
2026-08-28T09:54:46.7685630Z           "complete": true,
2026-08-28T09:54:46.7685794Z           "evidence": [
2026-08-28T09:54:46.7685941Z             {
2026-08-28T09:54:46.7686184Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7686347Z               "line": 94
2026-08-28T09:54:46.7686494Z             },
2026-08-28T09:54:46.7686645Z             {
2026-08-28T09:54:46.7686863Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7687034Z               "line": 111
2026-08-28T09:54:46.7687182Z             },
2026-08-28T09:54:46.7687335Z             {
2026-08-28T09:54:46.7687553Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7687717Z               "line": 124
2026-08-28T09:54:46.7687873Z             },
2026-08-28T09:54:46.7688022Z             {
2026-08-28T09:54:46.7688245Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7688407Z               "line": 134
2026-08-28T09:54:46.7688565Z             },
2026-08-28T09:54:46.7688718Z             {
2026-08-28T09:54:46.7689037Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7689216Z               "line": 144
2026-08-28T09:54:46.7689382Z             },
2026-08-28T09:54:46.7689533Z             {
2026-08-28T09:54:46.7689748Z               "path": "crates/spt-proto/src/id.rs",
2026-08-28T09:54:46.7689911Z               "line": 156
2026-08-28T09:54:46.7690059Z             },
2026-08-28T09:54:46.7690216Z             {
2026-08-28T09:54:46.7690487Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.7690654Z               "line": 1007
2026-08-28T09:54:46.7690812Z             },
2026-08-28T09:54:46.7690960Z             {
2026-08-28T09:54:46.7691223Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.7691379Z               "line": 592
2026-08-28T09:54:46.7691538Z             }
2026-08-28T09:54:46.7691689Z           ]
2026-08-28T09:54:46.7691843Z         }
2026-08-28T09:54:46.7692127Z       }
2026-08-28T09:54:46.7692280Z     },
2026-08-28T09:54:46.7692427Z     {
2026-08-28T09:54:46.7692680Z       "id": "REQ-HAZARD-IDLE-SILENT-NONDELIVERY",
2026-08-28T09:54:46.7718710Z       "title": "An idle delivery to a session whose translation binary is in a FAILED STATE — absent (none declared), spawn-failed, FAULTED, or its inject-worker channel gone — must SPOOL (delivered=false), never raw-inject a pseudo-delivery reported as delivered. The GUARANTEE is the STEADY STATE (the failed-binary state), not every in-flight message (see the fault-transient carve-out below). ROOT (F-019 post-mortem, ADR-0022 amendment): the v0.11.0 path raw-injected `payload+\\r` into the PTY whenever no working translation binary handled an inbound message (none declared, spawn-failed, FAULTED, or its inject-worker channel gone) AND acked `delivered=true` — but a bare `payload+\\r` does NOT submit on a modern TUI (Claude Code), so the message was TYPED but never sent: a silent pseudo-delivery reported as success. That silent degrade-to-raw-inject is exactly what MASKED F-019 through a multi-hour black-box hunt. FIX (operator-ruled, doyle-scoped): idle delivery is translation-binary-ONLY — `dispatch_endpoint_input` with no working binary replies `endpoint_injected_envelope(ep, delivered=false)` (the caller `try_broker_inject`→`cmd_send` then falls through to `deliver::send` = SPOOL, poll-fed, never lost) and writes NOTHING to the PTY, LOUDLY (eprintln names the absent/faulted/worker-gone cause). A failed binary becomes a VISIBLE no-delivery (spooled + honest QUEUED report), never a confident-but-false 'Sent'. The raw-inject fallback (`input.enqueue`) is REMOVED from the no-binary, worker-dropped, AND post-fault paths. OUT OF SCOPE (doyle ruling, follow-up note only): broker-side auto-redrive of already-spooled inbound the instant a live-update binary spawns (ordering/exactly-once hazards; the poll substrate + subsequent sends cover re-delivery). NOT COVERED — the FAULT-TRANSIENT (the STATE-vs-transient precision): a delivery landing in the worker's commit window — BEFORE `event_rx` is dropped / `faulted` is set — can be optimistically enqueue-acked (`delivered=true` the instant `event_tx.send` succeeds) then DROPPED when the worker faults+returns. That is a SEPARATE, PRE-EXISTING hazard: raw-inject removal did not touch it (the old code dropped that queued event too) — v0.14.3 is a strict improvement that makes nothing worse. It is tracked for v0.15.0 under REQ-MSG-DELIVERY-AXES (the spool-centric delivery redesign: ack-on-SPOOL replaces ack-on-enqueue, which closes the optimistic-ack drop naturally). v0.14.3 guarantees only the steady FAILED state → spool (faulted is MONOTONIC — set once, never respawns — so it converges deterministically; the g2 gate asserts the steady state via bounded-retry-until-spool, not a single-shot ack). EPHEMERAL CARVE-OUT (v0.15.0 W3, ADR-0028): `--ephemeral` is the SOLE sender-opted-in exception — an ephemeral message MAY drop silently if it cannot deliver in its accepted window (at window-open with no live carrier, or at TTL). Every NON-ephemeral path still spools + reports `delivered=false` (the guarantee is unchanged for the default durable path). v0.15.0 realizes the ephemeral drop for the spt-hosted-binary no-carrier-at-window leg + TTL; the harness-relay no-live-listener leg is a documented partial (CONTEXT.md §persistence). KNOWN-HAZARDS class (rule 4). (v0.14.3; ephemeral carve-out v0.15.0)",
2026-08-28T09:54:46.7719159Z       "requiredStages": [
2026-08-28T09:54:46.7719320Z         "doc",
2026-08-28T09:54:46.7719473Z         "impl",
2026-08-28T09:54:46.7719630Z         "unit",
2026-08-28T09:54:46.7719783Z         "int"
2026-08-28T09:54:46.7719930Z       ],
2026-08-28T09:54:46.7720097Z       "stages": {
2026-08-28T09:54:46.7720250Z         "doc": {
2026-08-28T09:54:46.7720436Z           "complete": true,
2026-08-28T09:54:46.7720604Z           "evidence": [
2026-08-28T09:54:46.7720751Z             {
2026-08-28T09:54:46.7720978Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7721281Z               "line": 594
2026-08-28T09:54:46.7721439Z             }
2026-08-28T09:54:46.7721587Z           ]
2026-08-28T09:54:46.7721740Z         },
2026-08-28T09:54:46.7721892Z         "impl": {
2026-08-28T09:54:46.7722078Z           "complete": true,
2026-08-28T09:54:46.7722245Z           "evidence": [
2026-08-28T09:54:46.7722393Z             {
2026-08-28T09:54:46.7722645Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7722807Z               "line": 8606
2026-08-28T09:54:46.7722965Z             }
2026-08-28T09:54:46.7723112Z           ]
2026-08-28T09:54:46.7723261Z         },
2026-08-28T09:54:46.7723408Z         "int": {
2026-08-28T09:54:46.7723590Z           "complete": true,
2026-08-28T09:54:46.7723764Z           "evidence": [
2026-08-28T09:54:46.7723918Z             {
2026-08-28T09:54:46.7724175Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7724341Z               "line": 198
2026-08-28T09:54:46.7724495Z             },
2026-08-28T09:54:46.7724628Z             {
2026-08-28T09:54:46.7724885Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7725047Z               "line": 544
2026-08-28T09:54:46.7725195Z             },
2026-08-28T09:54:46.7725347Z             {
2026-08-28T09:54:46.7725677Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7725844Z               "line": 497
2026-08-28T09:54:46.7725995Z             },
2026-08-28T09:54:46.7726152Z             {
2026-08-28T09:54:46.7726475Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7726645Z               "line": 1563
2026-08-28T09:54:46.7726794Z             }
2026-08-28T09:54:46.7726951Z           ]
2026-08-28T09:54:46.7727099Z         },
2026-08-28T09:54:46.7727246Z         "unit": {
2026-08-28T09:54:46.7727423Z           "complete": true,
2026-08-28T09:54:46.7727590Z           "evidence": [
2026-08-28T09:54:46.7727857Z             {
2026-08-28T09:54:46.7728086Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.7728253Z               "line": 2166
2026-08-28T09:54:46.7728405Z             }
2026-08-28T09:54:46.7728553Z           ]
2026-08-28T09:54:46.7728711Z         }
2026-08-28T09:54:46.7728857Z       }
2026-08-28T09:54:46.7729084Z     },
2026-08-28T09:54:46.7729232Z     {
2026-08-28T09:54:46.7729456Z       "id": "REQ-HAZARD-INBOX-NO-DOUBLE",
2026-08-28T09:54:46.7729737Z       "title": "No double-delivery via legacy inbox (4.5)",
2026-08-28T09:54:46.7729934Z       "requiredStages": [
2026-08-28T09:54:46.7730128Z         "impl",
2026-08-28T09:54:46.7730281Z         "unit"
2026-08-28T09:54:46.7730438Z       ],
2026-08-28T09:54:46.7734112Z       "stages": {
2026-08-28T09:54:46.7734305Z         "doc": {
2026-08-28T09:54:46.7734493Z           "complete": false,
2026-08-28T09:54:46.7734663Z           "evidence": []
2026-08-28T09:54:46.7734821Z         },
2026-08-28T09:54:46.7734987Z         "impl": {
2026-08-28T09:54:46.7735165Z           "complete": true,
2026-08-28T09:54:46.7735336Z           "evidence": [
2026-08-28T09:54:46.7735483Z             {
2026-08-28T09:54:46.7735737Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:46.7735898Z               "line": 134
2026-08-28T09:54:46.7736052Z             }
2026-08-28T09:54:46.7736198Z           ]
2026-08-28T09:54:46.7736348Z         },
2026-08-28T09:54:46.7736498Z         "int": {
2026-08-28T09:54:46.7736684Z           "complete": false,
2026-08-28T09:54:46.7736849Z           "evidence": []
2026-08-28T09:54:46.7736997Z         },
2026-08-28T09:54:46.7737158Z         "unit": {
2026-08-28T09:54:46.7737326Z           "complete": true,
2026-08-28T09:54:46.7737501Z           "evidence": [
2026-08-28T09:54:46.7737650Z             {
2026-08-28T09:54:46.7737893Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:46.7738051Z               "line": 295
2026-08-28T09:54:46.7738203Z             }
2026-08-28T09:54:46.7738360Z           ]
2026-08-28T09:54:46.7738665Z         }
2026-08-28T09:54:46.7738818Z       }
2026-08-28T09:54:46.7739138Z     },
2026-08-28T09:54:46.7739290Z     {
2026-08-28T09:54:46.7739532Z       "id": "REQ-HAZARD-INFO-JSON-TORN-READ",
2026-08-28T09:54:46.7739888Z       "title": "State-file reads tolerate concurrent writes (1.2)",
2026-08-28T09:54:46.7740068Z       "requiredStages": [
2026-08-28T09:54:46.7740226Z         "impl",
2026-08-28T09:54:46.7740378Z         "unit"
2026-08-28T09:54:46.7740527Z       ],
2026-08-28T09:54:46.7740688Z       "stages": {
2026-08-28T09:54:46.7740842Z         "doc": {
2026-08-28T09:54:46.7741017Z           "complete": false,
2026-08-28T09:54:46.7741175Z           "evidence": []
2026-08-28T09:54:46.7741332Z         },
2026-08-28T09:54:46.7741490Z         "impl": {
2026-08-28T09:54:46.7741666Z           "complete": true,
2026-08-28T09:54:46.7741833Z           "evidence": [
2026-08-28T09:54:46.7741984Z             {
2026-08-28T09:54:46.7742225Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7742392Z               "line": 845
2026-08-28T09:54:46.7742545Z             },
2026-08-28T09:54:46.7742692Z             {
2026-08-28T09:54:46.7742935Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7743093Z               "line": 935
2026-08-28T09:54:46.7743250Z             },
2026-08-28T09:54:46.7743403Z             {
2026-08-28T09:54:46.7743632Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7743794Z               "line": 953
2026-08-28T09:54:46.7743947Z             }
2026-08-28T09:54:46.7744099Z           ]
2026-08-28T09:54:46.7744247Z         },
2026-08-28T09:54:46.7744404Z         "int": {
2026-08-28T09:54:46.7744577Z           "complete": false,
2026-08-28T09:54:46.7744747Z           "evidence": []
2026-08-28T09:54:46.7744908Z         },
2026-08-28T09:54:46.7745062Z         "unit": {
2026-08-28T09:54:46.7745242Z           "complete": true,
2026-08-28T09:54:46.7745410Z           "evidence": [
2026-08-28T09:54:46.7745682Z             {
2026-08-28T09:54:46.7745911Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7746077Z               "line": 1055
2026-08-28T09:54:46.7746221Z             },
2026-08-28T09:54:46.7746377Z             {
2026-08-28T09:54:46.7746607Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7746763Z               "line": 1076
2026-08-28T09:54:46.7746917Z             },
2026-08-28T09:54:46.7747068Z             {
2026-08-28T09:54:46.7747300Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7747465Z               "line": 1854
2026-08-28T09:54:46.7747620Z             },
2026-08-28T09:54:46.7747771Z             {
2026-08-28T09:54:46.7748005Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7748172Z               "line": 1865
2026-08-28T09:54:46.7748324Z             },
2026-08-28T09:54:46.7748477Z             {
2026-08-28T09:54:46.7748705Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7748873Z               "line": 1878
2026-08-28T09:54:46.7749126Z             }
2026-08-28T09:54:46.7749292Z           ]
2026-08-28T09:54:46.7749441Z         }
2026-08-28T09:54:46.7749597Z       }
2026-08-28T09:54:46.7749746Z     },
2026-08-28T09:54:46.7749892Z     {
2026-08-28T09:54:46.7750135Z       "id": "REQ-HAZARD-INFO-RMW-LOST-UPDATE",
2026-08-28T09:54:46.7751349Z       "title": "Concurrent info.json writers must serialize under the per-perch lock (5.16): an unlocked whole-record write racing a locked RMW is a silent lost update",
2026-08-28T09:54:46.7751539Z       "requiredStages": [
2026-08-28T09:54:46.7751698Z         "impl",
2026-08-28T09:54:46.7751863Z         "unit"
2026-08-28T09:54:46.7752013Z       ],
2026-08-28T09:54:46.7752169Z       "stages": {
2026-08-28T09:54:46.7752323Z         "doc": {
2026-08-28T09:54:46.7752492Z           "complete": true,
2026-08-28T09:54:46.7752659Z           "evidence": [
2026-08-28T09:54:46.7752814Z             {
2026-08-28T09:54:46.7753039Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7753320Z               "line": 317
2026-08-28T09:54:46.7753476Z             }
2026-08-28T09:54:46.7753630Z           ]
2026-08-28T09:54:46.7753777Z         },
2026-08-28T09:54:46.7753931Z         "impl": {
2026-08-28T09:54:46.7754101Z           "complete": true,
2026-08-28T09:54:46.7754274Z           "evidence": [
2026-08-28T09:54:46.7754421Z             {
2026-08-28T09:54:46.7754654Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:46.7754812Z               "line": 268
2026-08-28T09:54:46.7754969Z             },
2026-08-28T09:54:46.7755122Z             {
2026-08-28T09:54:46.7755350Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7755512Z               "line": 463
2026-08-28T09:54:46.7755660Z             },
2026-08-28T09:54:46.7755812Z             {
2026-08-28T09:54:46.7756036Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7756199Z               "line": 847
2026-08-28T09:54:46.7756356Z             },
2026-08-28T09:54:46.7756514Z             {
2026-08-28T09:54:46.7756747Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7756904Z               "line": 916
2026-08-28T09:54:46.7757047Z             },
2026-08-28T09:54:46.7757186Z             {
2026-08-28T09:54:46.7757435Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.7757595Z               "line": 71
2026-08-28T09:54:46.7757747Z             }
2026-08-28T09:54:46.7757893Z           ]
2026-08-28T09:54:46.7758045Z         },
2026-08-28T09:54:46.7758207Z         "int": {
2026-08-28T09:54:46.7758374Z           "complete": false,
2026-08-28T09:54:46.7758546Z           "evidence": []
2026-08-28T09:54:46.7758699Z         },
2026-08-28T09:54:46.7758861Z         "unit": {
2026-08-28T09:54:46.7759109Z           "complete": true,
2026-08-28T09:54:46.7759285Z           "evidence": [
2026-08-28T09:54:46.7759438Z             {
2026-08-28T09:54:46.7759667Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7759948Z               "line": 1915
2026-08-28T09:54:46.7760100Z             }
2026-08-28T09:54:46.7760249Z           ]
2026-08-28T09:54:46.7760392Z         }
2026-08-28T09:54:46.7760547Z       }
2026-08-28T09:54:46.7760690Z     },
2026-08-28T09:54:46.7760840Z     {
2026-08-28T09:54:46.7761085Z       "id": "REQ-HAZARD-INJECT-CONTROL-COEXIST",
2026-08-28T09:54:46.7781829Z       "title": "SPINE INVARIANT (v0.13.0 keystone): the broker must accept INJECTED keystrokes into an spt-hosted PTY (the v0.11.0 raw direct-inject today; the ADR-0022 translation-binary choreography tomorrow) WHILE a live `spt rc` controller is attached to the SAME PTY, without (a) the operator losing control, (b) the endpoint latching ONLINE+CONTROLLED, or (c) the broker wedging. The injection inlet is PERMANENT — spt-claude-code requires keystroke injection — so this is root-caused + fixed at the PTY-injection layer, IN STEP with the ADR-0022 delivery redesign that formalizes the inlet. REOPENS the wedge facet of REQ-HAZARD-ATTACH-WEDGE: the v0.12.1 prove-don't-change covered only DEAD-CHILD backpressure, NOT the injection trigger (operator's signal — one injected keystroke succeeds, the next wedges → the single-threaded broker parks on a blocking PTY/loopback write after injection-induced harness output). REPRO-FIRST on the real dummy-harness fixture (NO theory): instrument to nail the exact blocking call before any fix. Fix candidates: non-blocking/fail-fast PTY write, split input/output, bounded-evicting. Mechanism shared with W2 — spt-core owns EVERY PTY write and applies an injected sequence ATOMICALLY (controller input buffered during the sequence, flushed after) so a stash/restore can't be clobbered. CONFIRMED ROOT (doyle /diagnose 2026-06-19, code-grounded): Broker::append (broker.rs:205-227) fans each live output chunk to the CONTROLLER on a SYNCHRONOUS BLOCKING write_frame held inline in the session's drain thread (the 'authoritative, advances delivered_through' path, D4-1), while VIEWERS use a dedicated writer thread + bounded evicting sync_channel (add_viewer:273 / viewer_writer) that can never stall the drain. So a slow/backed-up controller socket — or the full 64KB loopback duplex (the ATTACH-WEDGE buffer) — BLOCKS the drain thread → output stalls → keystroke echoes stall (PERCEIVED input lag) → unrecoverable wedge when the consumer never drains. TRIGGERS ON NORMAL INTERACTIVE rc USE under heavy harness output (TUI redraw), NOT only message injection — same root, wider repro. FIX DIRECTION: move controller delivery off the drain thread onto a dedicated writer (the viewer_writer pattern) BUT preserve the authoritative cursor — block the WRITER thread (not the drain), bound the wedge (deadline → detach/mark-gone, never park forever), never silently evict the operator's authoritative view. (v0.13.0)",
2026-08-28T09:54:46.7782280Z       "requiredStages": [
2026-08-28T09:54:46.7782443Z         "impl",
2026-08-28T09:54:46.7782595Z         "unit",
2026-08-28T09:54:46.7782763Z         "int"
2026-08-28T09:54:46.7782919Z       ],
2026-08-28T09:54:46.7783082Z       "stages": {
2026-08-28T09:54:46.7783239Z         "doc": {
2026-08-28T09:54:46.7783411Z           "complete": false,
2026-08-28T09:54:46.7783582Z           "evidence": []
2026-08-28T09:54:46.7783736Z         },
2026-08-28T09:54:46.7783892Z         "impl": {
2026-08-28T09:54:46.7784070Z           "complete": true,
2026-08-28T09:54:46.7784253Z           "evidence": [
2026-08-28T09:54:46.7784415Z             {
2026-08-28T09:54:46.7784666Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7784837Z               "line": 1302
2026-08-28T09:54:46.7784991Z             },
2026-08-28T09:54:46.7785142Z             {
2026-08-28T09:54:46.7785391Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7785553Z               "line": 3699
2026-08-28T09:54:46.7785700Z             },
2026-08-28T09:54:46.7785853Z             {
2026-08-28T09:54:46.7786106Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7786411Z               "line": 4671
2026-08-28T09:54:46.7786565Z             },
2026-08-28T09:54:46.7786716Z             {
2026-08-28T09:54:46.7786960Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7787106Z               "line": 4735
2026-08-28T09:54:46.7787269Z             }
2026-08-28T09:54:46.7787416Z           ]
2026-08-28T09:54:46.7787560Z         },
2026-08-28T09:54:46.7787721Z         "int": {
2026-08-28T09:54:46.7787884Z           "complete": true,
2026-08-28T09:54:46.7788036Z           "evidence": [
2026-08-28T09:54:46.7788180Z             {
2026-08-28T09:54:46.7788524Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.7788680Z               "line": 363
2026-08-28T09:54:46.7788834Z             }
2026-08-28T09:54:46.7789100Z           ]
2026-08-28T09:54:46.7789251Z         },
2026-08-28T09:54:46.7789408Z         "unit": {
2026-08-28T09:54:46.7789578Z           "complete": true,
2026-08-28T09:54:46.7789754Z           "evidence": [
2026-08-28T09:54:46.7789902Z             {
2026-08-28T09:54:46.7790160Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7790321Z               "line": 10432
2026-08-28T09:54:46.7790470Z             }
2026-08-28T09:54:46.7790622Z           ]
2026-08-28T09:54:46.7790765Z         }
2026-08-28T09:54:46.7790912Z       }
2026-08-28T09:54:46.7791057Z     },
2026-08-28T09:54:46.7791213Z     {
2026-08-28T09:54:46.7791442Z       "id": "REQ-HAZARD-INJECT-SETTLE-REARM",
2026-08-28T09:54:46.7802759Z       "title": "post-0.29.0 (KNOWN-HAZARDS 7.37): the Layer-1 settle-gate must RE-ARM before every delivery on an OBSERVABLE (echoing/interactive) PTY — a mid-session reader reattach re-creates the head-swallow window. ROOT (field-confirmed on 0.29.0, doyle diagnosis + perri screenshot): the shipped W5-A settle-gate (REQ-INJECT-MULTILINE-INTEGRITY) gated Layer 1 behind a worker-local ONE-SHOT (`settled_once`) on the false premise that the head-swallow race is STARTUP-only (reader not attached after spawn). A mid-session `/clear` re-enters the harness's raw-mode input reader, re-creating the pre-settle window — but the one-shot already fired at spawn, so `settle_before_inject` is SKIPPED and the head is eaten again (a checkpoint-wake payload injected right after `/clear` lost its head, mid-path `spt/Cargo.toml)`); echo-verify (Layer 2) is default-OFF for that session, so it is silent + unrecoverable. FIX (doyle ruling): re-settle before EVERY delivery on an observable PTY; latch-skip the steady-state settle ONLY where the probe is UNOBSERVABLE (non-echoing ConPTY — no reader-reattach race to guard, and each settle burns the full deadline). The settle's own bool return (observed vs timed-out) discriminates the class; a re-drive (attempt>1) ALWAYS settles. `settled_once: bool` one-shot → `probe_unobservable: bool` latch driven by the first-attempt settle outcome.",
2026-08-28T09:54:46.7803086Z       "requiredStages": [
2026-08-28T09:54:46.7803234Z         "doc",
2026-08-28T09:54:46.7803386Z         "impl",
2026-08-28T09:54:46.7803540Z         "unit"
2026-08-28T09:54:46.7803696Z       ],
2026-08-28T09:54:46.7803855Z       "stages": {
2026-08-28T09:54:46.7804006Z         "doc": {
2026-08-28T09:54:46.7804188Z           "complete": true,
2026-08-28T09:54:46.7804350Z           "evidence": [
2026-08-28T09:54:46.7804503Z             {
2026-08-28T09:54:46.7804726Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7804889Z               "line": 717
2026-08-28T09:54:46.7805041Z             }
2026-08-28T09:54:46.7805190Z           ]
2026-08-28T09:54:46.7805345Z         },
2026-08-28T09:54:46.7805502Z         "impl": {
2026-08-28T09:54:46.7805681Z           "complete": true,
2026-08-28T09:54:46.7805849Z           "evidence": [
2026-08-28T09:54:46.7806010Z             {
2026-08-28T09:54:46.7806258Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7806421Z               "line": 4581
2026-08-28T09:54:46.7806578Z             }
2026-08-28T09:54:46.7806821Z           ]
2026-08-28T09:54:46.7806978Z         },
2026-08-28T09:54:46.7807131Z         "int": {
2026-08-28T09:54:46.7807308Z           "complete": false,
2026-08-28T09:54:46.7807474Z           "evidence": []
2026-08-28T09:54:46.7807632Z         },
2026-08-28T09:54:46.7807803Z         "unit": {
2026-08-28T09:54:46.7807976Z           "complete": true,
2026-08-28T09:54:46.7808155Z           "evidence": [
2026-08-28T09:54:46.7808303Z             {
2026-08-28T09:54:46.7808550Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7808718Z               "line": 11415
2026-08-28T09:54:46.7808870Z             }
2026-08-28T09:54:46.7809114Z           ]
2026-08-28T09:54:46.7809267Z         }
2026-08-28T09:54:46.7809419Z       }
2026-08-28T09:54:46.7809567Z     },
2026-08-28T09:54:46.7809723Z     {
2026-08-28T09:54:46.7809963Z       "id": "REQ-HAZARD-INJECT-WORKER-POISON",
2026-08-28T09:54:46.7817873Z       "title": "The per-session inject-worker floor Mutex is SHARED by the inject worker (open/flush) and the controller-input path (dispatch_input Layer C buffer_if_held); a panic under the lock on EITHER poisons it, and a bare .lock().unwrap() at the next site then panics too — a panic in the inject WORKER kills its thread WITHOUT reaping the translation child, orphaning a live binary while event_tx.send fails, so force-native reports 'worker-gone' delivered=false FOREVER (the F-e generic-miss shape). HARDENING, NOT the F-e incident root (perri's matrix exonerated poison under thrash/dormancy/churn): (i) poison-tolerant floor lock (unwrap_or_else into_inner) at all 3 sites so one panic can't cascade the session's delivery dead; (ii) a panic-resilient inject worker (catch_unwind -> fault+terminate the child on a worker panic) so a dead worker never orphans a live binary + strands delivery. Poison-tolerance class of REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE / bug #16.",
2026-08-28T09:54:46.7818072Z       "requiredStages": [
2026-08-28T09:54:46.7818231Z         "impl",
2026-08-28T09:54:46.7818392Z         "unit"
2026-08-28T09:54:46.7818541Z       ],
2026-08-28T09:54:46.7819144Z       "stages": {
2026-08-28T09:54:46.7819312Z         "doc": {
2026-08-28T09:54:46.7819488Z           "complete": false,
2026-08-28T09:54:46.7819660Z           "evidence": []
2026-08-28T09:54:46.7819812Z         },
2026-08-28T09:54:46.7819969Z         "impl": {
2026-08-28T09:54:46.7820142Z           "complete": true,
2026-08-28T09:54:46.7820308Z           "evidence": [
2026-08-28T09:54:46.7820457Z             {
2026-08-28T09:54:46.7820713Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7820881Z               "line": 4086
2026-08-28T09:54:46.7821027Z             },
2026-08-28T09:54:46.7821179Z             {
2026-08-28T09:54:46.7821425Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7821583Z               "line": 4514
2026-08-28T09:54:46.7821735Z             }
2026-08-28T09:54:46.7821888Z           ]
2026-08-28T09:54:46.7822040Z         },
2026-08-28T09:54:46.7822203Z         "int": {
2026-08-28T09:54:46.7822384Z           "complete": false,
2026-08-28T09:54:46.7822551Z           "evidence": []
2026-08-28T09:54:46.7822709Z         },
2026-08-28T09:54:46.7822870Z         "unit": {
2026-08-28T09:54:46.7823047Z           "complete": true,
2026-08-28T09:54:46.7823218Z           "evidence": [
2026-08-28T09:54:46.7823381Z             {
2026-08-28T09:54:46.7823629Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7823795Z               "line": 10589
2026-08-28T09:54:46.7823946Z             },
2026-08-28T09:54:46.7824098Z             {
2026-08-28T09:54:46.7824350Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7824506Z               "line": 11491
2026-08-28T09:54:46.7824660Z             }
2026-08-28T09:54:46.7824807Z           ]
2026-08-28T09:54:46.7824961Z         }
2026-08-28T09:54:46.7825108Z       }
2026-08-28T09:54:46.7825265Z     },
2026-08-28T09:54:46.7825418Z     {
2026-08-28T09:54:46.7825661Z       "id": "REQ-HAZARD-INPUT-ACK-BACKPRESSURE",
2026-08-28T09:54:46.7845627Z       "title": "A FLOOD of operator input on one brain↔broker connection deadlocks the broker PERMANENTLY (entire broker — no new/existing attach; the controller stays latched because the per-conn handler can't process the detach). ROOT (doyle /diagnose, code-grounded + HITL capture, the v0.13.0 P1 ctrl+V re-open): `serve_attach` processes a whole `NetStreamData` batch of N operator `Input` records in its inner `for rec in decoder.push()` loop, calling `brain.send_effect(op_id, &bytes)` N times WITHOUT returning to `read_event()` — so the brain writes N `KIND_INPUT` frames back-to-back and drains nothing. The broker's single-threaded per-conn handler answers EACH with `send_frame(applied_envelope)` on the SAME conn (B5 exactly-once ack, KNOWN-HAZARDS 7.2). With the brain not reading, the broker→brain return direction fills (~10 frames = the IPC pipe buffer) → `send_frame` BLOCKS → the handler stops reading → the brain's writes block too → mutual full-duplex DEADLOCK. Capture pinned it: 11 input frames, write_input 11/11 (P0 holds — the PTY write is fine), ack send START=11 / END=10 (frame #11's applied-ack never returns). Same class as the v0.12.1 L0 two-conn split. Windows Terminal's ctrl+V paste accelerator was the trigger (injects the clipboard as a char-by-char key flood) but the deadlock is generic to ANY input flood, NOT ctrl+V-specific and NOT a P0 (PTY-write) or W1 (output-drain) regression. The applied-ack is load-bearing ONLY for `shellchan` (one-at-a-time spool delivery WAITS on `BrokerEvent::Applied`); `serve_attach` DISCARDS it (the operator/rc path is fire-and-forward, op_id for dedup only, never gates on the ack). FIX (doyle-approved): CONDITIONAL ACK — `InputReq` gains `ack: bool` (serde default = true, N-1-safe: an older brain's input still acks = today's behavior). `serve_attach`'s operator path calls `send_effect_no_ack` (ack=false) → `dispatch_input` writes NO applied frame → the per-conn handler never writes back while servicing the flood → it always drains → no deadlock (cures ANY input flood). `shellchan` keeps `send_effect` (ack=true) and its `Applied`-wait. Exactly-once PRESERVED: the broker still dedups by (session, op_id) at the applied-set regardless of the ack. N-1 caveat: an OLD resident broker (self-update window) ignores `ack=false` → still acks → the deadlock persists until a broker restart (inherent KNOWN-HAZARDS 7.9 broker-resident-wire-change class). (v0.13.0)",
2026-08-28T09:54:46.7845979Z       "requiredStages": [
2026-08-28T09:54:46.7846138Z         "doc",
2026-08-28T09:54:46.7846294Z         "impl",
2026-08-28T09:54:46.7846453Z         "unit",
2026-08-28T09:54:46.7846604Z         "int"
2026-08-28T09:54:46.7846753Z       ],
2026-08-28T09:54:46.7846910Z       "stages": {
2026-08-28T09:54:46.7847068Z         "doc": {
2026-08-28T09:54:46.7847243Z           "complete": true,
2026-08-28T09:54:46.7847411Z           "evidence": [
2026-08-28T09:54:46.7847562Z             {
2026-08-28T09:54:46.7847780Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7847945Z               "line": 567
2026-08-28T09:54:46.7848100Z             }
2026-08-28T09:54:46.7848255Z           ]
2026-08-28T09:54:46.7848399Z         },
2026-08-28T09:54:46.7848566Z         "impl": {
2026-08-28T09:54:46.7848742Z           "complete": true,
2026-08-28T09:54:46.7848914Z           "evidence": [
2026-08-28T09:54:46.7849156Z             {
2026-08-28T09:54:46.7849405Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.7849573Z               "line": 636
2026-08-28T09:54:46.7849724Z             },
2026-08-28T09:54:46.7849873Z             {
2026-08-28T09:54:46.7850110Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.7850303Z               "line": 904
2026-08-28T09:54:46.7850458Z             },
2026-08-28T09:54:46.7850616Z             {
2026-08-28T09:54:46.7850863Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.7851025Z               "line": 8423
2026-08-28T09:54:46.7851283Z             },
2026-08-28T09:54:46.7851440Z             {
2026-08-28T09:54:46.7851674Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.7851837Z               "line": 749
2026-08-28T09:54:46.7851988Z             }
2026-08-28T09:54:46.7852142Z           ]
2026-08-28T09:54:46.7852293Z         },
2026-08-28T09:54:46.7852442Z         "int": {
2026-08-28T09:54:46.7852617Z           "complete": true,
2026-08-28T09:54:46.7852783Z           "evidence": [
2026-08-28T09:54:46.7852943Z             {
2026-08-28T09:54:46.7853202Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7853367Z               "line": 776
2026-08-28T09:54:46.7853526Z             },
2026-08-28T09:54:46.7853677Z             {
2026-08-28T09:54:46.7853935Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.7854098Z               "line": 893
2026-08-28T09:54:46.7854250Z             },
2026-08-28T09:54:46.7854394Z             {
2026-08-28T09:54:46.7854728Z               "path": "crates/spt-daemon/tests/input_ack_deadlock.rs",
2026-08-28T09:54:46.7854899Z               "line": 279
2026-08-28T09:54:46.7855048Z             }
2026-08-28T09:54:46.7855203Z           ]
2026-08-28T09:54:46.7855353Z         },
2026-08-28T09:54:46.7855508Z         "unit": {
2026-08-28T09:54:46.7855684Z           "complete": true,
2026-08-28T09:54:46.7855854Z           "evidence": [
2026-08-28T09:54:46.7856002Z             {
2026-08-28T09:54:46.7856229Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.7856393Z               "line": 2206
2026-08-28T09:54:46.7856544Z             },
2026-08-28T09:54:46.7856698Z             {
2026-08-28T09:54:46.7856917Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:46.7857074Z               "line": 2240
2026-08-28T09:54:46.7857222Z             }
2026-08-28T09:54:46.7857375Z           ]
2026-08-28T09:54:46.7857512Z         }
2026-08-28T09:54:46.7857666Z       }
2026-08-28T09:54:46.7857808Z     },
2026-08-28T09:54:46.7857962Z     {
2026-08-28T09:54:46.7858188Z       "id": "REQ-HAZARD-INSTANT-UNDERFLOW",
2026-08-28T09:54:46.7860018Z       "title": "Scheduling never subtracts a Duration from Instant::now() (underflow-panics on a host booted more recently than the offset); 'due now / never run' is Option<Instant>=None gated on forward duration_since only (5.9)",
2026-08-28T09:54:46.7860205Z       "requiredStages": [
2026-08-28T09:54:46.7860360Z         "impl",
2026-08-28T09:54:46.7860524Z         "unit"
2026-08-28T09:54:46.7860675Z       ],
2026-08-28T09:54:46.7860839Z       "stages": {
2026-08-28T09:54:46.7860994Z         "doc": {
2026-08-28T09:54:46.7861176Z           "complete": false,
2026-08-28T09:54:46.7861351Z           "evidence": []
2026-08-28T09:54:46.7861500Z         },
2026-08-28T09:54:46.7861661Z         "impl": {
2026-08-28T09:54:46.7861833Z           "complete": true,
2026-08-28T09:54:46.7862005Z           "evidence": [
2026-08-28T09:54:46.7862153Z             {
2026-08-28T09:54:46.7862416Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.7862586Z               "line": 1607
2026-08-28T09:54:46.7862736Z             }
2026-08-28T09:54:46.7862887Z           ]
2026-08-28T09:54:46.7863031Z         },
2026-08-28T09:54:46.7863192Z         "int": {
2026-08-28T09:54:46.7863363Z           "complete": false,
2026-08-28T09:54:46.7863527Z           "evidence": []
2026-08-28T09:54:46.7863685Z         },
2026-08-28T09:54:46.7863861Z         "unit": {
2026-08-28T09:54:46.7864048Z           "complete": true,
2026-08-28T09:54:46.7864214Z           "evidence": [
2026-08-28T09:54:46.7864372Z             {
2026-08-28T09:54:46.7864620Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.7864795Z               "line": 1721
2026-08-28T09:54:46.7864944Z             }
2026-08-28T09:54:46.7865106Z           ]
2026-08-28T09:54:46.7865254Z         }
2026-08-28T09:54:46.7865401Z       }
2026-08-28T09:54:46.7865560Z     },
2026-08-28T09:54:46.7865706Z     {
2026-08-28T09:54:46.7865923Z       "id": "REQ-HAZARD-LISTEN-ORPHAN",
2026-08-28T09:54:46.7871375Z       "title": "W4 (LIFECYCLE-TRUTH, KNOWN-HAZARDS): `api listen --parent-pid N` watches parent liveness and exits loud on parent death. ROOT (mobile-gw RCA): --parent-pid is auth-anchor ONLY — no liveness watch; host death orphans the listener forever -> perch held alive (false ONLINE), EVENTs stream to a dead stdout, dead-owner rebind BLOCKED (recorded pid = the live orphan). FIX: listener watches --parent-pid liveness (Windows: job object or poll; Unix: PDEATHSIG or poll) and exits loud on parent death. flynn's job-object guard (spt-mobile side) stays regardless; filed SPT-CORE-NEEDS §5. Unit: parent-death -> listener exits within one poll window.",
2026-08-28T09:54:46.7871573Z       "requiredStages": [
2026-08-28T09:54:46.7871736Z         "impl",
2026-08-28T09:54:46.7871887Z         "unit"
2026-08-28T09:54:46.7872037Z       ],
2026-08-28T09:54:46.7872192Z       "stages": {
2026-08-28T09:54:46.7872347Z         "doc": {
2026-08-28T09:54:46.7872521Z           "complete": false,
2026-08-28T09:54:46.7872704Z           "evidence": []
2026-08-28T09:54:46.7872865Z         },
2026-08-28T09:54:46.7873019Z         "impl": {
2026-08-28T09:54:46.7873194Z           "complete": true,
2026-08-28T09:54:46.7873362Z           "evidence": [
2026-08-28T09:54:46.7873519Z             {
2026-08-28T09:54:46.7873761Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7873932Z               "line": 841
2026-08-28T09:54:46.7874083Z             },
2026-08-28T09:54:46.7874235Z             {
2026-08-28T09:54:46.7874478Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7874641Z               "line": 848
2026-08-28T09:54:46.7874802Z             },
2026-08-28T09:54:46.7874946Z             {
2026-08-28T09:54:46.7875185Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7875347Z               "line": 865
2026-08-28T09:54:46.7875499Z             },
2026-08-28T09:54:46.7875647Z             {
2026-08-28T09:54:46.7875909Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7876192Z               "line": 1058
2026-08-28T09:54:46.7876329Z             }
2026-08-28T09:54:46.7876487Z           ]
2026-08-28T09:54:46.7876628Z         },
2026-08-28T09:54:46.7876785Z         "int": {
2026-08-28T09:54:46.7876959Z           "complete": false,
2026-08-28T09:54:46.7877131Z           "evidence": []
2026-08-28T09:54:46.7877274Z         },
2026-08-28T09:54:46.7877432Z         "unit": {
2026-08-28T09:54:46.7877612Z           "complete": true,
2026-08-28T09:54:46.7877776Z           "evidence": [
2026-08-28T09:54:46.7877932Z             {
2026-08-28T09:54:46.7878161Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7878332Z               "line": 1723
2026-08-28T09:54:46.7878481Z             },
2026-08-28T09:54:46.7878633Z             {
2026-08-28T09:54:46.7878862Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.7879115Z               "line": 1767
2026-08-28T09:54:46.7879280Z             }
2026-08-28T09:54:46.7879428Z           ]
2026-08-28T09:54:46.7879583Z         }
2026-08-28T09:54:46.7879727Z       }
2026-08-28T09:54:46.7879879Z     },
2026-08-28T09:54:46.7880027Z     {
2026-08-28T09:54:46.7880304Z       "id": "REQ-HAZARD-LIVEHOST-BOOT-LIVENESS-GATE",
2026-08-28T09:54:46.7886756Z       "title": "B5: `spt daemon start` does NOT revive phantom Psyches for dead-but-online-latched perches. Today reconcile_once (livehost.rs:285) spawns a Psyche per status=online live_agent perch at boot WITHOUT verifying the harness child / {id}-psyche is actually alive — so a Cold start after an unclean stop revives N psyches for N dead-but-latched perches (3 psyches for 3 dead perches). FIX: gate the boot psyche-spawn on real child-liveness — a perch with NO live broker session (the B2 reconcile signal) is marked OFFLINE at boot instead of hosted, so a dead-harness perch is never revived. Shares the B2 reconcile loop (this is its boot-gate arm); composes with B2's honest latch. Also closes wall-a's psyche_host_error gap (residency-confirm does not run at boot tick-1, livehost.rs:395-441 / 257-263). (v0.12.0)",
2026-08-28T09:54:46.7887052Z       "requiredStages": [
2026-08-28T09:54:46.7887212Z         "impl",
2026-08-28T09:54:46.7887369Z         "unit",
2026-08-28T09:54:46.7887519Z         "int"
2026-08-28T09:54:46.7887677Z       ],
2026-08-28T09:54:46.7887834Z       "stages": {
2026-08-28T09:54:46.7887987Z         "doc": {
2026-08-28T09:54:46.7888158Z           "complete": false,
2026-08-28T09:54:46.7888336Z           "evidence": []
2026-08-28T09:54:46.7888482Z         },
2026-08-28T09:54:46.7888646Z         "impl": {
2026-08-28T09:54:46.7888816Z           "complete": true,
2026-08-28T09:54:46.7889069Z           "evidence": [
2026-08-28T09:54:46.7889232Z             {
2026-08-28T09:54:46.7889489Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7889652Z               "line": 1293
2026-08-28T09:54:46.7889802Z             }
2026-08-28T09:54:46.7889960Z           ]
2026-08-28T09:54:46.7890110Z         },
2026-08-28T09:54:46.7890268Z         "int": {
2026-08-28T09:54:46.7890439Z           "complete": true,
2026-08-28T09:54:46.7890602Z           "evidence": [
2026-08-28T09:54:46.7890758Z             {
2026-08-28T09:54:46.7891040Z               "path": "crates/spt/tests/livehost_bootgate_e2e.rs",
2026-08-28T09:54:46.7891208Z               "line": 24
2026-08-28T09:54:46.7891360Z             }
2026-08-28T09:54:46.7891513Z           ]
2026-08-28T09:54:46.7891660Z         },
2026-08-28T09:54:46.7891818Z         "unit": {
2026-08-28T09:54:46.7891993Z           "complete": true,
2026-08-28T09:54:46.7892167Z           "evidence": [
2026-08-28T09:54:46.7892322Z             {
2026-08-28T09:54:46.7892575Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.7892741Z               "line": 1725
2026-08-28T09:54:46.7892890Z             }
2026-08-28T09:54:46.7893041Z           ]
2026-08-28T09:54:46.7893190Z         }
2026-08-28T09:54:46.7893346Z       }
2026-08-28T09:54:46.7893500Z     },
2026-08-28T09:54:46.7893652Z     {
2026-08-28T09:54:46.7894024Z       "id": "REQ-HAZARD-LIVEHOST-BOOT-RACE",
2026-08-28T09:54:46.7903726Z       "title": "The brain's daemon-hosted Psyche lifecycle surfaces a host-FAILURE on the live perch (harness-diagnosable) and runs net-INDEPENDENTLY. When reconcile_once→host_one→spawn_psyche fails for a state=live_agent+status=online endpoint (e.g. the adapter's psyche binary absent from its install dir, REQ-INSTALL-11), the failure MUST be written to the perch info.json as a CURRENT-STATE field (reason + ts + attempt count; overwritten each 5s retry, CLEARED on successful host) and surfaced by `spt endpoint list`/status — never left as an eprintln on the brain's invisible stderr where a harness reading only perch state is blind. status=online stays authoritative (agent reachable; only the Psyche is missing — brain-restart rehydrate legitimately has online-without-Psyche windows), so this is a SEPARATE psyche-host-health field, never a status de-stamp. Net-independence is a locked-in invariant: spawn_live_host (brainproc.rs:230) reaches the reconcile and hosts the Psyche on a net-less/unpaired/peer-pump-STALLED node, proven by a REAL detached-daemon E2E (real broker→brain-child, real api seed+listen, real install-dir psyche binary). spt-core SURFACES the failure; the adapter owns fixing its packaging.",
2026-08-28T09:54:46.7903945Z       "requiredStages": [
2026-08-28T09:54:46.7904112Z         "impl",
2026-08-28T09:54:46.7904260Z         "unit"
2026-08-28T09:54:46.7904422Z       ],
2026-08-28T09:54:46.7904584Z       "stages": {
2026-08-28T09:54:46.7904737Z         "doc": {
2026-08-28T09:54:46.7904909Z           "complete": false,
2026-08-28T09:54:46.7905080Z           "evidence": []
2026-08-28T09:54:46.7905233Z         },
2026-08-28T09:54:46.7905385Z         "impl": {
2026-08-28T09:54:46.7905594Z           "complete": true,
2026-08-28T09:54:46.7905829Z           "evidence": [
2026-08-28T09:54:46.7905988Z             {
2026-08-28T09:54:46.7906497Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7906660Z               "line": 759
2026-08-28T09:54:46.7906817Z             },
2026-08-28T09:54:46.7906965Z             {
2026-08-28T09:54:46.7907170Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7907332Z               "line": 6591
2026-08-28T09:54:46.7907480Z             },
2026-08-28T09:54:46.7907623Z             {
2026-08-28T09:54:46.7907829Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7907994Z               "line": 12154
2026-08-28T09:54:46.7908144Z             }
2026-08-28T09:54:46.7908295Z           ]
2026-08-28T09:54:46.7908442Z         },
2026-08-28T09:54:46.7908598Z         "int": {
2026-08-28T09:54:46.7908769Z           "complete": false,
2026-08-28T09:54:46.7908936Z           "evidence": []
2026-08-28T09:54:46.7909175Z         },
2026-08-28T09:54:46.7909335Z         "unit": {
2026-08-28T09:54:46.7909513Z           "complete": true,
2026-08-28T09:54:46.7909684Z           "evidence": [
2026-08-28T09:54:46.7909847Z             {
2026-08-28T09:54:46.7910081Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.7910252Z               "line": 1622
2026-08-28T09:54:46.7910400Z             },
2026-08-28T09:54:46.7910556Z             {
2026-08-28T09:54:46.7910754Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.7910923Z               "line": 28639
2026-08-28T09:54:46.7911071Z             }
2026-08-28T09:54:46.7911226Z           ]
2026-08-28T09:54:46.7911412Z         }
2026-08-28T09:54:46.7911559Z       }
2026-08-28T09:54:46.7911713Z     },
2026-08-28T09:54:46.7911854Z     {
2026-08-28T09:54:46.7912089Z       "id": "REQ-HAZARD-LIVEHOST-NONRESIDENT",
2026-08-28T09:54:46.7921342Z       "title": "A daemon-hosted Psyche that spawns then EXITS IMMEDIATELY is a host failure, surfaced like a spawn failure (closes the v0.8.1 residual masking): the REQ-HAZARD-LIVEHOST-BOOT-RACE signal stamps `psyche_host_error` only when `spawn_psyche` returns Err, NOT when the detached spawn() returns Ok but the child dies within moments (e.g. a bad-argv child exiting 2 — the F-009 case). That leaves the residual 'online + no Psyche + no cause' gap: the nested `{id}-psyche` info.json is written status=online with a real-but-DEAD pid and the PARENT perch carries NO psyche_host_error (perri's F-010: tasklist showed 0 host procs across the window while info.json read online). The host MUST confirm RESIDENCY — a hosted child not alive (or whose `{id}-psyche` perch never re-registers / has a dead pid) within N seconds of spawn is treated as a host failure: stamp the parent perch `psyche_host_error{reason:\"host not resident within <n>s (psyche perch missing/dead pid)\"}` (and do not leave a phantom online nested perch). Closes the last masking gap the v0.8.1 fix left open. perri's F-010 (v0.8.1 dogfood). Sibling of REQ-HAZARD-LIVEHOST-BOOT-RACE.",
2026-08-28T09:54:46.7921669Z       "requiredStages": [],
2026-08-28T09:54:46.7921828Z       "stages": {
2026-08-28T09:54:46.7921991Z         "doc": {
2026-08-28T09:54:46.7922167Z           "complete": false,
2026-08-28T09:54:46.7922344Z           "evidence": []
2026-08-28T09:54:46.7922496Z         },
2026-08-28T09:54:46.7922658Z         "impl": {
2026-08-28T09:54:46.7922830Z           "complete": false,
2026-08-28T09:54:46.7922997Z           "evidence": []
2026-08-28T09:54:46.7923154Z         },
2026-08-28T09:54:46.7923302Z         "int": {
2026-08-28T09:54:46.7923474Z           "complete": false,
2026-08-28T09:54:46.7923640Z           "evidence": []
2026-08-28T09:54:46.7923794Z         },
2026-08-28T09:54:46.7923950Z         "unit": {
2026-08-28T09:54:46.7924129Z           "complete": false,
2026-08-28T09:54:46.7924289Z           "evidence": []
2026-08-28T09:54:46.7924441Z         }
2026-08-28T09:54:46.7924590Z       }
2026-08-28T09:54:46.7924745Z     },
2026-08-28T09:54:46.7924894Z     {
2026-08-28T09:54:46.7925104Z       "id": "REQ-HAZARD-LOCAL-API-AUTH",
2026-08-28T09:54:46.7925719Z       "title": "Every local `api` mutation authenticated to an endpoint/session (codex #13)",
2026-08-28T09:54:46.7926257Z       "requiredStages": [
2026-08-28T09:54:46.7926421Z         "impl",
2026-08-28T09:54:46.7926571Z         "unit"
2026-08-28T09:54:46.7926719Z       ],
2026-08-28T09:54:46.7926879Z       "stages": {
2026-08-28T09:54:46.7927036Z         "doc": {
2026-08-28T09:54:46.7927208Z           "complete": false,
2026-08-28T09:54:46.7927370Z           "evidence": []
2026-08-28T09:54:46.7927522Z         },
2026-08-28T09:54:46.7927681Z         "impl": {
2026-08-28T09:54:46.7927856Z           "complete": true,
2026-08-28T09:54:46.7928019Z           "evidence": [
2026-08-28T09:54:46.7928180Z             {
2026-08-28T09:54:46.7928404Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7928566Z               "line": 14
2026-08-28T09:54:46.7928719Z             },
2026-08-28T09:54:46.7928867Z             {
2026-08-28T09:54:46.7929196Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:46.7929359Z               "line": 959
2026-08-28T09:54:46.7929514Z             }
2026-08-28T09:54:46.7929666Z           ]
2026-08-28T09:54:46.7929826Z         },
2026-08-28T09:54:46.7929980Z         "int": {
2026-08-28T09:54:46.7930155Z           "complete": false,
2026-08-28T09:54:46.7930323Z           "evidence": []
2026-08-28T09:54:46.7930470Z         },
2026-08-28T09:54:46.7930628Z         "unit": {
2026-08-28T09:54:46.7930799Z           "complete": true,
2026-08-28T09:54:46.7930962Z           "evidence": [
2026-08-28T09:54:46.7931109Z             {
2026-08-28T09:54:46.7931329Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7931492Z               "line": 331
2026-08-28T09:54:46.7931643Z             },
2026-08-28T09:54:46.7931797Z             {
2026-08-28T09:54:46.7932014Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7932181Z               "line": 339
2026-08-28T09:54:46.7932332Z             },
2026-08-28T09:54:46.7932494Z             {
2026-08-28T09:54:46.7932708Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7932876Z               "line": 347
2026-08-28T09:54:46.7933167Z             },
2026-08-28T09:54:46.7933318Z             {
2026-08-28T09:54:46.7933538Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7933696Z               "line": 355
2026-08-28T09:54:46.7933849Z             },
2026-08-28T09:54:46.7933996Z             {
2026-08-28T09:54:46.7934210Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7934369Z               "line": 363
2026-08-28T09:54:46.7934525Z             },
2026-08-28T09:54:46.7934679Z             {
2026-08-28T09:54:46.7934886Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.7935053Z               "line": 371
2026-08-28T09:54:46.7935201Z             }
2026-08-28T09:54:46.7935354Z           ]
2026-08-28T09:54:46.7935502Z         }
2026-08-28T09:54:46.7935655Z       }
2026-08-28T09:54:46.7935798Z     },
2026-08-28T09:54:46.7935950Z     {
2026-08-28T09:54:46.7936188Z       "id": "REQ-HAZARD-MESH-BOOTSTRAP-TRAP",
2026-08-28T09:54:46.7945982Z       "title": "MESH-RECOVERY W1 (KNOWN-HAZARDS 7.42, hertz field RCA 2026-07-10 — HFENDULEAM+ENLYZEAM symmetric green-status sequester): a node holding a valid RosterEntry.address for a peer is NEVER route-less — a failed dial must not delete the only bootstrap route, and recovery must never require an already-successful connection or operator state surgery. Today: resolve_submit_addr = exact cache else id-only (never roster), PRESENCE_DIAL_FAILED unconditionally drop_seed's the cache row, and the cache refills only after a successful seed-proof exchange — one transient + stalled discovery = self-sustaining isolation, invisible (net_up true, heartbeat fresh, durable counts normal). Gate: int — production-path regression at the REAL pump resolver/failure-lifecycle seam: valid roster + matching cache, ONE transient dial failure, id-only discovery DISABLED, prove the next attempt still holds the roster-derived route AND all-peer-fail-then-restore converges with zero state surgery; doc — KNOWN-HAZARDS 7.42. HEAVY nextest group at birth if it spawns a daemon tree. Kin REQ-PEER-ROUTE-CHAIN (the mechanism), REQ-CONV-1 (the falsified drop-on-fail predecessor), ADR-0039.",
2026-08-28T09:54:46.7946320Z       "requiredStages": [
2026-08-28T09:54:46.7946481Z         "doc",
2026-08-28T09:54:46.7946630Z         "int"
2026-08-28T09:54:46.7946781Z       ],
2026-08-28T09:54:46.7946935Z       "stages": {
2026-08-28T09:54:46.7947091Z         "doc": {
2026-08-28T09:54:46.7947278Z           "complete": true,
2026-08-28T09:54:46.7947440Z           "evidence": [
2026-08-28T09:54:46.7947593Z             {
2026-08-28T09:54:46.7947801Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7947966Z               "line": 760
2026-08-28T09:54:46.7948113Z             },
2026-08-28T09:54:46.7948267Z             {
2026-08-28T09:54:46.7948505Z               "path": "docs/MESH-RECOVERY-TRIAGE.md",
2026-08-28T09:54:46.7948666Z               "line": 3
2026-08-28T09:54:46.7948825Z             }
2026-08-28T09:54:46.7949048Z           ]
2026-08-28T09:54:46.7949205Z         },
2026-08-28T09:54:46.7949358Z         "impl": {
2026-08-28T09:54:46.7949534Z           "complete": false,
2026-08-28T09:54:46.7949706Z           "evidence": []
2026-08-28T09:54:46.7949858Z         },
2026-08-28T09:54:46.7950011Z         "int": {
2026-08-28T09:54:46.7950192Z           "complete": true,
2026-08-28T09:54:46.7950365Z           "evidence": [
2026-08-28T09:54:46.7950511Z             {
2026-08-28T09:54:46.7950801Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:46.7950961Z               "line": 227
2026-08-28T09:54:46.7951115Z             }
2026-08-28T09:54:46.7954420Z           ]
2026-08-28T09:54:46.7954602Z         },
2026-08-28T09:54:46.7954768Z         "unit": {
2026-08-28T09:54:46.7954954Z           "complete": false,
2026-08-28T09:54:46.7955130Z           "evidence": []
2026-08-28T09:54:46.7955292Z         }
2026-08-28T09:54:46.7955435Z       }
2026-08-28T09:54:46.7955603Z     },
2026-08-28T09:54:46.7955750Z     {
2026-08-28T09:54:46.7956193Z       "id": "REQ-HAZARD-MONITOR-GREEN-SELF-PRODUCIBLE",
2026-08-28T09:54:46.7975169Z       "title": "HAZARD: a monitor green state must never be REACHABLE BY the fault that monitor exists to report. A surface that can certify a broken system as healthy is worse than no surface, because it ends the operator investigation rather than merely failing to start it. Paid for twice on one surface in one batch: the 2026-07-10 sequester (net_up meant a local host object exists, the heartbeat meant the loop is alive, durable counts meant membership -- none was a function of reaching a peer, so all three stayed green while every dial failed), and then AGAIN in the fix for it (issue #41: the reachability verdict returned Healthy on any live peer BEFORE consulting the failing set, and its only incident window required every target to be failing, so 2 of 7 live with 5 failing for days read healthy and one dial success closed the window). The second instance is the binding lesson: at-least-one-thing-works is the intuitive spelling of green and it is precisely the spelling the fault can satisfy. Forbidden state: any state reachable by the fault that the surface reports as green. Invariant: green asserts the ABSENCE of the fault, never the PRESENCE of some success -- nothing failing rather than something working; a partial fault renders its own verdict instead of collapsing into a neighbour; an incident window closes only when the fault clears, never on one participant recovery, elapsed time, or a heartbeat. Corollary: dropping the failing subject from the monitored set produces green just as silently, so every membership-change path is a re-entry path and must be examined as one (the known open door is documented in KNOWN-HAZARDS 7.61 rather than closed here). Twin: REQ-PEER-HEALTH-PARTIAL-DEGRADE, the positive requirement repairing instance 2. Kin REQ-PUMP-STAGE-TRUTH (the total-failure fingerprint and stage attribution, produced by instance 1 and unchanged here). Distinct from the instrument-soundness rule about TEST gates, which governs a rig verdict rather than a production monitor and is never requirement evidence. Gate: doc -- the KNOWN-HAZARDS 7.61 entry naming the class, both instances, and the open eviction door; unit -- the fault at full strength (five of seven peers failing behind two live ones) is asserted NOT green in its own terms; int -- on the real pump seam, the dial path does not emit the reading it would produce in the benign case (plain discovery) while sitting in the fault (a held roster address that was refused).",
2026-08-28T09:54:46.7975484Z       "requiredStages": [
2026-08-28T09:54:46.7975646Z         "doc",
2026-08-28T09:54:46.7975793Z         "unit",
2026-08-28T09:54:46.7975945Z         "int"
2026-08-28T09:54:46.7976089Z       ],
2026-08-28T09:54:46.7976250Z       "stages": {
2026-08-28T09:54:46.7976399Z         "doc": {
2026-08-28T09:54:46.7976580Z           "complete": true,
2026-08-28T09:54:46.7976755Z           "evidence": [
2026-08-28T09:54:46.7976915Z             {
2026-08-28T09:54:46.7977132Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7977299Z               "line": 938
2026-08-28T09:54:46.7977447Z             }
2026-08-28T09:54:46.7977590Z           ]
2026-08-28T09:54:46.7977742Z         },
2026-08-28T09:54:46.7977895Z         "impl": {
2026-08-28T09:54:46.7978071Z           "complete": false,
2026-08-28T09:54:46.7978239Z           "evidence": []
2026-08-28T09:54:46.7978391Z         },
2026-08-28T09:54:46.7978544Z         "int": {
2026-08-28T09:54:46.7978715Z           "complete": true,
2026-08-28T09:54:46.7978883Z           "evidence": [
2026-08-28T09:54:46.7979115Z             {
2026-08-28T09:54:46.7979410Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:46.7979572Z               "line": 583
2026-08-28T09:54:46.7979722Z             }
2026-08-28T09:54:46.7979870Z           ]
2026-08-28T09:54:46.7980018Z         },
2026-08-28T09:54:46.7980171Z         "unit": {
2026-08-28T09:54:46.7980347Z           "complete": true,
2026-08-28T09:54:46.7980777Z           "evidence": [
2026-08-28T09:54:46.7980920Z             {
2026-08-28T09:54:46.7981196Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:46.7981353Z               "line": 660
2026-08-28T09:54:46.7981506Z             }
2026-08-28T09:54:46.7981649Z           ]
2026-08-28T09:54:46.7981793Z         }
2026-08-28T09:54:46.7981945Z       }
2026-08-28T09:54:46.7982089Z     },
2026-08-28T09:54:46.7982235Z     {
2026-08-28T09:54:46.7982477Z       "id": "REQ-HAZARD-MUTUAL-PREAUTH-SIBLING",
2026-08-28T09:54:46.7996971Z       "title": "A DEDUPE KEY NARROWER THAN THE RECORD'S IDENTITY SILENTLY DESTROYS A SIBLING. Re-arming a mutual pre-authorization REPLACES rather than stacks, so a re-knock cannot accumulate duplicate reverse grants -- but the identity that replacement tests is `(kind, key_id, OWNER)`, never `(kind, key_id)`. A single code id is legitimately shared by TWO pre-authorizations with different owners: the MINTER's, armed at mint, whose subject is empty because no redeemer exists yet, and the REDEEMER's own, armed at redemption, whose subject is known. Keyed without the owner, arming the second would find the first and overwrite it in place, and one side of an agreed two-way would simply VANISH -- no error, no refusal, no second grant to notice missing; the surviving side would look entirely correct on its own. The dedupe is not wrong to exist, it is wrong when its key is narrower than the thing it is deduplicating, and the narrower key is the one a reader reaches for first because `(kind, key_id)` is how every OTHER seam here addresses a pre-authorization. The asymmetry with the consuming seam is deliberate and must not be 'fixed' into agreement: `consume_redeemed` filters on `(kind, key_id)` WITHOUT the owner precisely because a redemption must make BOTH siblings due at once, while `armed_mutual`/`consume_mutual` serve the knock keyspace, where only the knocker's single record exists. INVARIANT: any replace-in-place keyed lookup states the FULL identity of the record it replaces; where a key is deliberately narrower than a record's identity, the seam says why and a test pins that two records sharing the narrow key both survive. Gate: doc -- the KNOWN-HAZARDS entry stating the sibling mechanism and the deliberate arm/consume asymmetry; impl -- the owner-inclusive match in the arming seam; unit -- two pre-authorizations sharing one code id under different owners both survive arming and are BOTH made due by one redemption, with a bystander code untouched and a replay finding nothing left.",
2026-08-28T09:54:46.7997313Z       "requiredStages": [
2026-08-28T09:54:46.7997472Z         "doc",
2026-08-28T09:54:46.7997628Z         "impl",
2026-08-28T09:54:46.7997782Z         "unit"
2026-08-28T09:54:46.7997934Z       ],
2026-08-28T09:54:46.7998092Z       "stages": {
2026-08-28T09:54:46.7998247Z         "doc": {
2026-08-28T09:54:46.7998424Z           "complete": true,
2026-08-28T09:54:46.7998595Z           "evidence": [
2026-08-28T09:54:46.7998749Z             {
2026-08-28T09:54:46.7999059Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.7999219Z               "line": 959
2026-08-28T09:54:46.7999374Z             }
2026-08-28T09:54:46.7999530Z           ]
2026-08-28T09:54:46.7999679Z         },
2026-08-28T09:54:46.7999840Z         "impl": {
2026-08-28T09:54:46.8000008Z           "complete": true,
2026-08-28T09:54:46.8000178Z           "evidence": [
2026-08-28T09:54:46.8000328Z             {
2026-08-28T09:54:46.8000568Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:46.8000729Z               "line": 1381
2026-08-28T09:54:46.8000885Z             }
2026-08-28T09:54:46.8001039Z           ]
2026-08-28T09:54:46.8001186Z         },
2026-08-28T09:54:46.8001339Z         "int": {
2026-08-28T09:54:46.8001519Z           "complete": false,
2026-08-28T09:54:46.8001687Z           "evidence": []
2026-08-28T09:54:46.8001839Z         },
2026-08-28T09:54:46.8001997Z         "unit": {
2026-08-28T09:54:46.8002173Z           "complete": true,
2026-08-28T09:54:46.8002450Z           "evidence": [
2026-08-28T09:54:46.8002608Z             {
2026-08-28T09:54:46.8002837Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:46.8003007Z               "line": 2908
2026-08-28T09:54:46.8003156Z             }
2026-08-28T09:54:46.8003312Z           ]
2026-08-28T09:54:46.8003459Z         }
2026-08-28T09:54:46.8003611Z       }
2026-08-28T09:54:46.8003757Z     },
2026-08-28T09:54:46.8003906Z     {
2026-08-28T09:54:46.8004125Z       "id": "REQ-HAZARD-PAIR-RATE-LIMIT",
2026-08-28T09:54:46.8006497Z       "title": "Subnet-global pairing rate limit: one active ceremony per subnet, shared attempt counter, exponential backoff — a public pre-trust relay + multiple seed-holders otherwise enables distributed SPAKE2 guessing (and ±1 TOTP window triples the valid-password space) (ADR-0005 #11)",
2026-08-28T09:54:46.8006681Z       "requiredStages": [
2026-08-28T09:54:46.8006840Z         "impl",
2026-08-28T09:54:46.8007011Z         "unit"
2026-08-28T09:54:46.8007164Z       ],
2026-08-28T09:54:46.8007336Z       "stages": {
2026-08-28T09:54:46.8007492Z         "doc": {
2026-08-28T09:54:46.8007660Z           "complete": false,
2026-08-28T09:54:46.8007831Z           "evidence": []
2026-08-28T09:54:46.8007980Z         },
2026-08-28T09:54:46.8008136Z         "impl": {
2026-08-28T09:54:46.8008300Z           "complete": true,
2026-08-28T09:54:46.8008469Z           "evidence": [
2026-08-28T09:54:46.8008619Z             {
2026-08-28T09:54:46.8008931Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8009193Z               "line": 34
2026-08-28T09:54:46.8009342Z             }
2026-08-28T09:54:46.8009494Z           ]
2026-08-28T09:54:46.8009643Z         },
2026-08-28T09:54:46.8009799Z         "int": {
2026-08-28T09:54:46.8009962Z           "complete": false,
2026-08-28T09:54:46.8010132Z           "evidence": []
2026-08-28T09:54:46.8010287Z         },
2026-08-28T09:54:46.8010443Z         "unit": {
2026-08-28T09:54:46.8010734Z           "complete": true,
2026-08-28T09:54:46.8010902Z           "evidence": [
2026-08-28T09:54:46.8011062Z             {
2026-08-28T09:54:46.8011369Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8011532Z               "line": 188
2026-08-28T09:54:46.8011684Z             },
2026-08-28T09:54:46.8011832Z             {
2026-08-28T09:54:46.8012128Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8012290Z               "line": 200
2026-08-28T09:54:46.8012448Z             },
2026-08-28T09:54:46.8012595Z             {
2026-08-28T09:54:46.8012895Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8013057Z               "line": 211
2026-08-28T09:54:46.8013214Z             },
2026-08-28T09:54:46.8013358Z             {
2026-08-28T09:54:46.8013658Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8013817Z               "line": 253
2026-08-28T09:54:46.8013972Z             },
2026-08-28T09:54:46.8014125Z             {
2026-08-28T09:54:46.8014423Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8014584Z               "line": 277
2026-08-28T09:54:46.8014734Z             },
2026-08-28T09:54:46.8014894Z             {
2026-08-28T09:54:46.8015186Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8015348Z               "line": 300
2026-08-28T09:54:46.8015500Z             },
2026-08-28T09:54:46.8015648Z             {
2026-08-28T09:54:46.8015949Z               "path": "crates/spt-net/src/net/pairing/ratelimit.rs",
2026-08-28T09:54:46.8016110Z               "line": 316
2026-08-28T09:54:46.8016264Z             }
2026-08-28T09:54:46.8016416Z           ]
2026-08-28T09:54:46.8016581Z         }
2026-08-28T09:54:46.8016728Z       }
2026-08-28T09:54:46.8016879Z     },
2026-08-28T09:54:46.8017033Z     {
2026-08-28T09:54:46.8017256Z       "id": "REQ-HAZARD-PAIR-SEED-ROTATION",
2026-08-28T09:54:46.8018791Z       "title": "Removing a node rotates the subnet seed (epoch bump) so an old node/old seed cannot rejoin; trust-store delete alone is NOT revocation because the seed is replicated to every trusted node (ADR-0005 #10)",
2026-08-28T09:54:46.8019199Z       "requiredStages": [
2026-08-28T09:54:46.8019363Z         "impl",
2026-08-28T09:54:46.8019516Z         "unit"
2026-08-28T09:54:46.8019668Z       ],
2026-08-28T09:54:46.8019826Z       "stages": {
2026-08-28T09:54:46.8019979Z         "doc": {
2026-08-28T09:54:46.8020155Z           "complete": false,
2026-08-28T09:54:46.8020317Z           "evidence": []
2026-08-28T09:54:46.8020465Z         },
2026-08-28T09:54:46.8020617Z         "impl": {
2026-08-28T09:54:46.8020794Z           "complete": true,
2026-08-28T09:54:46.8020956Z           "evidence": [
2026-08-28T09:54:46.8021114Z             {
2026-08-28T09:54:46.8021356Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8021514Z               "line": 41
2026-08-28T09:54:46.8021670Z             },
2026-08-28T09:54:46.8021818Z             {
2026-08-28T09:54:46.8022054Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8022216Z               "line": 297
2026-08-28T09:54:46.8022373Z             },
2026-08-28T09:54:46.8022526Z             {
2026-08-28T09:54:46.8022770Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8022940Z               "line": 337
2026-08-28T09:54:46.8023089Z             },
2026-08-28T09:54:46.8023240Z             {
2026-08-28T09:54:46.8023465Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8023632Z               "line": 440
2026-08-28T09:54:46.8023775Z             }
2026-08-28T09:54:46.8023932Z           ]
2026-08-28T09:54:46.8024076Z         },
2026-08-28T09:54:46.8024233Z         "int": {
2026-08-28T09:54:46.8024414Z           "complete": false,
2026-08-28T09:54:46.8024579Z           "evidence": []
2026-08-28T09:54:46.8024741Z         },
2026-08-28T09:54:46.8025007Z         "unit": {
2026-08-28T09:54:46.8025183Z           "complete": true,
2026-08-28T09:54:46.8025355Z           "evidence": [
2026-08-28T09:54:46.8025517Z             {
2026-08-28T09:54:46.8025746Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8025913Z               "line": 681
2026-08-28T09:54:46.8026065Z             },
2026-08-28T09:54:46.8026209Z             {
2026-08-28T09:54:46.8026442Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8026600Z               "line": 696
2026-08-28T09:54:46.8026752Z             },
2026-08-28T09:54:46.8026901Z             {
2026-08-28T09:54:46.8027136Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8027293Z               "line": 925
2026-08-28T09:54:46.8027449Z             },
2026-08-28T09:54:46.8027603Z             {
2026-08-28T09:54:46.8027831Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8027998Z               "line": 960
2026-08-28T09:54:46.8028151Z             },
2026-08-28T09:54:46.8028308Z             {
2026-08-28T09:54:46.8028541Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8028708Z               "line": 1019
2026-08-28T09:54:46.8028861Z             },
2026-08-28T09:54:46.8029100Z             {
2026-08-28T09:54:46.8029338Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8029500Z               "line": 1033
2026-08-28T09:54:46.8029653Z             },
2026-08-28T09:54:46.8029801Z             {
2026-08-28T09:54:46.8030037Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8030200Z               "line": 1044
2026-08-28T09:54:46.8030357Z             },
2026-08-28T09:54:46.8030510Z             {
2026-08-28T09:54:46.8030734Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:46.8030896Z               "line": 1127
2026-08-28T09:54:46.8031045Z             }
2026-08-28T09:54:46.8031197Z           ]
2026-08-28T09:54:46.8031345Z         }
2026-08-28T09:54:46.8031506Z       }
2026-08-28T09:54:46.8031650Z     },
2026-08-28T09:54:46.8031921Z     {
2026-08-28T09:54:46.8032159Z       "id": "REQ-HAZARD-PAIR-TRANSCRIPT-BIND",
2026-08-28T09:54:46.8033858Z       "title": "Pairing transcript binds roles, both node pubkeys, subnet ID, seed epoch, TOTP time-step, and confirmation MACs — or unknown-key-share/reflection/wrong-subnet/replay pairing remain possible (ADR-0005 #12)",
2026-08-28T09:54:46.8034034Z       "requiredStages": [
2026-08-28T09:54:46.8034202Z         "impl",
2026-08-28T09:54:46.8034387Z         "unit"
2026-08-28T09:54:46.8034537Z       ],
2026-08-28T09:54:46.8034711Z       "stages": {
2026-08-28T09:54:46.8034861Z         "doc": {
2026-08-28T09:54:46.8035040Z           "complete": false,
2026-08-28T09:54:46.8035211Z           "evidence": []
2026-08-28T09:54:46.8035366Z         },
2026-08-28T09:54:46.8035524Z         "impl": {
2026-08-28T09:54:46.8035690Z           "complete": true,
2026-08-28T09:54:46.8035854Z           "evidence": [
2026-08-28T09:54:46.8036033Z             {
2026-08-28T09:54:46.8036311Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8036468Z               "line": 35
2026-08-28T09:54:46.8036621Z             },
2026-08-28T09:54:46.8036764Z             {
2026-08-28T09:54:46.8037021Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8037189Z               "line": 228
2026-08-28T09:54:46.8037336Z             },
2026-08-28T09:54:46.8037494Z             {
2026-08-28T09:54:46.8037764Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8037933Z               "line": 271
2026-08-28T09:54:46.8038091Z             },
2026-08-28T09:54:46.8038238Z             {
2026-08-28T09:54:46.8038511Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8038667Z               "line": 300
2026-08-28T09:54:46.8038830Z             },
2026-08-28T09:54:46.8039064Z             {
2026-08-28T09:54:46.8039435Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8039694Z               "line": 31
2026-08-28T09:54:46.8039869Z             },
2026-08-28T09:54:46.8040037Z             {
2026-08-28T09:54:46.8040352Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8040517Z               "line": 113
2026-08-28T09:54:46.8040665Z             },
2026-08-28T09:54:46.8040817Z             {
2026-08-28T09:54:46.8041122Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8041290Z               "line": 138
2026-08-28T09:54:46.8041437Z             }
2026-08-28T09:54:46.8041595Z           ]
2026-08-28T09:54:46.8041742Z         },
2026-08-28T09:54:46.8041895Z         "int": {
2026-08-28T09:54:46.8042066Z           "complete": false,
2026-08-28T09:54:46.8042230Z           "evidence": []
2026-08-28T09:54:46.8042381Z         },
2026-08-28T09:54:46.8042534Z         "unit": {
2026-08-28T09:54:46.8042705Z           "complete": true,
2026-08-28T09:54:46.8042871Z           "evidence": [
2026-08-28T09:54:46.8043031Z             {
2026-08-28T09:54:46.8043304Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8043469Z               "line": 379
2026-08-28T09:54:46.8043627Z             },
2026-08-28T09:54:46.8043779Z             {
2026-08-28T09:54:46.8044046Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8044205Z               "line": 394
2026-08-28T09:54:46.8044356Z             },
2026-08-28T09:54:46.8044505Z             {
2026-08-28T09:54:46.8044782Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8044942Z               "line": 411
2026-08-28T09:54:46.8045092Z             },
2026-08-28T09:54:46.8045243Z             {
2026-08-28T09:54:46.8045511Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8045757Z               "line": 428
2026-08-28T09:54:46.8045998Z             },
2026-08-28T09:54:46.8046147Z             {
2026-08-28T09:54:46.8046423Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8046700Z               "line": 445
2026-08-28T09:54:46.8046857Z             },
2026-08-28T09:54:46.8046990Z             {
2026-08-28T09:54:46.8047261Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:46.8047430Z               "line": 563
2026-08-28T09:54:46.8047581Z             },
2026-08-28T09:54:46.8047730Z             {
2026-08-28T09:54:46.8048045Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8048205Z               "line": 179
2026-08-28T09:54:46.8048357Z             },
2026-08-28T09:54:46.8048512Z             {
2026-08-28T09:54:46.8048817Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8049071Z               "line": 194
2026-08-28T09:54:46.8049217Z             },
2026-08-28T09:54:46.8049376Z             {
2026-08-28T09:54:46.8049681Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8049847Z               "line": 204
2026-08-28T09:54:46.8050010Z             },
2026-08-28T09:54:46.8050158Z             {
2026-08-28T09:54:46.8050463Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8050621Z               "line": 259
2026-08-28T09:54:46.8050773Z             },
2026-08-28T09:54:46.8050931Z             {
2026-08-28T09:54:46.8051235Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8051391Z               "line": 269
2026-08-28T09:54:46.8051545Z             },
2026-08-28T09:54:46.8051691Z             {
2026-08-28T09:54:46.8051992Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:46.8052155Z               "line": 283
2026-08-28T09:54:46.8052307Z             }
2026-08-28T09:54:46.8052450Z           ]
2026-08-28T09:54:46.8052603Z         }
2026-08-28T09:54:46.8052756Z       }
2026-08-28T09:54:46.8052903Z     },
2026-08-28T09:54:46.8053157Z     {
2026-08-28T09:54:46.8053378Z       "id": "REQ-HAZARD-PARENT-PID-PREFER",
2026-08-28T09:54:46.8053840Z       "title": "Prefer stable parent PID / broker handle over ephemeral PID (2.1)",
2026-08-28T09:54:46.8054015Z       "requiredStages": [],
2026-08-28T09:54:46.8054173Z       "stages": {
2026-08-28T09:54:46.8054325Z         "doc": {
2026-08-28T09:54:46.8054502Z           "complete": false,
2026-08-28T09:54:46.8054669Z           "evidence": []
2026-08-28T09:54:46.8054812Z         },
2026-08-28T09:54:46.8054969Z         "impl": {
2026-08-28T09:54:46.8055141Z           "complete": false,
2026-08-28T09:54:46.8055308Z           "evidence": []
2026-08-28T09:54:46.8055451Z         },
2026-08-28T09:54:46.8055613Z         "int": {
2026-08-28T09:54:46.8055784Z           "complete": false,
2026-08-28T09:54:46.8055952Z           "evidence": []
2026-08-28T09:54:46.8056109Z         },
2026-08-28T09:54:46.8056260Z         "unit": {
2026-08-28T09:54:46.8056435Z           "complete": false,
2026-08-28T09:54:46.8056601Z           "evidence": []
2026-08-28T09:54:46.8056755Z         }
2026-08-28T09:54:46.8056906Z       }
2026-08-28T09:54:46.8057054Z     },
2026-08-28T09:54:46.8057197Z     {
2026-08-28T09:54:46.8057474Z       "id": "REQ-HAZARD-PERCH-GC-LIVENESS-INVERSION",
2026-08-28T09:54:46.8066627Z       "title": "A perch GC must NEVER key on `is_perch_alive` — on the residue population that predicate is INVERTED (3.5; measured HFENDULEAM 2026-08-04). `spt_store::liveness::is_perch_alive` returns TRUE for a directory with no `info.json` (`RawRead::Absent ⇒ true`, interim parity: an absent record means a listener between polls), and FALSE for a daemon-hosted endpoint whose status is `offline`. So on a real box every one of the 24 recordless residue directories read ALIVE and all 6 offline REAL endpoints read DEAD: a sweep keyed on `!is_perch_alive` does not merely under-perform, it authorizes EXACTLY THE INVERSE SET — it would have spared every stray probe dir and deleted six resting agents' records. The predicate is correct for its own job (fail toward alive is the safe direction for DELIVERY) and wrong for this one, which is why the inversion is a hazard rather than a bug. INVARIANT: the GC classifies on record PRESENCE only and never calls a liveness resolver; the unit pinning this asserts BOTH arms with the shipped resolver as the witness (residue reads alive and is still reaped; an offline endpoint reads dead and is still kept).",
2026-08-28T09:54:46.8066948Z       "requiredStages": [
2026-08-28T09:54:46.8067108Z         "doc",
2026-08-28T09:54:46.8067258Z         "impl",
2026-08-28T09:54:46.8067413Z         "unit"
2026-08-28T09:54:46.8067558Z       ],
2026-08-28T09:54:46.8067719Z       "stages": {
2026-08-28T09:54:46.8067868Z         "doc": {
2026-08-28T09:54:46.8068062Z           "complete": true,
2026-08-28T09:54:46.8068230Z           "evidence": [
2026-08-28T09:54:46.8068381Z             {
2026-08-28T09:54:46.8068592Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8068745Z               "line": 128
2026-08-28T09:54:46.8068897Z             }
2026-08-28T09:54:46.8069127Z           ]
2026-08-28T09:54:46.8069278Z         },
2026-08-28T09:54:46.8069435Z         "impl": {
2026-08-28T09:54:46.8069604Z           "complete": true,
2026-08-28T09:54:46.8069771Z           "evidence": [
2026-08-28T09:54:46.8069929Z             {
2026-08-28T09:54:46.8070176Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:46.8070338Z               "line": 383
2026-08-28T09:54:46.8070487Z             }
2026-08-28T09:54:46.8070633Z           ]
2026-08-28T09:54:46.8070782Z         },
2026-08-28T09:54:46.8070934Z         "int": {
2026-08-28T09:54:46.8071121Z           "complete": false,
2026-08-28T09:54:46.8071292Z           "evidence": []
2026-08-28T09:54:46.8071445Z         },
2026-08-28T09:54:46.8071597Z         "unit": {
2026-08-28T09:54:46.8071779Z           "complete": true,
2026-08-28T09:54:46.8071946Z           "evidence": [
2026-08-28T09:54:46.8072103Z             {
2026-08-28T09:54:46.8072360Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:46.8072645Z               "line": 655
2026-08-28T09:54:46.8072798Z             }
2026-08-28T09:54:46.8072946Z           ]
2026-08-28T09:54:46.8073104Z         }
2026-08-28T09:54:46.8073246Z       }
2026-08-28T09:54:46.8073398Z     },
2026-08-28T09:54:46.8073551Z     {
2026-08-28T09:54:46.8073799Z       "id": "REQ-HAZARD-PERCH-RECORD-POWER-LOSS",
2026-08-28T09:54:46.8075145Z       "title": "Authoritative/identity records fsync data before the rename (5.13): a hard reset must not resurrect a full-length NUL-filled record — SCOPED, not a blanket fsync",
2026-08-28T09:54:46.8075322Z       "requiredStages": [
2026-08-28T09:54:46.8075479Z         "impl",
2026-08-28T09:54:46.8075627Z         "unit"
2026-08-28T09:54:46.8075774Z       ],
2026-08-28T09:54:46.8075937Z       "stages": {
2026-08-28T09:54:46.8076084Z         "doc": {
2026-08-28T09:54:46.8076256Z           "complete": true,
2026-08-28T09:54:46.8076418Z           "evidence": [
2026-08-28T09:54:46.8076585Z             {
2026-08-28T09:54:46.8076791Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8076957Z               "line": 296
2026-08-28T09:54:46.8077101Z             }
2026-08-28T09:54:46.8077252Z           ]
2026-08-28T09:54:46.8077409Z         },
2026-08-28T09:54:46.8077564Z         "impl": {
2026-08-28T09:54:46.8077740Z           "complete": true,
2026-08-28T09:54:46.8077898Z           "evidence": [
2026-08-28T09:54:46.8078050Z             {
2026-08-28T09:54:46.8078307Z               "path": "crates/spt-daemon/src/machineid.rs",
2026-08-28T09:54:46.8078480Z               "line": 131
2026-08-28T09:54:46.8078627Z             },
2026-08-28T09:54:46.8078776Z             {
2026-08-28T09:54:46.8079095Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.8079257Z               "line": 107
2026-08-28T09:54:46.8079410Z             },
2026-08-28T09:54:46.8079558Z             {
2026-08-28T09:54:46.8079796Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.8079956Z               "line": 113
2026-08-28T09:54:46.8080221Z             },
2026-08-28T09:54:46.8080365Z             {
2026-08-28T09:54:46.8080602Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.8080761Z               "line": 846
2026-08-28T09:54:46.8080913Z             },
2026-08-28T09:54:46.8081070Z             {
2026-08-28T09:54:46.8081304Z               "path": "crates/spt-store/src/nodeid.rs",
2026-08-28T09:54:46.8081461Z               "line": 94
2026-08-28T09:54:46.8081605Z             }
2026-08-28T09:54:46.8081767Z           ]
2026-08-28T09:54:46.8081911Z         },
2026-08-28T09:54:46.8082066Z         "int": {
2026-08-28T09:54:46.8082244Z           "complete": false,
2026-08-28T09:54:46.8082405Z           "evidence": []
2026-08-28T09:54:46.8082555Z         },
2026-08-28T09:54:46.8082710Z         "unit": {
2026-08-28T09:54:46.8082886Z           "complete": true,
2026-08-28T09:54:46.8083043Z           "evidence": [
2026-08-28T09:54:46.8083196Z             {
2026-08-28T09:54:46.8083439Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.8083606Z               "line": 271
2026-08-28T09:54:46.8083758Z             }
2026-08-28T09:54:46.8083902Z           ]
2026-08-28T09:54:46.8084053Z         }
2026-08-28T09:54:46.8084198Z       }
2026-08-28T09:54:46.8084354Z     },
2026-08-28T09:54:46.8084499Z     {
2026-08-28T09:54:46.8084755Z       "id": "REQ-HAZARD-PROBE-CONTEXT-ISOLATION",
2026-08-28T09:54:46.8091936Z       "title": "A PRESENCE PROBE MUST NEVER REACH THE RECIPIENT AS CONTENT. It is never spooled, never lands in an inbox, and never enters the recipient's agent context -- the whole point of a machine-plane question is that the machine answers it and the human or agent behind it is not interrupted to do so. The hazard is the one KNOWN-HAZARDS already records for untagged wire records, in a new dress: a probe that presented the untagged message signature would be classified a message feed by an older receiver and DELIVERED INTO THE TARGET'S SPOOL, turning a liveness question into a chat line nobody sent. The kind tag is what keeps it out of that arm, and an N-1 daemon drops it clean. Gate: impl -- the tag and the serve arm that answers without any delivery side effect; unit -- the probe record can never be read as a message feed (the classifier's own inputs, asserted), and a served probe leaves the target's spool and inbox byte-identical to before it arrived.",
2026-08-28T09:54:46.8092317Z       "requiredStages": [
2026-08-28T09:54:46.8092476Z         "impl",
2026-08-28T09:54:46.8092631Z         "unit"
2026-08-28T09:54:46.8092790Z       ],
2026-08-28T09:54:46.8092965Z       "stages": {
2026-08-28T09:54:46.8093105Z         "doc": {
2026-08-28T09:54:46.8093280Z           "complete": false,
2026-08-28T09:54:46.8093446Z           "evidence": []
2026-08-28T09:54:46.8093599Z         },
2026-08-28T09:54:46.8093752Z         "impl": {
2026-08-28T09:54:46.8093928Z           "complete": true,
2026-08-28T09:54:46.8094095Z           "evidence": [
2026-08-28T09:54:46.8094252Z             {
2026-08-28T09:54:46.8094514Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8094676Z               "line": 155
2026-08-28T09:54:46.8094838Z             },
2026-08-28T09:54:46.8094987Z             {
2026-08-28T09:54:46.8095239Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8095407Z               "line": 257
2026-08-28T09:54:46.8095553Z             },
2026-08-28T09:54:46.8095705Z             {
2026-08-28T09:54:46.8095950Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8096124Z               "line": 1913
2026-08-28T09:54:46.8096275Z             },
2026-08-28T09:54:46.8096428Z             {
2026-08-28T09:54:46.8096667Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8096832Z               "line": 2036
2026-08-28T09:54:46.8096991Z             },
2026-08-28T09:54:46.8097143Z             {
2026-08-28T09:54:46.8097386Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8097548Z               "line": 2103
2026-08-28T09:54:46.8097815Z             },
2026-08-28T09:54:46.8097969Z             {
2026-08-28T09:54:46.8098241Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:46.8098396Z               "line": 64
2026-08-28T09:54:46.8098548Z             }
2026-08-28T09:54:46.8098704Z           ]
2026-08-28T09:54:46.8098856Z         },
2026-08-28T09:54:46.8099085Z         "int": {
2026-08-28T09:54:46.8099252Z           "complete": false,
2026-08-28T09:54:46.8099418Z           "evidence": []
2026-08-28T09:54:46.8099567Z         },
2026-08-28T09:54:46.8099728Z         "unit": {
2026-08-28T09:54:46.8099896Z           "complete": true,
2026-08-28T09:54:46.8100062Z           "evidence": [
2026-08-28T09:54:46.8100216Z             {
2026-08-28T09:54:46.8100464Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8100629Z               "line": 3243
2026-08-28T09:54:46.8100774Z             },
2026-08-28T09:54:46.8100934Z             {
2026-08-28T09:54:46.8101182Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8101341Z               "line": 3394
2026-08-28T09:54:46.8101495Z             },
2026-08-28T09:54:46.8101642Z             {
2026-08-28T09:54:46.8101914Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:46.8102072Z               "line": 206
2026-08-28T09:54:46.8102224Z             }
2026-08-28T09:54:46.8102367Z           ]
2026-08-28T09:54:46.8102524Z         }
2026-08-28T09:54:46.8102667Z       }
2026-08-28T09:54:46.8102815Z     },
2026-08-28T09:54:46.8102958Z     {
2026-08-28T09:54:46.8103235Z       "id": "REQ-HAZARD-PROCESS-GLOBAL-ONE-RESOLUTION",
2026-08-28T09:54:46.8110279Z       "title": "Seed: resolve a process-global exactly ONCE per public operation and thread that value inward; a public function that resolves the global and calls a callee which resolves it again contains a latent disagreement. Field-near discovery: `daemon_inhibit::set_stop_inhibit -> inhibit_path` and `servicehost::service_env -> env assembly` both carried this production shape, invisible until a test became the victim. The eventual regression must pin SINGLE RESOLUTION PER OPERATION, not merely the presence of an `_at(home)` seam: count `spt_home()` occurrences in each file and require exactly one inside each thin public boundary (current repaired shape: servicehost one occurrence in its wrapper; daemon_inhibit five, one per public function), so no inner callee can silently re-read the process-global. Invariant repair: resolve once at the public boundary, thread the value inward. Design source: KNOWN-HAZARDS 7.57.",
2026-08-28T09:54:46.8110584Z       "requiredStages": [],
2026-08-28T09:54:46.8110743Z       "stages": {
2026-08-28T09:54:46.8110904Z         "doc": {
2026-08-28T09:54:46.8111077Z           "complete": true,
2026-08-28T09:54:46.8111242Z           "evidence": [
2026-08-28T09:54:46.8111397Z             {
2026-08-28T09:54:46.8111603Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8111775Z               "line": 880
2026-08-28T09:54:46.8111925Z             }
2026-08-28T09:54:46.8112074Z           ]
2026-08-28T09:54:46.8112221Z         },
2026-08-28T09:54:46.8112374Z         "impl": {
2026-08-28T09:54:46.8112550Z           "complete": false,
2026-08-28T09:54:46.8112722Z           "evidence": []
2026-08-28T09:54:46.8112874Z         },
2026-08-28T09:54:46.8113027Z         "int": {
2026-08-28T09:54:46.8113208Z           "complete": false,
2026-08-28T09:54:46.8113380Z           "evidence": []
2026-08-28T09:54:46.8113528Z         },
2026-08-28T09:54:46.8113680Z         "unit": {
2026-08-28T09:54:46.8113852Z           "complete": false,
2026-08-28T09:54:46.8114023Z           "evidence": []
2026-08-28T09:54:46.8114177Z         }
2026-08-28T09:54:46.8114329Z       }
2026-08-28T09:54:46.8114470Z     },
2026-08-28T09:54:46.8114615Z     {
2026-08-28T09:54:46.8114852Z       "id": "REQ-HAZARD-PSYCHE-OUTBOUND-PROXY",
2026-08-28T09:54:46.8116877Z       "title": "Psyche outbound captured + sanitized: the live-Psyche turn driver captures stdout (never Stdio::null), and the daemon strips/re-stamps Psyche-supplied from=/target and constrains routing (reply→__REPLY_TO__ sender, notify→own user/subnet) (7.3)",
2026-08-28T09:54:46.8117177Z       "requiredStages": [
2026-08-28T09:54:46.8117328Z         "impl",
2026-08-28T09:54:46.8117482Z         "unit"
2026-08-28T09:54:46.8117624Z       ],
2026-08-28T09:54:46.8117782Z       "stages": {
2026-08-28T09:54:46.8117944Z         "doc": {
2026-08-28T09:54:46.8118121Z           "complete": false,
2026-08-28T09:54:46.8118282Z           "evidence": []
2026-08-28T09:54:46.8118440Z         },
2026-08-28T09:54:46.8118592Z         "impl": {
2026-08-28T09:54:46.8118760Z           "complete": true,
2026-08-28T09:54:46.8118926Z           "evidence": [
2026-08-28T09:54:46.8119174Z             {
2026-08-28T09:54:46.8119432Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8119597Z               "line": 26
2026-08-28T09:54:46.8119759Z             },
2026-08-28T09:54:46.8119909Z             {
2026-08-28T09:54:46.8120163Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8120330Z               "line": 95
2026-08-28T09:54:46.8120482Z             },
2026-08-28T09:54:46.8120635Z             {
2026-08-28T09:54:46.8120882Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8121054Z               "line": 172
2026-08-28T09:54:46.8121202Z             },
2026-08-28T09:54:46.8121355Z             {
2026-08-28T09:54:46.8121589Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8121754Z               "line": 19
2026-08-28T09:54:46.8121914Z             },
2026-08-28T09:54:46.8122059Z             {
2026-08-28T09:54:46.8122302Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8122462Z               "line": 50
2026-08-28T09:54:46.8122620Z             },
2026-08-28T09:54:46.8122767Z             {
2026-08-28T09:54:46.8123115Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:46.8123278Z               "line": 18
2026-08-28T09:54:46.8123434Z             },
2026-08-28T09:54:46.8123583Z             {
2026-08-28T09:54:46.8123802Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:46.8123964Z               "line": 129
2026-08-28T09:54:46.8124112Z             },
2026-08-28T09:54:46.8124264Z             {
2026-08-28T09:54:46.8124495Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.8124665Z               "line": 109
2026-08-28T09:54:46.8124819Z             }
2026-08-28T09:54:46.8124969Z           ]
2026-08-28T09:54:46.8125127Z         },
2026-08-28T09:54:46.8125274Z         "int": {
2026-08-28T09:54:46.8125451Z           "complete": false,
2026-08-28T09:54:46.8125617Z           "evidence": []
2026-08-28T09:54:46.8125776Z         },
2026-08-28T09:54:46.8125927Z         "unit": {
2026-08-28T09:54:46.8126105Z           "complete": true,
2026-08-28T09:54:46.8126275Z           "evidence": [
2026-08-28T09:54:46.8126430Z             {
2026-08-28T09:54:46.8126691Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8126847Z               "line": 295
2026-08-28T09:54:46.8126996Z             },
2026-08-28T09:54:46.8127148Z             {
2026-08-28T09:54:46.8127395Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8127555Z               "line": 320
2026-08-28T09:54:46.8127708Z             },
2026-08-28T09:54:46.8127851Z             {
2026-08-28T09:54:46.8128104Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8128265Z               "line": 356
2026-08-28T09:54:46.8128414Z             },
2026-08-28T09:54:46.8128565Z             {
2026-08-28T09:54:46.8128809Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8129067Z               "line": 424
2026-08-28T09:54:46.8129214Z             },
2026-08-28T09:54:46.8129367Z             {
2026-08-28T09:54:46.8129616Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8129892Z               "line": 435
2026-08-28T09:54:46.8130048Z             },
2026-08-28T09:54:46.8130200Z             {
2026-08-28T09:54:46.8130445Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8130604Z               "line": 466
2026-08-28T09:54:46.8130760Z             },
2026-08-28T09:54:46.8130904Z             {
2026-08-28T09:54:46.8131152Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:46.8131314Z               "line": 477
2026-08-28T09:54:46.8131467Z             },
2026-08-28T09:54:46.8131614Z             {
2026-08-28T09:54:46.8131853Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8132015Z               "line": 77
2026-08-28T09:54:46.8132168Z             },
2026-08-28T09:54:46.8132314Z             {
2026-08-28T09:54:46.8132550Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8132714Z               "line": 97
2026-08-28T09:54:46.8132872Z             },
2026-08-28T09:54:46.8133017Z             {
2026-08-28T09:54:46.8133271Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8133433Z               "line": 112
2026-08-28T09:54:46.8133590Z             },
2026-08-28T09:54:46.8133738Z             {
2026-08-28T09:54:46.8133975Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8134134Z               "line": 123
2026-08-28T09:54:46.8134285Z             },
2026-08-28T09:54:46.8134444Z             {
2026-08-28T09:54:46.8134682Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8134852Z               "line": 130
2026-08-28T09:54:46.8135002Z             },
2026-08-28T09:54:46.8135158Z             {
2026-08-28T09:54:46.8135398Z               "path": "crates/spt-live/src/outbound.rs",
2026-08-28T09:54:46.8138602Z               "line": 145
2026-08-28T09:54:46.8138787Z             },
2026-08-28T09:54:46.8139044Z             {
2026-08-28T09:54:46.8139518Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:46.8139688Z               "line": 179
2026-08-28T09:54:46.8139833Z             },
2026-08-28T09:54:46.8139984Z             {
2026-08-28T09:54:46.8140209Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:46.8140376Z               "line": 194
2026-08-28T09:54:46.8140515Z             },
2026-08-28T09:54:46.8140670Z             {
2026-08-28T09:54:46.8140911Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:46.8141073Z               "line": 648
2026-08-28T09:54:46.8141226Z             }
2026-08-28T09:54:46.8141373Z           ]
2026-08-28T09:54:46.8141531Z         }
2026-08-28T09:54:46.8141673Z       }
2026-08-28T09:54:46.8141822Z     },
2026-08-28T09:54:46.8141969Z     {
2026-08-28T09:54:46.8142251Z       "id": "REQ-HAZARD-PSYCHE-RESIDENCY-EXPECTATION",
2026-08-28T09:54:46.8150383Z       "title": "W3 (F030 hazard; paid-for: hall-bf churn ordinal 6491+ + adapter v0.13.2 bad-ship brick 2026-07-04): a psyche failure of ANY shape must NOT remove or alter the parent endpoint's ready/hosted state, and hosting must NOT churn-respawn. The v0.13.2 shim-exit tripped the residency machinery (confirm_residency_or_unhost) which tore down the endpoint's hosted state — ready marker removed, never re-stamped, every force-native gated leg=cli-gate-not-hosted PERMANENTLY (field brick). FIX: residency machinery retires with the resident child; the teardown that touches parent hosted state is DELETED — psyche trouble stamps psyche fields only. REQ-HAZARD-LIVEHOST-NONRESIDENT's spirit transfers to the W1 failure budget (its entry gets a SUPERSEDED pointer here, LIVENESS-DECAY→SUPERSEDED pattern from C-1). Conformance int = the hall-bf shape: multi-subnet home, live endpoint, failing psyche → parent stays deliverable, no rehost churn, error stamped (the wave's heart).",
2026-08-28T09:54:46.8150592Z       "requiredStages": [
2026-08-28T09:54:46.8150746Z         "doc",
2026-08-28T09:54:46.8150897Z         "impl",
2026-08-28T09:54:46.8151051Z         "int"
2026-08-28T09:54:46.8151202Z       ],
2026-08-28T09:54:46.8151490Z       "stages": {
2026-08-28T09:54:46.8151647Z         "doc": {
2026-08-28T09:54:46.8151819Z           "complete": true,
2026-08-28T09:54:46.8151981Z           "evidence": [
2026-08-28T09:54:46.8152148Z             {
2026-08-28T09:54:46.8152354Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8152520Z               "line": 669
2026-08-28T09:54:46.8152664Z             },
2026-08-28T09:54:46.8152815Z             {
2026-08-28T09:54:46.8153021Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8153192Z               "line": 1056
2026-08-28T09:54:46.8153336Z             }
2026-08-28T09:54:46.8153493Z           ]
2026-08-28T09:54:46.8153646Z         },
2026-08-28T09:54:46.8153796Z         "impl": {
2026-08-28T09:54:46.8153968Z           "complete": true,
2026-08-28T09:54:46.8154132Z           "evidence": [
2026-08-28T09:54:46.8154291Z             {
2026-08-28T09:54:46.8154548Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.8154720Z               "line": 70
2026-08-28T09:54:46.8154868Z             },
2026-08-28T09:54:46.8155020Z             {
2026-08-28T09:54:46.8155278Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.8155434Z               "line": 1699
2026-08-28T09:54:46.8155592Z             },
2026-08-28T09:54:46.8155749Z             {
2026-08-28T09:54:46.8155992Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.8156151Z               "line": 184
2026-08-28T09:54:46.8156302Z             },
2026-08-28T09:54:46.8156452Z             {
2026-08-28T09:54:46.8156706Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:46.8156874Z               "line": 649
2026-08-28T09:54:46.8157021Z             }
2026-08-28T09:54:46.8157175Z           ]
2026-08-28T09:54:46.8157312Z         },
2026-08-28T09:54:46.8157471Z         "int": {
2026-08-28T09:54:46.8157641Z           "complete": true,
2026-08-28T09:54:46.8157923Z           "evidence": [
2026-08-28T09:54:46.8158076Z             {
2026-08-28T09:54:46.8158495Z               "path": "crates/spt-daemon/tests/psyche_residency_expectation_e2e.rs",
2026-08-28T09:54:46.8158662Z               "line": 43
2026-08-28T09:54:46.8158810Z             },
2026-08-28T09:54:46.8159061Z             {
2026-08-28T09:54:46.8159475Z               "path": "crates/spt-daemon/tests/psyche_residency_expectation_e2e.rs",
2026-08-28T09:54:46.8159641Z               "line": 118
2026-08-28T09:54:46.8159794Z             }
2026-08-28T09:54:46.8159945Z           ]
2026-08-28T09:54:46.8160094Z         },
2026-08-28T09:54:46.8160256Z         "unit": {
2026-08-28T09:54:46.8160437Z           "complete": true,
2026-08-28T09:54:46.8160609Z           "evidence": [
2026-08-28T09:54:46.8160761Z             {
2026-08-28T09:54:46.8161011Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.8161176Z               "line": 2880
2026-08-28T09:54:46.8161325Z             }
2026-08-28T09:54:46.8161486Z           ]
2026-08-28T09:54:46.8161640Z         }
2026-08-28T09:54:46.8161786Z       }
2026-08-28T09:54:46.8161938Z     },
2026-08-28T09:54:46.8162079Z     {
2026-08-28T09:54:46.8162327Z       "id": "REQ-HAZARD-PTY-INPUT-WRITER-WEDGE",
2026-08-28T09:54:46.8179725Z       "title": "Pasting into an `spt rc` session WEDGES the broker — after a paste the operator can no longer type AND can no longer attach to NEW or EXISTING sessions (`brain IPC read deadline`). ROOT (doyle /diagnose, code-grounded): the operator-keystroke path rc -> net-stream Input -> serve_attach (attach.rs:197 brain.send_effect) -> KIND_INPUT -> broker dispatch loop (broker.rs:1091) -> dispatch_input (broker.rs:1459) -> session.write_input(&bytes) runs SYNCHRONOUSLY on the broker request-handling thread. W1b (REQ-HAZARD-EFFECT-JOURNAL-PTY-WEDGE) released the journal lock across the effect (fix 1) + made PtyWrite ephemeral/no-fsync (fix 3) but EXPLICITLY DEFERRED fix (2) — bound/fail-fast the PtyWrite itself. A single keystroke never fills the ConPTY input buffer; a PASTE BURST does -> write_input blocks -> the dispatch thread cannot service the next frame (a re-attach subscribe, a become_controller restore-write, an inject-floor flush) -> wedge. Not a bug-2 regression (the byte path funnels to the same write_input; paste just reliably fills the buffer). FIX (doyle design, V0.13.0-P0-PTY-INPUT-WRITER-DESIGN.md, CONTEXT L33 broker-owns-PTY/minimal + L435 SessionSurface + single-writer pattern): one dedicated per-session INPUT-WRITER THREAD = the SOLE caller of the blocking write_input, fed by a BOUNDED FIFO channel; every caller (dispatch_input, serve_attach->send_effect, inject-floor flush) ENQUEUES + returns immediately, never blocks. A blocked/slow harness blocks ONLY its own writer thread, never the broker dispatch. Backpressure (operator ruling): queue full => DROP excess input + stamp the session INPUT_BACKPRESSURE (visible health signal); the daemon NEVER wedges; a merely-slow harness self-heals as the writer drains. Exactly-once preserved (PtyWrite ephemeral: apply_once effect = the non-blocking enqueue => Applied; ack now means accepted+ordered, benign — rc does not gate on landing); order preserved (single FIFO + single writer); inject-floor (W2 Layer C) choreography moves to the lone writer. Completes the W1b-deferred fix (2), cross-platform (cfg(unix) forkpty park folds in). (v0.13.0)",
2026-08-28T09:54:46.8180086Z       "requiredStages": [
2026-08-28T09:54:46.8180248Z         "impl",
2026-08-28T09:54:46.8180408Z         "unit",
2026-08-28T09:54:46.8180566Z         "int"
2026-08-28T09:54:46.8180722Z       ],
2026-08-28T09:54:46.8180881Z       "stages": {
2026-08-28T09:54:46.8181037Z         "doc": {
2026-08-28T09:54:46.8181219Z           "complete": false,
2026-08-28T09:54:46.8181386Z           "evidence": []
2026-08-28T09:54:46.8181539Z         },
2026-08-28T09:54:46.8181696Z         "impl": {
2026-08-28T09:54:46.8181877Z           "complete": true,
2026-08-28T09:54:46.8182044Z           "evidence": [
2026-08-28T09:54:46.8182291Z             {
2026-08-28T09:54:46.8182553Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8182722Z               "line": 4022
2026-08-28T09:54:46.8182873Z             },
2026-08-28T09:54:46.8183020Z             {
2026-08-28T09:54:46.8183251Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.8183400Z               "line": 711
2026-08-28T09:54:46.8183542Z             }
2026-08-28T09:54:46.8183686Z           ]
2026-08-28T09:54:46.8183838Z         },
2026-08-28T09:54:46.8183991Z         "int": {
2026-08-28T09:54:46.8184167Z           "complete": true,
2026-08-28T09:54:46.8184335Z           "evidence": [
2026-08-28T09:54:46.8184487Z             {
2026-08-28T09:54:46.8184820Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.8184983Z               "line": 2889
2026-08-28T09:54:46.8185140Z             },
2026-08-28T09:54:46.8185289Z             {
2026-08-28T09:54:46.8185611Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.8185780Z               "line": 2929
2026-08-28T09:54:46.8185928Z             }
2026-08-28T09:54:46.8186076Z           ]
2026-08-28T09:54:46.8186224Z         },
2026-08-28T09:54:46.8186381Z         "unit": {
2026-08-28T09:54:46.8186548Z           "complete": true,
2026-08-28T09:54:46.8186710Z           "evidence": [
2026-08-28T09:54:46.8186868Z             {
2026-08-28T09:54:46.8187110Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8187273Z               "line": 10476
2026-08-28T09:54:46.8187420Z             },
2026-08-28T09:54:46.8187574Z             {
2026-08-28T09:54:46.8187808Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8187978Z               "line": 10540
2026-08-28T09:54:46.8188123Z             },
2026-08-28T09:54:46.8188273Z             {
2026-08-28T09:54:46.8188516Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8188678Z               "line": 11560
2026-08-28T09:54:46.8188831Z             }
2026-08-28T09:54:46.8189156Z           ]
2026-08-28T09:54:46.8189326Z         }
2026-08-28T09:54:46.8189466Z       }
2026-08-28T09:54:46.8189617Z     },
2026-08-28T09:54:46.8189776Z     {
2026-08-28T09:54:46.8190003Z       "id": "REQ-HAZARD-PUMP-IPC-DEADLINE",
2026-08-28T09:54:46.8192160Z       "title": "The single-threaded peer pump's brain-IPC reads are deadline-bounded (PUMP_PEER_IO_TIMEOUT, total-wait per call); a TimedOut read POISONS the client and escalates to a SUPERVISED RESTART, never a per-peer retry — a black-holed peer must never wedge the whole pump",
2026-08-28T09:54:46.8192338Z       "requiredStages": [
2026-08-28T09:54:46.8192494Z         "doc",
2026-08-28T09:54:46.8192648Z         "impl",
2026-08-28T09:54:46.8192814Z         "unit"
2026-08-28T09:54:46.8192958Z       ],
2026-08-28T09:54:46.8193118Z       "stages": {
2026-08-28T09:54:46.8193273Z         "doc": {
2026-08-28T09:54:46.8193442Z           "complete": true,
2026-08-28T09:54:46.8193623Z           "evidence": [
2026-08-28T09:54:46.8193774Z             {
2026-08-28T09:54:46.8193998Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8194164Z               "line": 485
2026-08-28T09:54:46.8194318Z             }
2026-08-28T09:54:46.8194469Z           ]
2026-08-28T09:54:46.8194637Z         },
2026-08-28T09:54:46.8194798Z         "impl": {
2026-08-28T09:54:46.8194961Z           "complete": true,
2026-08-28T09:54:46.8195128Z           "evidence": [
2026-08-28T09:54:46.8195272Z             {
2026-08-28T09:54:46.8195501Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8195666Z               "line": 352
2026-08-28T09:54:46.8195821Z             },
2026-08-28T09:54:46.8195967Z             {
2026-08-28T09:54:46.8196204Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8196388Z               "line": 478
2026-08-28T09:54:46.8196541Z             },
2026-08-28T09:54:46.8196693Z             {
2026-08-28T09:54:46.8196923Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8197199Z               "line": 1011
2026-08-28T09:54:46.8197351Z             },
2026-08-28T09:54:46.8197504Z             {
2026-08-28T09:54:46.8197733Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8197905Z               "line": 1035
2026-08-28T09:54:46.8198063Z             },
2026-08-28T09:54:46.8198209Z             {
2026-08-28T09:54:46.8198440Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8198595Z               "line": 2449
2026-08-28T09:54:46.8198750Z             },
2026-08-28T09:54:46.8198890Z             {
2026-08-28T09:54:46.8199238Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.8199406Z               "line": 92
2026-08-28T09:54:46.8199548Z             },
2026-08-28T09:54:46.8199730Z             {
2026-08-28T09:54:46.8199982Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.8200149Z               "line": 255
2026-08-28T09:54:46.8200293Z             },
2026-08-28T09:54:46.8200435Z             {
2026-08-28T09:54:46.8200680Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8200840Z               "line": 205
2026-08-28T09:54:46.8200995Z             },
2026-08-28T09:54:46.8201131Z             {
2026-08-28T09:54:46.8201386Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8201537Z               "line": 588
2026-08-28T09:54:46.8201692Z             },
2026-08-28T09:54:46.8201838Z             {
2026-08-28T09:54:46.8202091Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8202250Z               "line": 821
2026-08-28T09:54:46.8202405Z             },
2026-08-28T09:54:46.8202555Z             {
2026-08-28T09:54:46.8202796Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8202959Z               "line": 908
2026-08-28T09:54:46.8203107Z             },
2026-08-28T09:54:46.8203260Z             {
2026-08-28T09:54:46.8203504Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8203804Z               "line": 1565
2026-08-28T09:54:46.8203951Z             },
2026-08-28T09:54:46.8204102Z             {
2026-08-28T09:54:46.8204324Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:46.8204482Z               "line": 1152
2026-08-28T09:54:46.8204634Z             }
2026-08-28T09:54:46.8204782Z           ]
2026-08-28T09:54:46.8204935Z         },
2026-08-28T09:54:46.8205073Z         "int": {
2026-08-28T09:54:46.8205250Z           "complete": true,
2026-08-28T09:54:46.8205411Z           "evidence": [
2026-08-28T09:54:46.8205564Z             {
2026-08-28T09:54:46.8205879Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.8206036Z               "line": 380
2026-08-28T09:54:46.8206184Z             },
2026-08-28T09:54:46.8206332Z             {
2026-08-28T09:54:46.8206645Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.8206807Z               "line": 488
2026-08-28T09:54:46.8206957Z             }
2026-08-28T09:54:46.8207111Z           ]
2026-08-28T09:54:46.8207257Z         },
2026-08-28T09:54:46.8207421Z         "unit": {
2026-08-28T09:54:46.8207591Z           "complete": true,
2026-08-28T09:54:46.8207764Z           "evidence": [
2026-08-28T09:54:46.8207920Z             {
2026-08-28T09:54:46.8208169Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8208332Z               "line": 2032
2026-08-28T09:54:46.8208489Z             },
2026-08-28T09:54:46.8208646Z             {
2026-08-28T09:54:46.8208889Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:46.8209146Z               "line": 2182
2026-08-28T09:54:46.8209300Z             },
2026-08-28T09:54:46.8209450Z             {
2026-08-28T09:54:46.8209728Z               "path": "crates/spt-daemon/tests/pumpdeadline.rs",
2026-08-28T09:54:46.8209894Z               "line": 30
2026-08-28T09:54:46.8210043Z             }
2026-08-28T09:54:46.8210300Z           ]
2026-08-28T09:54:46.8210451Z         }
2026-08-28T09:54:46.8210601Z       }
2026-08-28T09:54:46.8210747Z     },
2026-08-28T09:54:46.8210891Z     {
2026-08-28T09:54:46.8211110Z       "id": "REQ-HAZARD-RC-ATTACH-FAILFAST",
2026-08-28T09:54:46.8219668Z       "title": "B1: `spt rc <id>` to a DEAD or non-streaming session fails fast with a clear message, never an INFINITE blank screen. Today rc.rs run_attach (209-231) + pump spawns PUMP_IPC_READER and blocks: the poll times out each slice but the stream never produces output, so the operator sees a permanent blank (operator: fresh wall-f attached, closed tab, then `spt rc wall-f` HUNG — the broker still resolved a session for it). FIX: (a) once B2 lands, gate attach on is_online/status — an offline endpoint yields a clean 'endpoint offline, start it' not an attach; (b) fail-fast — if the attach-open ack / first output does not arrive within a bound, surface a clear message, never an infinite blank; (c) the broker EOFs the attach stream when the session's child is dead, so rc's existing PumpEnd::BrokerGone graceful path (REQ-HAZARD-RC-EOF) catches it. PIN the exact sub-mechanism with a repro test FIRST (dead-session-lingers-in-broker vs reaped-but-rc-waits vs alive-resting-no-wake — the wall-f Windows tab-close: child alive-silent vs dead-not-reaped). (v0.12.0)",
2026-08-28T09:54:46.8219874Z       "requiredStages": [
2026-08-28T09:54:46.8220025Z         "impl",
2026-08-28T09:54:46.8220197Z         "unit",
2026-08-28T09:54:46.8220349Z         "int"
2026-08-28T09:54:46.8220502Z       ],
2026-08-28T09:54:46.8220663Z       "stages": {
2026-08-28T09:54:46.8220817Z         "doc": {
2026-08-28T09:54:46.8220997Z           "complete": false,
2026-08-28T09:54:46.8221161Z           "evidence": []
2026-08-28T09:54:46.8221312Z         },
2026-08-28T09:54:46.8221461Z         "impl": {
2026-08-28T09:54:46.8221641Z           "complete": true,
2026-08-28T09:54:46.8221805Z           "evidence": [
2026-08-28T09:54:46.8221965Z             {
2026-08-28T09:54:46.8222166Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8222456Z               "line": 1155
2026-08-28T09:54:46.8222606Z             },
2026-08-28T09:54:46.8222754Z             {
2026-08-28T09:54:46.8222963Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8223126Z               "line": 2063
2026-08-28T09:54:46.8223278Z             },
2026-08-28T09:54:46.8223426Z             {
2026-08-28T09:54:46.8223621Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8223779Z               "line": 2840
2026-08-28T09:54:46.8223936Z             }
2026-08-28T09:54:46.8224084Z           ]
2026-08-28T09:54:46.8224237Z         },
2026-08-28T09:54:46.8224390Z         "int": {
2026-08-28T09:54:46.8224561Z           "complete": true,
2026-08-28T09:54:46.8224723Z           "evidence": [
2026-08-28T09:54:46.8224876Z             {
2026-08-28T09:54:46.8225132Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:46.8225294Z               "line": 432
2026-08-28T09:54:46.8225449Z             }
2026-08-28T09:54:46.8225602Z           ]
2026-08-28T09:54:46.8225759Z         },
2026-08-28T09:54:46.8225917Z         "unit": {
2026-08-28T09:54:46.8226092Z           "complete": true,
2026-08-28T09:54:46.8226256Z           "evidence": [
2026-08-28T09:54:46.8226407Z             {
2026-08-28T09:54:46.8226604Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8226760Z               "line": 3659
2026-08-28T09:54:46.8226900Z             },
2026-08-28T09:54:46.8227046Z             {
2026-08-28T09:54:46.8227238Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8227400Z               "line": 4076
2026-08-28T09:54:46.8227549Z             },
2026-08-28T09:54:46.8227699Z             {
2026-08-28T09:54:46.8227889Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8228058Z               "line": 4100
2026-08-28T09:54:46.8228202Z             }
2026-08-28T09:54:46.8228354Z           ]
2026-08-28T09:54:46.8228503Z         }
2026-08-28T09:54:46.8228755Z       }
2026-08-28T09:54:46.8228908Z     },
2026-08-28T09:54:46.8229142Z     {
2026-08-28T09:54:46.8229384Z       "id": "REQ-HAZARD-RC-ATTACH-ONLINE-RACE",
2026-08-28T09:54:46.8240207Z       "title": "`spt endpoint run` in an ATTACH/VIEW terminal action attaches BEFORE the freshly-spawned endpoint is online, so the attach races (or outright loses to) the harness bind. ROOT (doyle /diagnose, code-grounded): cmd_endpoint_run (cli.rs) does launch_harness_brokered_in -> (if start: return) -> run_attach with NO await-online between them. launch_harness_brokered_in returns once the harness PROCESS is spawned, but the broker-PTY bind (info status -> STATUS_ONLINE + the live session) lands ASYNC. Both picker attach paths route here with start=false (RunMode::Attach -> cmd_endpoint_run start=false,view=false): Start-now catches the endpoint mid-bringup -> run_attach attempts + loses the handshake race; Resume-from-history catches it still fully OFFLINE -> run_attach's status-gate (REQ-HAZARD-RC-ATTACH-FAILFAST) short-circuits 'offline - nothing to attach' and NEVER attempts. SAME root, two faces (the W4 attach-by-default surfaced both; an online endpoint is unaffected - the picker returns Outcome::Attach, not Run). FIX: in cmd_endpoint_run, when the terminal action is attach/view (NOT start), AWAIT the endpoint online between launch_harness_brokered_in success and run_attach - poll spt_store::info read_info().status to STATUS_ONLINE with a bounded harness-boot deadline (~25s) at a tight interval; on online -> run_attach; on timeout -> ENDPOINT_RUN_ONLINE_TIMEOUT err (do NOT attach a dead bringup). (v0.13.0)",
2026-08-28T09:54:46.8240412Z       "requiredStages": [
2026-08-28T09:54:46.8240559Z         "impl",
2026-08-28T09:54:46.8240722Z         "unit",
2026-08-28T09:54:46.8240874Z         "int"
2026-08-28T09:54:46.8241023Z       ],
2026-08-28T09:54:46.8241187Z       "stages": {
2026-08-28T09:54:46.8241342Z         "doc": {
2026-08-28T09:54:46.8241516Z           "complete": false,
2026-08-28T09:54:46.8241689Z           "evidence": []
2026-08-28T09:54:46.8241845Z         },
2026-08-28T09:54:46.8242118Z         "impl": {
2026-08-28T09:54:46.8242295Z           "complete": true,
2026-08-28T09:54:46.8242461Z           "evidence": [
2026-08-28T09:54:46.8242619Z             {
2026-08-28T09:54:46.8242824Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8242986Z               "line": 5113
2026-08-28T09:54:46.8243134Z             },
2026-08-28T09:54:46.8243291Z             {
2026-08-28T09:54:46.8243495Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8243651Z               "line": 5134
2026-08-28T09:54:46.8243797Z             }
2026-08-28T09:54:46.8243947Z           ]
2026-08-28T09:54:46.8244117Z         },
2026-08-28T09:54:46.8244265Z         "int": {
2026-08-28T09:54:46.8244436Z           "complete": true,
2026-08-28T09:54:46.8244604Z           "evidence": [
2026-08-28T09:54:46.8244756Z             {
2026-08-28T09:54:46.8245013Z               "path": "crates/spt/tests/dummy_harness_e2e.rs",
2026-08-28T09:54:46.8245181Z               "line": 341
2026-08-28T09:54:46.8245337Z             }
2026-08-28T09:54:46.8245482Z           ]
2026-08-28T09:54:46.8245629Z         },
2026-08-28T09:54:46.8245783Z         "unit": {
2026-08-28T09:54:46.8245948Z           "complete": true,
2026-08-28T09:54:46.8246112Z           "evidence": [
2026-08-28T09:54:46.8246267Z             {
2026-08-28T09:54:46.8246471Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8246636Z               "line": 30839
2026-08-28T09:54:46.8246794Z             }
2026-08-28T09:54:46.8246946Z           ]
2026-08-28T09:54:46.8247099Z         }
2026-08-28T09:54:46.8247251Z       }
2026-08-28T09:54:46.8247400Z     },
2026-08-28T09:54:46.8247546Z     {
2026-08-28T09:54:46.8247766Z       "id": "REQ-HAZARD-RC-ATTACH-TRUTH",
2026-08-28T09:54:46.8253293Z       "title": "RC-RENDER-TRUTH W1 (KNOWN-HAZARDS 7.46 — umbrella conformance seam for ADR-0042): an rc surface answers from live session authority, never a stale persisted projection; a resuming perch is UNBOUND, not offline. Regression matrix from the hertz RCAs + operator field recovery: offline-row-over-honest-session attaches; offline-no-session refuses; zombie refuses/reaps never attaches; resume-never-bound reads UNBOUND and is attachable; harness-only refuses truthfully pre-stream; qualified targets attach with bare wire id. HEAVY nextest group at birth for any leg spawning a daemon tree (standing CI lint). Gate: int — the matrix; doc — KNOWN-HAZARDS 7.46.",
2026-08-28T09:54:46.8253598Z       "requiredStages": [
2026-08-28T09:54:46.8253757Z         "doc",
2026-08-28T09:54:46.8253903Z         "int"
2026-08-28T09:54:46.8254055Z       ],
2026-08-28T09:54:46.8254220Z       "stages": {
2026-08-28T09:54:46.8254372Z         "doc": {
2026-08-28T09:54:46.8254544Z           "complete": true,
2026-08-28T09:54:46.8254716Z           "evidence": [
2026-08-28T09:54:46.8254873Z             {
2026-08-28T09:54:46.8255079Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8255254Z               "line": 791
2026-08-28T09:54:46.8255408Z             }
2026-08-28T09:54:46.8255564Z           ]
2026-08-28T09:54:46.8255713Z         },
2026-08-28T09:54:46.8255865Z         "impl": {
2026-08-28T09:54:46.8256047Z           "complete": false,
2026-08-28T09:54:46.8256222Z           "evidence": []
2026-08-28T09:54:46.8256376Z         },
2026-08-28T09:54:46.8256537Z         "int": {
2026-08-28T09:54:46.8256714Z           "complete": true,
2026-08-28T09:54:46.8256874Z           "evidence": [
2026-08-28T09:54:46.8257031Z             {
2026-08-28T09:54:46.8257234Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8257388Z               "line": 4516
2026-08-28T09:54:46.8257549Z             },
2026-08-28T09:54:46.8257697Z             {
2026-08-28T09:54:46.8257965Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:46.8258125Z               "line": 278
2026-08-28T09:54:46.8258280Z             },
2026-08-28T09:54:46.8258431Z             {
2026-08-28T09:54:46.8258688Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:46.8259147Z               "line": 341
2026-08-28T09:54:46.8259300Z             },
2026-08-28T09:54:46.8259450Z             {
2026-08-28T09:54:46.8259701Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:46.8259859Z               "line": 376
2026-08-28T09:54:46.8260006Z             },
2026-08-28T09:54:46.8260159Z             {
2026-08-28T09:54:46.8260402Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:46.8260564Z               "line": 438
2026-08-28T09:54:46.8260721Z             },
2026-08-28T09:54:46.8260870Z             {
2026-08-28T09:54:46.8261128Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:46.8261284Z               "line": 510
2026-08-28T09:54:46.8261443Z             }
2026-08-28T09:54:46.8261589Z           ]
2026-08-28T09:54:46.8261748Z         },
2026-08-28T09:54:46.8261903Z         "unit": {
2026-08-28T09:54:46.8262082Z           "complete": false,
2026-08-28T09:54:46.8262251Z           "evidence": []
2026-08-28T09:54:46.8262404Z         }
2026-08-28T09:54:46.8262556Z       }
2026-08-28T09:54:46.8262699Z     },
2026-08-28T09:54:46.8262848Z     {
2026-08-28T09:54:46.8263034Z       "id": "REQ-HAZARD-RC-EOF",
2026-08-28T09:54:46.8273713Z       "title": "A severed broker stream during a live rc session surfaces GRACEFULLY, never as a raw io error that crashes the PTY. The rc read-loop (rc.rs:352-362) continues only on WouldBlock/TimedOut; ANY other read_event_until error — including UnexpectedEof 'failed to fill whole buffer' — returns Err → RC_FAIL → the PTY 'crashes' from the user's view. Confirmed trigger: a deliberate `spt daemon stop` (broker bounce) severs an active rc (perri stopped the daemon to release owlery watch handles). Same severed-broker-stream EOF class as the v0.9.1 seed fix (seed_fail_message) and the listener-death case — spt-core must classify a broker-gone EOF and (a) surface a CLEAR actionable message ('daemon stopped/restarted — re-run / reconnect'), never the raw buffer error, and ideally (b) AUTO-REATTACH to the same session on the fresh broker (the broker is the daemon-lifetime anchor; it returns on the next `spt api` call). FOLD two side-observations: (1) `spt daemon stop` SILENTLY drops active rc/live sessions — warn ('N active session(s) will drop') or graceful-detach on stop; (2) the daemon holds owlery WATCH HANDLES on perch dirs so a torn-down perch dir stays 'Device busy' until a full daemon stop releases them (perri's rt-* cleanup) — a torn-down perch's handle should release without a daemon stop. doyle Finding C, root-caused. (post-v0.10.0)",
2026-08-28T09:54:46.8274027Z       "requiredStages": [
2026-08-28T09:54:46.8274189Z         "impl",
2026-08-28T09:54:46.8274346Z         "unit"
2026-08-28T09:54:46.8274499Z       ],
2026-08-28T09:54:46.8274652Z       "stages": {
2026-08-28T09:54:46.8274805Z         "doc": {
2026-08-28T09:54:46.8274976Z           "complete": false,
2026-08-28T09:54:46.8275146Z           "evidence": []
2026-08-28T09:54:46.8275298Z         },
2026-08-28T09:54:46.8275449Z         "impl": {
2026-08-28T09:54:46.8275622Z           "complete": true,
2026-08-28T09:54:46.8275788Z           "evidence": [
2026-08-28T09:54:46.8275946Z             {
2026-08-28T09:54:46.8276136Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8276294Z               "line": 2863
2026-08-28T09:54:46.8276442Z             }
2026-08-28T09:54:46.8276590Z           ]
2026-08-28T09:54:46.8276746Z         },
2026-08-28T09:54:46.8276894Z         "int": {
2026-08-28T09:54:46.8277066Z           "complete": false,
2026-08-28T09:54:46.8277233Z           "evidence": []
2026-08-28T09:54:46.8277386Z         },
2026-08-28T09:54:46.8277538Z         "unit": {
2026-08-28T09:54:46.8277716Z           "complete": true,
2026-08-28T09:54:46.8277876Z           "evidence": [
2026-08-28T09:54:46.8278028Z             {
2026-08-28T09:54:46.8278231Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8278388Z               "line": 4995
2026-08-28T09:54:46.8278546Z             }
2026-08-28T09:54:46.8278827Z           ]
2026-08-28T09:54:46.8279047Z         }
2026-08-28T09:54:46.8279199Z       }
2026-08-28T09:54:46.8279376Z     },
2026-08-28T09:54:46.8279523Z     {
2026-08-28T09:54:46.8279771Z       "id": "REQ-HAZARD-RC-INPUT-KEY-ENCODING",
2026-08-28T09:54:46.8291912Z       "title": "An `spt rc` session forwards the Backspace key as the VT DEL byte (0x7f), so the hosted TUI (Claude Code) deletes ONE character — never a whole word. SYMPTOM (operator dogfooding): Backspace in an rc session always behaves like ctrl+Backspace — deletes the entire last word. ROOT (doyle /diagnose, code-grounded, byte PENDING HITL confirm): rc is a RAW VERBATIM byte pump — spawn_stdin_reader (rc.rs:152) reads std::io::stdin() bytes under crossterm raw mode and forwards them unchanged (parse_stdin_chunk only intercepts the ctrl-b detach prefix); there is NO key-event encoding and NO 0x08↔0x7f normalization ANYWHERE in the tree (grep: zero SetConsoleMode / ENABLE_VIRTUAL_TERMINAL_INPUT). On Windows, crossterm enable_raw_mode does NOT set ENABLE_VIRTUAL_TERMINAL_INPUT, so the LEGACY console delivers ^H (0x08, ctrl+h) for Backspace instead of VT DEL (0x7f); Claude Code maps ^H → backward-kill-word → the observed whole-word delete. CONFIRM-FIRST (build the loop): an env-gated hexdump in spawn_stdin_reader (SPT_RC_DEBUG_KEYS) prints the forwarded byte; operator presses Backspace + ctrl+Backspace in a real rc session. FIX CANDIDATES: (a) enable ENABLE_VIRTUAL_TERMINAL_INPUT on the rc stdin console on Windows so the console emits proper VT (Backspace→0x7f, arrows/Home/End as CSI) — cleanest, fixes the whole key map not just Backspace; (b) narrow normalize bare 0x08→0x7f in the rc input path (riskier — a real ctrl+h is also 0x08). Prefer (a) unless it regresses other keys. Add a KNOWN-HAZARDS.md entry on landing. (v0.13.0)",
2026-08-28T09:54:46.8292226Z       "requiredStages": [
2026-08-28T09:54:46.8292382Z         "impl",
2026-08-28T09:54:46.8292641Z         "unit"
2026-08-28T09:54:46.8292789Z       ],
2026-08-28T09:54:46.8292951Z       "stages": {
2026-08-28T09:54:46.8293109Z         "doc": {
2026-08-28T09:54:46.8293284Z           "complete": false,
2026-08-28T09:54:46.8293443Z           "evidence": []
2026-08-28T09:54:46.8293598Z         },
2026-08-28T09:54:46.8293753Z         "impl": {
2026-08-28T09:54:46.8293932Z           "complete": true,
2026-08-28T09:54:46.8294094Z           "evidence": [
2026-08-28T09:54:46.8294256Z             {
2026-08-28T09:54:46.8294457Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8294622Z               "line": 526
2026-08-28T09:54:46.8294781Z             }
2026-08-28T09:54:46.8294927Z           ]
2026-08-28T09:54:46.8295082Z         },
2026-08-28T09:54:46.8295233Z         "int": {
2026-08-28T09:54:46.8295505Z           "complete": false,
2026-08-28T09:54:46.8295682Z           "evidence": []
2026-08-28T09:54:46.8295843Z         },
2026-08-28T09:54:46.8296012Z         "unit": {
2026-08-28T09:54:46.8296167Z           "complete": true,
2026-08-28T09:54:46.8296334Z           "evidence": [
2026-08-28T09:54:46.8296479Z             {
2026-08-28T09:54:46.8296675Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8296836Z               "line": 4098
2026-08-28T09:54:46.8296985Z             },
2026-08-28T09:54:46.8297141Z             {
2026-08-28T09:54:46.8297329Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8297485Z               "line": 5108
2026-08-28T09:54:46.8297658Z             },
2026-08-28T09:54:46.8297881Z             {
2026-08-28T09:54:46.8298167Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8298348Z               "line": 5110
2026-08-28T09:54:46.8298501Z             }
2026-08-28T09:54:46.8298649Z           ]
2026-08-28T09:54:46.8298797Z         }
2026-08-28T09:54:46.8299039Z       }
2026-08-28T09:54:46.8299182Z     },
2026-08-28T09:54:46.8299332Z     {
2026-08-28T09:54:46.8299585Z       "id": "REQ-HAZARD-REDISPATCH-CONTROL-STEAL",
2026-08-28T09:54:46.8308580Z       "title": "REDISPATCH-TRUTH W1 (KNOWN-HAZARDS 7.41, hertz field RCA 2026-07-16 — 4/5 endpoints frozen per brain cycle): a fresh dispatcher must NEVER re-serve a terminal stream — a replayed historical Attach must not steal (same-identity silent become_controller, no Displaced) or clear (replayed-EOF detach_session) a LIVE controller. The legitimate same-by successor re-take after a brain restart still silently re-takes: the discriminator is stream LIFECYCLE, never origin identity. Gate: int — production-path regression D1: finished historical Attach + current active Attach, same endpoint/origin; restart target brain only (real run_dispatch_loop rediscovery, NO manual re-serve — the pre-fix e2e bypass is the lesson); prove the historical stream neither takes nor clears the current controller and current input/output stays exactly-once without detach; doc — KNOWN-HAZARDS 7.41. HEAVY nextest group at birth (the HEAVY-AT-BIRTH ruling, .config/nextest.toml). Kin REQ-REDISPATCH-FINISHED-RETIRE (the mechanism), REQ-BRAIN-RESUME-NO-CONTROL-STEAL (the CLOSED session-cursor sibling — different leg), ADR-0038.",
2026-08-28T09:54:46.8308922Z       "requiredStages": [
2026-08-28T09:54:46.8309177Z         "doc",
2026-08-28T09:54:46.8309323Z         "int"
2026-08-28T09:54:46.8309477Z       ],
2026-08-28T09:54:46.8309637Z       "stages": {
2026-08-28T09:54:46.8309799Z         "doc": {
2026-08-28T09:54:46.8309968Z           "complete": true,
2026-08-28T09:54:46.8310131Z           "evidence": [
2026-08-28T09:54:46.8310288Z             {
2026-08-28T09:54:46.8310498Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8310664Z               "line": 751
2026-08-28T09:54:46.8310808Z             }
2026-08-28T09:54:46.8310965Z           ]
2026-08-28T09:54:46.8311113Z         },
2026-08-28T09:54:46.8311270Z         "impl": {
2026-08-28T09:54:46.8311442Z           "complete": true,
2026-08-28T09:54:46.8311600Z           "evidence": [
2026-08-28T09:54:46.8311752Z             {
2026-08-28T09:54:46.8312006Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.8312290Z               "line": 551
2026-08-28T09:54:46.8312436Z             }
2026-08-28T09:54:46.8312587Z           ]
2026-08-28T09:54:46.8312741Z         },
2026-08-28T09:54:46.8312892Z         "int": {
2026-08-28T09:54:46.8313075Z           "complete": true,
2026-08-28T09:54:46.8313241Z           "evidence": [
2026-08-28T09:54:46.8313394Z             {
2026-08-28T09:54:46.8313665Z               "path": "crates/spt-daemon/tests/redispatch.rs",
2026-08-28T09:54:46.8313823Z               "line": 208
2026-08-28T09:54:46.8313971Z             },
2026-08-28T09:54:46.8314123Z             {
2026-08-28T09:54:46.8314395Z               "path": "crates/spt-daemon/tests/redispatch.rs",
2026-08-28T09:54:46.8314558Z               "line": 350
2026-08-28T09:54:46.8314704Z             }
2026-08-28T09:54:46.8314849Z           ]
2026-08-28T09:54:46.8315000Z         },
2026-08-28T09:54:46.8315152Z         "unit": {
2026-08-28T09:54:46.8315324Z           "complete": false,
2026-08-28T09:54:46.8315495Z           "evidence": []
2026-08-28T09:54:46.8315658Z         }
2026-08-28T09:54:46.8315810Z       }
2026-08-28T09:54:46.8315963Z     },
2026-08-28T09:54:46.8316120Z     {
2026-08-28T09:54:46.8316330Z       "id": "REQ-HAZARD-REDISPATCH-STALL",
2026-08-28T09:54:46.8326390Z       "title": "REDISPATCH-STALL W1 (KNOWN-HAZARDS 7.43, hertz v0.34 field RCA 2026-07-16 — recurrent 20-30s PTY/RC freezes, 17-62s DISPATCH tails): one wedged stream subscriber must NEVER stall stream serving, and recovery machinery must not manufacture new replay victims. Today: claim retries x the broad Err(_) opener fallback (dispatch.rs:414) install throwaway peek subscribers whose StreamLog::attach replays the entire retained ring UNDER the per-stream mutex with discarded write errors and the poisoned subscriber left installed — serial 15s bounded-write poison windows (33 observed, all 15,000-15,154ms) composing into the field stalls. Gate: int — production-path regression at the REAL run_dispatch_loop + StreamLog + serve_attach seams: wedge one subscriber conn, prove producer appends and unrelated streams stay flat while the poisoned subscriber is removed and the stream recovers (no abandonment); doc — KNOWN-HAZARDS 7.43. Binding: redispatch D1/D1b stay green every leg. HEAVY nextest group at birth. Kin REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE + REQ-DISPATCH-FALLBACK-CIRCUIT (the mechanisms), REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK (the deadline that fires), ADR-0038 Amendment.",
2026-08-28T09:54:46.8326739Z       "requiredStages": [
2026-08-28T09:54:46.8326899Z         "doc",
2026-08-28T09:54:46.8327048Z         "int"
2026-08-28T09:54:46.8327200Z       ],
2026-08-28T09:54:46.8327349Z       "stages": {
2026-08-28T09:54:46.8327505Z         "doc": {
2026-08-28T09:54:46.8327673Z           "complete": true,
2026-08-28T09:54:46.8327843Z           "evidence": [
2026-08-28T09:54:46.8327995Z             {
2026-08-28T09:54:46.8328207Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8328375Z               "line": 770
2026-08-28T09:54:46.8328522Z             },
2026-08-28T09:54:46.8328680Z             {
2026-08-28T09:54:46.8328937Z               "path": "docs/REDISPATCH-STALL-TRIAGE.md",
2026-08-28T09:54:46.8329189Z               "line": 3
2026-08-28T09:54:46.8329338Z             }
2026-08-28T09:54:46.8329485Z           ]
2026-08-28T09:54:46.8329634Z         },
2026-08-28T09:54:46.8329791Z         "impl": {
2026-08-28T09:54:46.8329968Z           "complete": false,
2026-08-28T09:54:46.8330143Z           "evidence": []
2026-08-28T09:54:46.8330297Z         },
2026-08-28T09:54:46.8330444Z         "int": {
2026-08-28T09:54:46.8330621Z           "complete": true,
2026-08-28T09:54:46.8330795Z           "evidence": [
2026-08-28T09:54:46.8330948Z             {
2026-08-28T09:54:46.8331257Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:46.8331422Z               "line": 318
2026-08-28T09:54:46.8331576Z             }
2026-08-28T09:54:46.8331727Z           ]
2026-08-28T09:54:46.8331986Z         },
2026-08-28T09:54:46.8332138Z         "unit": {
2026-08-28T09:54:46.8332324Z           "complete": false,
2026-08-28T09:54:46.8332487Z           "evidence": []
2026-08-28T09:54:46.8332633Z         }
2026-08-28T09:54:46.8332778Z       }
2026-08-28T09:54:46.8332948Z     },
2026-08-28T09:54:46.8333103Z     {
2026-08-28T09:54:46.8333319Z       "id": "REQ-HAZARD-REGISTRY-CONCURRENT",
2026-08-28T09:54:46.8333965Z       "title": "Concurrent SQLite openers (registry/spool) must not fail with 'database is locked' (4.7)",
2026-08-28T09:54:46.8334143Z       "requiredStages": [
2026-08-28T09:54:46.8334304Z         "impl",
2026-08-28T09:54:46.8334457Z         "unit"
2026-08-28T09:54:46.8334613Z       ],
2026-08-28T09:54:46.8334777Z       "stages": {
2026-08-28T09:54:46.8334928Z         "doc": {
2026-08-28T09:54:46.8335101Z           "complete": true,
2026-08-28T09:54:46.8335253Z           "evidence": [
2026-08-28T09:54:46.8335407Z             {
2026-08-28T09:54:46.8335611Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8335773Z               "line": 177
2026-08-28T09:54:46.8335926Z             }
2026-08-28T09:54:46.8336088Z           ]
2026-08-28T09:54:46.8336248Z         },
2026-08-28T09:54:46.8336397Z         "impl": {
2026-08-28T09:54:46.8336572Z           "complete": true,
2026-08-28T09:54:46.8336740Z           "evidence": [
2026-08-28T09:54:46.8336892Z             {
2026-08-28T09:54:46.8337116Z               "path": "crates/spt-store/src/db.rs",
2026-08-28T09:54:46.8337279Z               "line": 29
2026-08-28T09:54:46.8337426Z             },
2026-08-28T09:54:46.8337579Z             {
2026-08-28T09:54:46.8337803Z               "path": "crates/spt-store/src/db.rs",
2026-08-28T09:54:46.8337961Z               "line": 67
2026-08-28T09:54:46.8338122Z             },
2026-08-28T09:54:46.8338267Z             {
2026-08-28T09:54:46.8338507Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:46.8338664Z               "line": 195
2026-08-28T09:54:46.8338824Z             },
2026-08-28T09:54:46.8339059Z             {
2026-08-28T09:54:46.8339483Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8339650Z               "line": 30
2026-08-28T09:54:46.8339798Z             },
2026-08-28T09:54:46.8339951Z             {
2026-08-28T09:54:46.8340175Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.8340331Z               "line": 99
2026-08-28T09:54:46.8340481Z             }
2026-08-28T09:54:46.8340632Z           ]
2026-08-28T09:54:46.8340776Z         },
2026-08-28T09:54:46.8340937Z         "int": {
2026-08-28T09:54:46.8341120Z           "complete": false,
2026-08-28T09:54:46.8341285Z           "evidence": []
2026-08-28T09:54:46.8341437Z         },
2026-08-28T09:54:46.8341597Z         "unit": {
2026-08-28T09:54:46.8341773Z           "complete": true,
2026-08-28T09:54:46.8341940Z           "evidence": [
2026-08-28T09:54:46.8342093Z             {
2026-08-28T09:54:46.8342330Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8342503Z               "line": 162
2026-08-28T09:54:46.8342660Z             }
2026-08-28T09:54:46.8342808Z           ]
2026-08-28T09:54:46.8342955Z         }
2026-08-28T09:54:46.8343104Z       }
2026-08-28T09:54:46.8343251Z     },
2026-08-28T09:54:46.8343400Z     {
2026-08-28T09:54:46.8343619Z       "id": "REQ-HAZARD-REGISTRY-DIR-CREATE",
2026-08-28T09:54:46.8344515Z       "title": "SQLite store opens create their parent dir themselves — a fresh-home registry op must not SQLITE_CANTOPEN (4.9)",
2026-08-28T09:54:46.8344703Z       "requiredStages": [
2026-08-28T09:54:46.8344854Z         "doc",
2026-08-28T09:54:46.8345013Z         "impl",
2026-08-28T09:54:46.8345164Z         "unit"
2026-08-28T09:54:46.8345313Z       ],
2026-08-28T09:54:46.8345474Z       "stages": {
2026-08-28T09:54:46.8345628Z         "doc": {
2026-08-28T09:54:46.8345808Z           "complete": true,
2026-08-28T09:54:46.8345972Z           "evidence": [
2026-08-28T09:54:46.8346123Z             {
2026-08-28T09:54:46.8346510Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8346771Z               "line": 189
2026-08-28T09:54:46.8347094Z             }
2026-08-28T09:54:46.8347290Z           ]
2026-08-28T09:54:46.8347438Z         },
2026-08-28T09:54:46.8347591Z         "impl": {
2026-08-28T09:54:46.8350839Z           "complete": true,
2026-08-28T09:54:46.8351055Z           "evidence": [
2026-08-28T09:54:46.8351206Z             {
2026-08-28T09:54:46.8351478Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8351641Z               "line": 22
2026-08-28T09:54:46.8351774Z             }
2026-08-28T09:54:46.8351920Z           ]
2026-08-28T09:54:46.8352068Z         },
2026-08-28T09:54:46.8352232Z         "int": {
2026-08-28T09:54:46.8352410Z           "complete": false,
2026-08-28T09:54:46.8352576Z           "evidence": []
2026-08-28T09:54:46.8352720Z         },
2026-08-28T09:54:46.8352885Z         "unit": {
2026-08-28T09:54:46.8353063Z           "complete": true,
2026-08-28T09:54:46.8353244Z           "evidence": [
2026-08-28T09:54:46.8353397Z             {
2026-08-28T09:54:46.8353654Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8353821Z               "line": 298
2026-08-28T09:54:46.8353965Z             }
2026-08-28T09:54:46.8354117Z           ]
2026-08-28T09:54:46.8354251Z         }
2026-08-28T09:54:46.8354397Z       }
2026-08-28T09:54:46.8354549Z     },
2026-08-28T09:54:46.8354700Z     {
2026-08-28T09:54:46.8354934Z       "id": "REQ-HAZARD-REGISTRY-EPOCH-LEASE",
2026-08-28T09:54:46.8356102Z       "title": "Registry merge ordered by per-node monotonic epoch, never wall-clock — a stale Active can't clobber a newer Offline (4.8, red-team #8)",
2026-08-28T09:54:46.8356307Z       "requiredStages": [
2026-08-28T09:54:46.8356450Z         "impl",
2026-08-28T09:54:46.8356602Z         "unit"
2026-08-28T09:54:46.8356750Z       ],
2026-08-28T09:54:46.8356912Z       "stages": {
2026-08-28T09:54:46.8357065Z         "doc": {
2026-08-28T09:54:46.8357232Z           "complete": true,
2026-08-28T09:54:46.8357402Z           "evidence": [
2026-08-28T09:54:46.8357707Z             {
2026-08-28T09:54:46.8357931Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8358094Z               "line": 183
2026-08-28T09:54:46.8358246Z             }
2026-08-28T09:54:46.8358390Z           ]
2026-08-28T09:54:46.8358542Z         },
2026-08-28T09:54:46.8358700Z         "impl": {
2026-08-28T09:54:46.8358876Z           "complete": true,
2026-08-28T09:54:46.8359096Z           "evidence": [
2026-08-28T09:54:46.8359252Z             {
2026-08-28T09:54:46.8359528Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.8359671Z               "line": 59
2026-08-28T09:54:46.8359821Z             },
2026-08-28T09:54:46.8359964Z             {
2026-08-28T09:54:46.8360254Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:46.8360432Z               "line": 294
2026-08-28T09:54:46.8360574Z             },
2026-08-28T09:54:46.8360732Z             {
2026-08-28T09:54:46.8361005Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8361180Z               "line": 221
2026-08-28T09:54:46.8361329Z             },
2026-08-28T09:54:46.8361475Z             {
2026-08-28T09:54:46.8361723Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8361887Z               "line": 479
2026-08-28T09:54:46.8362038Z             },
2026-08-28T09:54:46.8362192Z             {
2026-08-28T09:54:46.8362438Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:46.8362595Z               "line": 20
2026-08-28T09:54:46.8362755Z             }
2026-08-28T09:54:46.8362903Z           ]
2026-08-28T09:54:46.8363055Z         },
2026-08-28T09:54:46.8363209Z         "int": {
2026-08-28T09:54:46.8363389Z           "complete": false,
2026-08-28T09:54:46.8363566Z           "evidence": []
2026-08-28T09:54:46.8363718Z         },
2026-08-28T09:54:46.8363881Z         "unit": {
2026-08-28T09:54:46.8364052Z           "complete": true,
2026-08-28T09:54:46.8364333Z           "evidence": [
2026-08-28T09:54:46.8364487Z             {
2026-08-28T09:54:46.8364768Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.8364934Z               "line": 522
2026-08-28T09:54:46.8365076Z             },
2026-08-28T09:54:46.8365232Z             {
2026-08-28T09:54:46.8365499Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8365683Z               "line": 1500
2026-08-28T09:54:46.8365823Z             },
2026-08-28T09:54:46.8365970Z             {
2026-08-28T09:54:46.8366223Z               "path": "crates/spt-daemon/tests/replicate.rs",
2026-08-28T09:54:46.8366391Z               "line": 89
2026-08-28T09:54:46.8366542Z             },
2026-08-28T09:54:46.8366690Z             {
2026-08-28T09:54:46.8366943Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8367110Z               "line": 1363
2026-08-28T09:54:46.8367262Z             },
2026-08-28T09:54:46.8367416Z             {
2026-08-28T09:54:46.8367669Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8367853Z               "line": 1382
2026-08-28T09:54:46.8367996Z             },
2026-08-28T09:54:46.8368149Z             {
2026-08-28T09:54:46.8368402Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:46.8368572Z               "line": 290
2026-08-28T09:54:46.8368721Z             },
2026-08-28T09:54:46.8368872Z             {
2026-08-28T09:54:46.8369192Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:46.8369360Z               "line": 142
2026-08-28T09:54:46.8369516Z             },
2026-08-28T09:54:46.8369665Z             {
2026-08-28T09:54:46.8369899Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:46.8370055Z               "line": 159
2026-08-28T09:54:46.8370212Z             },
2026-08-28T09:54:46.8370363Z             {
2026-08-28T09:54:46.8370591Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:46.8370753Z               "line": 233
2026-08-28T09:54:46.8371025Z             }
2026-08-28T09:54:46.8371178Z           ]
2026-08-28T09:54:46.8371326Z         }
2026-08-28T09:54:46.8371478Z       }
2026-08-28T09:54:46.8371621Z     },
2026-08-28T09:54:46.8371769Z     {
2026-08-28T09:54:46.8371994Z       "id": "REQ-HAZARD-REGISTRY-GHOST-ROWS",
2026-08-28T09:54:46.8380587Z       "title": "Registry rows must decay (no immortal rows) via TWO triggers: (a) NODE-SILENCE — evict rows whose author node has not been heard (admitted inbound feed) within the eviction window, so a vanished node's rows stop poisoning bare-id resolution with phantom AcrossNodes ambiguity; AND (b) per-row OFFLINE-TTL — evict rows that have been non-routable (Offline) beyond the per-row grace even while the author node is alive, because purge/erase leaves an immortal Offline row otherwise (ghost-heal re-advertises Offline ONCE with a fresh epoch, and whole-node eviction never fires for a still-alive author) so Offline ghost rows accumulate unbounded on a remote viewer under purge/erase churn (#2-secondary). Both keyed on RECEIVER-observed state (heard-map recency / a sticky receiver-observed offline_since, NOT the gossip epoch — an epoch-keyed clock would be reset by ghost-heal's fresh-epoch re-advertise); own rows never decay; a revived/re-flapped row re-inserts (or clears its offline_since) from its durable epoch within one pump cadence (4.10)",
2026-08-28T09:54:46.8380786Z       "requiredStages": [
2026-08-28T09:54:46.8380942Z         "doc",
2026-08-28T09:54:46.8381099Z         "impl",
2026-08-28T09:54:46.8381256Z         "unit"
2026-08-28T09:54:46.8381399Z       ],
2026-08-28T09:54:46.8381562Z       "stages": {
2026-08-28T09:54:46.8381713Z         "doc": {
2026-08-28T09:54:46.8381891Z           "complete": true,
2026-08-28T09:54:46.8382058Z           "evidence": [
2026-08-28T09:54:46.8382210Z             {
2026-08-28T09:54:46.8382420Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8382587Z               "line": 195
2026-08-28T09:54:46.8382844Z             }
2026-08-28T09:54:46.8382997Z           ]
2026-08-28T09:54:46.8383149Z         },
2026-08-28T09:54:46.8383298Z         "impl": {
2026-08-28T09:54:46.8383469Z           "complete": true,
2026-08-28T09:54:46.8383629Z           "evidence": [
2026-08-28T09:54:46.8383781Z             {
2026-08-28T09:54:46.8384062Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.8384228Z               "line": 242
2026-08-28T09:54:46.8384381Z             },
2026-08-28T09:54:46.8384528Z             {
2026-08-28T09:54:46.8384801Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:46.8384958Z               "line": 251
2026-08-28T09:54:46.8385115Z             },
2026-08-28T09:54:46.8385264Z             {
2026-08-28T09:54:46.8385539Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8385697Z               "line": 775
2026-08-28T09:54:46.8385845Z             },
2026-08-28T09:54:46.8385993Z             {
2026-08-28T09:54:46.8386268Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8386433Z               "line": 782
2026-08-28T09:54:46.8386585Z             },
2026-08-28T09:54:46.8386738Z             {
2026-08-28T09:54:46.8387001Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8387167Z               "line": 819
2026-08-28T09:54:46.8387329Z             },
2026-08-28T09:54:46.8387472Z             {
2026-08-28T09:54:46.8387739Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8387892Z               "line": 826
2026-08-28T09:54:46.8388044Z             },
2026-08-28T09:54:46.8388193Z             {
2026-08-28T09:54:46.8388455Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8388611Z               "line": 346
2026-08-28T09:54:46.8388765Z             },
2026-08-28T09:54:46.8388921Z             {
2026-08-28T09:54:46.8389259Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8389513Z               "line": 389
2026-08-28T09:54:46.8389841Z             }
2026-08-28T09:54:46.8389984Z           ]
2026-08-28T09:54:46.8390132Z         },
2026-08-28T09:54:46.8390284Z         "int": {
2026-08-28T09:54:46.8390456Z           "complete": false,
2026-08-28T09:54:46.8390627Z           "evidence": []
2026-08-28T09:54:46.8390776Z         },
2026-08-28T09:54:46.8390933Z         "unit": {
2026-08-28T09:54:46.8391105Z           "complete": true,
2026-08-28T09:54:46.8391265Z           "evidence": [
2026-08-28T09:54:46.8391408Z             {
2026-08-28T09:54:46.8391711Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8391878Z               "line": 2479
2026-08-28T09:54:46.8392021Z             },
2026-08-28T09:54:46.8392169Z             {
2026-08-28T09:54:46.8392441Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8392603Z               "line": 2544
2026-08-28T09:54:46.8392751Z             },
2026-08-28T09:54:46.8392908Z             {
2026-08-28T09:54:46.8393175Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8393338Z               "line": 2583
2026-08-28T09:54:46.8393490Z             },
2026-08-28T09:54:46.8393643Z             {
2026-08-28T09:54:46.8393891Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8394094Z               "line": 1395
2026-08-28T09:54:46.8394252Z             },
2026-08-28T09:54:46.8394402Z             {
2026-08-28T09:54:46.8394650Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8394817Z               "line": 1441
2026-08-28T09:54:46.8394960Z             },
2026-08-28T09:54:46.8395112Z             {
2026-08-28T09:54:46.8395366Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8395523Z               "line": 1471
2026-08-28T09:54:46.8395671Z             },
2026-08-28T09:54:46.8395819Z             {
2026-08-28T09:54:46.8396061Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8396323Z               "line": 1501
2026-08-28T09:54:46.8396477Z             },
2026-08-28T09:54:46.8396623Z             {
2026-08-28T09:54:46.8396871Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:46.8397031Z               "line": 1535
2026-08-28T09:54:46.8397179Z             }
2026-08-28T09:54:46.8397326Z           ]
2026-08-28T09:54:46.8397475Z         }
2026-08-28T09:54:46.8397621Z       }
2026-08-28T09:54:46.8397766Z     },
2026-08-28T09:54:46.8397913Z     {
2026-08-28T09:54:46.8398142Z       "id": "REQ-HAZARD-REGISTRY-STALE-CLEAN",
2026-08-28T09:54:46.8398604Z       "title": "Stale registry entries degrade to fallback, never hard-fail (4.3)",
2026-08-28T09:54:46.8398782Z       "requiredStages": [
2026-08-28T09:54:46.8398933Z         "impl",
2026-08-28T09:54:46.8399166Z         "unit"
2026-08-28T09:54:46.8399306Z       ],
2026-08-28T09:54:46.8399476Z       "stages": {
2026-08-28T09:54:46.8399643Z         "doc": {
2026-08-28T09:54:46.8399819Z           "complete": false,
2026-08-28T09:54:46.8399991Z           "evidence": []
2026-08-28T09:54:46.8400139Z         },
2026-08-28T09:54:46.8400296Z         "impl": {
2026-08-28T09:54:46.8400463Z           "complete": true,
2026-08-28T09:54:46.8400635Z           "evidence": [
2026-08-28T09:54:46.8400787Z             {
2026-08-28T09:54:46.8401036Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:46.8401192Z               "line": 43
2026-08-28T09:54:46.8401345Z             },
2026-08-28T09:54:46.8401493Z             {
2026-08-28T09:54:46.8401740Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8401897Z               "line": 55
2026-08-28T09:54:46.8402048Z             },
2026-08-28T09:54:46.8402200Z             {
2026-08-28T09:54:46.8402438Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8402596Z               "line": 66
2026-08-28T09:54:46.8402748Z             },
2026-08-28T09:54:46.8402897Z             {
2026-08-28T09:54:46.8403139Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8403416Z               "line": 115
2026-08-28T09:54:46.8403574Z             },
2026-08-28T09:54:46.8403716Z             {
2026-08-28T09:54:46.8403960Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8404113Z               "line": 138
2026-08-28T09:54:46.8404265Z             }
2026-08-28T09:54:46.8404403Z           ]
2026-08-28T09:54:46.8404542Z         },
2026-08-28T09:54:46.8404697Z         "int": {
2026-08-28T09:54:46.8404873Z           "complete": false,
2026-08-28T09:54:46.8405043Z           "evidence": []
2026-08-28T09:54:46.8405197Z         },
2026-08-28T09:54:46.8405357Z         "unit": {
2026-08-28T09:54:46.8405530Z           "complete": true,
2026-08-28T09:54:46.8405701Z           "evidence": [
2026-08-28T09:54:46.8405850Z             {
2026-08-28T09:54:46.8406084Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.8406250Z               "line": 524
2026-08-28T09:54:46.8406403Z             },
2026-08-28T09:54:46.8406554Z             {
2026-08-28T09:54:46.8406785Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.8406950Z               "line": 530
2026-08-28T09:54:46.8407099Z             },
2026-08-28T09:54:46.8407245Z             {
2026-08-28T09:54:46.8407473Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.8407638Z               "line": 544
2026-08-28T09:54:46.8407797Z             },
2026-08-28T09:54:46.8407943Z             {
2026-08-28T09:54:46.8408168Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.8408321Z               "line": 553
2026-08-28T09:54:46.8408474Z             },
2026-08-28T09:54:46.8408626Z             {
2026-08-28T09:54:46.8408869Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8409117Z               "line": 195
2026-08-28T09:54:46.8409285Z             },
2026-08-28T09:54:46.8409436Z             {
2026-08-28T09:54:46.8409808Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8409977Z               "line": 208
2026-08-28T09:54:46.8410122Z             },
2026-08-28T09:54:46.8410270Z             {
2026-08-28T09:54:46.8410508Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8410666Z               "line": 271
2026-08-28T09:54:46.8410817Z             },
2026-08-28T09:54:46.8410971Z             {
2026-08-28T09:54:46.8411210Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8411371Z               "line": 290
2026-08-28T09:54:46.8411525Z             },
2026-08-28T09:54:46.8411677Z             {
2026-08-28T09:54:46.8411915Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:46.8412072Z               "line": 319
2026-08-28T09:54:46.8412225Z             }
2026-08-28T09:54:46.8412381Z           ]
2026-08-28T09:54:46.8412529Z         }
2026-08-28T09:54:46.8412675Z       }
2026-08-28T09:54:46.8412823Z     },
2026-08-28T09:54:46.8412980Z     {
2026-08-28T09:54:46.8413180Z       "id": "REQ-HAZARD-REGISTRY-STALL",
2026-08-28T09:54:46.8421649Z       "title": "REGISTRY-LIFECYCLE W1 (KNOWN-HAZARDS 7.44, hertz post-close v0.36 RCA — the umbrella conformance seam): streams and seats on a long-lived connection have BOUNDED lifetime. The hertz regression seam verbatim: real long-lived pump + dispatcher integration, N registry-only rounds over ONE persistent connection, asserting (a) dispatcher-eligible Registry rows plateau O(active) not O(N); (b) physical stream/subscriber/seat counts plateau after completion CROSS-FAMILY (sync/update seats included, not just Registry); (c) snapshot writes O(feeds) not O(chunks x record-kinds); (d) brain refresh produces ZERO historical Registry replay subscriptions; (e) zero CONN_WRITE_POISONED / replay-write-failed events; (f) broker thread count returns to a bounded baseline. HEAVY nextest group at birth (spawns a real daemon tree). Binding: redispatch D1/D1b + REDISPATCH-STALL T1-T7 + mesh-recovery legs green every leg (retire machinery + registry gate = substrate). Gate: int — the seam above; doc — KNOWN-HAZARDS 7.44.",
2026-08-28T09:54:46.8421988Z       "requiredStages": [
2026-08-28T09:54:46.8422142Z         "doc",
2026-08-28T09:54:46.8422293Z         "int"
2026-08-28T09:54:46.8422443Z       ],
2026-08-28T09:54:46.8422603Z       "stages": {
2026-08-28T09:54:46.8422758Z         "doc": {
2026-08-28T09:54:46.8422927Z           "complete": true,
2026-08-28T09:54:46.8423094Z           "evidence": [
2026-08-28T09:54:46.8423244Z             {
2026-08-28T09:54:46.8423455Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8423610Z               "line": 777
2026-08-28T09:54:46.8423764Z             }
2026-08-28T09:54:46.8423921Z           ]
2026-08-28T09:54:46.8424069Z         },
2026-08-28T09:54:46.8424226Z         "impl": {
2026-08-28T09:54:46.8424403Z           "complete": false,
2026-08-28T09:54:46.8424565Z           "evidence": []
2026-08-28T09:54:46.8424717Z         },
2026-08-28T09:54:46.8424870Z         "int": {
2026-08-28T09:54:46.8425042Z           "complete": true,
2026-08-28T09:54:46.8425218Z           "evidence": [
2026-08-28T09:54:46.8425375Z             {
2026-08-28T09:54:46.8425690Z               "path": "crates/spt-daemon/tests/registry_lifecycle.rs",
2026-08-28T09:54:46.8425851Z               "line": 163
2026-08-28T09:54:46.8426007Z             }
2026-08-28T09:54:46.8426153Z           ]
2026-08-28T09:54:46.8426307Z         },
2026-08-28T09:54:46.8426464Z         "unit": {
2026-08-28T09:54:46.8426636Z           "complete": false,
2026-08-28T09:54:46.8426802Z           "evidence": []
2026-08-28T09:54:46.8426951Z         }
2026-08-28T09:54:46.8427107Z       }
2026-08-28T09:54:46.8427251Z     },
2026-08-28T09:54:46.8427403Z     {
2026-08-28T09:54:46.8427613Z       "id": "REQ-HAZARD-RENDER-LIFECYCLE",
2026-08-28T09:54:46.8432998Z       "title": "RC-RENDER-TRUTH W3 (KNOWN-HAZARDS 7.47 — umbrella conformance seam for ADR-0043): the physical terminal is never mutated or terminated outside its renderer's ordered state model. Regression matrix from the hertz RCA: output-before-exit through the production path; unconditional display teardown across every rc exit class; TUI baseline reconstructs whole after out-of-band mutation (recording backend); repaint replays tracked modes. Deferred P2 seeds recorded, NOT this milestone: Exit{after_seq} watermark defense; per-client semantic baseline (only if spt ever transforms live frames). Gate: int — the matrix; doc — KNOWN-HAZARDS 7.47.",
2026-08-28T09:54:46.8433303Z       "requiredStages": [
2026-08-28T09:54:46.8433454Z         "doc",
2026-08-28T09:54:46.8433611Z         "int"
2026-08-28T09:54:46.8433756Z       ],
2026-08-28T09:54:46.8433918Z       "stages": {
2026-08-28T09:54:46.8434067Z         "doc": {
2026-08-28T09:54:46.8434233Z           "complete": true,
2026-08-28T09:54:46.8434405Z           "evidence": [
2026-08-28T09:54:46.8434553Z             {
2026-08-28T09:54:46.8434767Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8434930Z               "line": 798
2026-08-28T09:54:46.8435086Z             }
2026-08-28T09:54:46.8435231Z           ]
2026-08-28T09:54:46.8435387Z         },
2026-08-28T09:54:46.8435541Z         "impl": {
2026-08-28T09:54:46.8435711Z           "complete": false,
2026-08-28T09:54:46.8435884Z           "evidence": []
2026-08-28T09:54:46.8436026Z         },
2026-08-28T09:54:46.8436180Z         "int": {
2026-08-28T09:54:46.8436445Z           "complete": true,
2026-08-28T09:54:46.8436714Z           "evidence": [
2026-08-28T09:54:46.8436920Z             {
2026-08-28T09:54:46.8437225Z               "path": "crates/spt-daemon/tests/render_lifecycle.rs",
2026-08-28T09:54:46.8437371Z               "line": 76
2026-08-28T09:54:46.8437506Z             },
2026-08-28T09:54:46.8437648Z             {
2026-08-28T09:54:46.8437873Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:46.8438050Z               "line": 642
2026-08-28T09:54:46.8438202Z             },
2026-08-28T09:54:46.8438355Z             {
2026-08-28T09:54:46.8438554Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:46.8439045Z               "line": 3959
2026-08-28T09:54:46.8439195Z             }
2026-08-28T09:54:46.8439357Z           ]
2026-08-28T09:54:46.8439634Z         },
2026-08-28T09:54:46.8439787Z         "unit": {
2026-08-28T09:54:46.8439963Z           "complete": false,
2026-08-28T09:54:46.8440120Z           "evidence": []
2026-08-28T09:54:46.8440278Z         }
2026-08-28T09:54:46.8440425Z       }
2026-08-28T09:54:46.8440573Z     },
2026-08-28T09:54:46.8440716Z     {
2026-08-28T09:54:46.8440946Z       "id": "REQ-HAZARD-RESTART-IDEMPOTENT",
2026-08-28T09:54:46.8441628Z       "title": "Idempotent/exactly-once delivery across brain restart at every broker boundary (codex #14)",
2026-08-28T09:54:46.8441802Z       "requiredStages": [
2026-08-28T09:54:46.8441960Z         "impl",
2026-08-28T09:54:46.8442112Z         "unit",
2026-08-28T09:54:46.8442270Z         "int"
2026-08-28T09:54:46.8442422Z       ],
2026-08-28T09:54:46.8442580Z       "stages": {
2026-08-28T09:54:46.8442737Z         "doc": {
2026-08-28T09:54:46.8442909Z           "complete": false,
2026-08-28T09:54:46.8443080Z           "evidence": []
2026-08-28T09:54:46.8443229Z         },
2026-08-28T09:54:46.8443390Z         "impl": {
2026-08-28T09:54:46.8443558Z           "complete": true,
2026-08-28T09:54:46.8443729Z           "evidence": [
2026-08-28T09:54:46.8443878Z             {
2026-08-28T09:54:46.8444118Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8444280Z               "line": 891
2026-08-28T09:54:46.8444426Z             },
2026-08-28T09:54:46.8444575Z             {
2026-08-28T09:54:46.8444803Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8444975Z               "line": 1890
2026-08-28T09:54:46.8445123Z             },
2026-08-28T09:54:46.8445275Z             {
2026-08-28T09:54:46.8445509Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8445675Z               "line": 1971
2026-08-28T09:54:46.8445938Z             },
2026-08-28T09:54:46.8446082Z             {
2026-08-28T09:54:46.8446329Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.8446491Z               "line": 2016
2026-08-28T09:54:46.8446644Z             },
2026-08-28T09:54:46.8446788Z             {
2026-08-28T09:54:46.8447038Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8447198Z               "line": 8336
2026-08-28T09:54:46.8447346Z             },
2026-08-28T09:54:46.8447504Z             {
2026-08-28T09:54:46.8447737Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8447908Z               "line": 8839
2026-08-28T09:54:46.8448052Z             },
2026-08-28T09:54:46.8448204Z             {
2026-08-28T09:54:46.8448442Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8448610Z               "line": 9127
2026-08-28T09:54:46.8448762Z             },
2026-08-28T09:54:46.8448920Z             {
2026-08-28T09:54:46.8449254Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8449419Z               "line": 9192
2026-08-28T09:54:46.8449572Z             },
2026-08-28T09:54:46.8449722Z             {
2026-08-28T09:54:46.8449961Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.8450117Z               "line": 67
2026-08-28T09:54:46.8450271Z             },
2026-08-28T09:54:46.8450422Z             {
2026-08-28T09:54:46.8450652Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.8450818Z               "line": 414
2026-08-28T09:54:46.8450967Z             },
2026-08-28T09:54:46.8451123Z             {
2026-08-28T09:54:46.8451343Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.8451506Z               "line": 708
2026-08-28T09:54:46.8451653Z             },
2026-08-28T09:54:46.8451802Z             {
2026-08-28T09:54:46.8452039Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.8452202Z               "line": 382
2026-08-28T09:54:46.8452362Z             },
2026-08-28T09:54:46.8452510Z             {
2026-08-28T09:54:46.8452859Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.8453015Z               "line": 425
2026-08-28T09:54:46.8453174Z             }
2026-08-28T09:54:46.8453321Z           ]
2026-08-28T09:54:46.8453474Z         },
2026-08-28T09:54:46.8453631Z         "int": {
2026-08-28T09:54:46.8453803Z           "complete": true,
2026-08-28T09:54:46.8453974Z           "evidence": [
2026-08-28T09:54:46.8454128Z             {
2026-08-28T09:54:46.8454400Z               "path": "crates/spt-daemon/tests/idempotent.rs",
2026-08-28T09:54:46.8454560Z               "line": 27
2026-08-28T09:54:46.8454712Z             },
2026-08-28T09:54:46.8454858Z             {
2026-08-28T09:54:46.8455125Z               "path": "crates/spt-daemon/tests/netbroker.rs",
2026-08-28T09:54:46.8455291Z               "line": 150
2026-08-28T09:54:46.8455440Z             },
2026-08-28T09:54:46.8455591Z             {
2026-08-28T09:54:46.8455849Z               "path": "crates/spt-daemon/tests/netstream.rs",
2026-08-28T09:54:46.8456017Z               "line": 214
2026-08-28T09:54:46.8456169Z             }
2026-08-28T09:54:46.8456318Z           ]
2026-08-28T09:54:46.8456465Z         },
2026-08-28T09:54:46.8456623Z         "unit": {
2026-08-28T09:54:46.8456788Z           "complete": true,
2026-08-28T09:54:46.8456948Z           "evidence": [
2026-08-28T09:54:46.8457089Z             {
2026-08-28T09:54:46.8457324Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.8457489Z               "line": 636
2026-08-28T09:54:46.8457636Z             },
2026-08-28T09:54:46.8457791Z             {
2026-08-28T09:54:46.8458021Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.8458187Z               "line": 668
2026-08-28T09:54:46.8458340Z             },
2026-08-28T09:54:46.8458483Z             {
2026-08-28T09:54:46.8458717Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:46.8458875Z               "line": 724
2026-08-28T09:54:46.8459233Z             },
2026-08-28T09:54:46.8459393Z             {
2026-08-28T09:54:46.8459650Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:46.8459815Z               "line": 2390
2026-08-28T09:54:46.8459961Z             },
2026-08-28T09:54:46.8460112Z             {
2026-08-28T09:54:46.8460358Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.8460521Z               "line": 828
2026-08-28T09:54:46.8460668Z             },
2026-08-28T09:54:46.8460822Z             {
2026-08-28T09:54:46.8461059Z               "path": "crates/spt-daemon/tests/wanmsg.rs",
2026-08-28T09:54:46.8461226Z               "line": 309
2026-08-28T09:54:46.8461378Z             },
2026-08-28T09:54:46.8461527Z             {
2026-08-28T09:54:46.8461761Z               "path": "crates/spt-daemon/tests/xfer.rs",
2026-08-28T09:54:46.8461918Z               "line": 231
2026-08-28T09:54:46.8462066Z             },
2026-08-28T09:54:46.8462213Z             {
2026-08-28T09:54:46.8462499Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.8462800Z               "line": 1193
2026-08-28T09:54:46.8462970Z             },
2026-08-28T09:54:46.8463114Z             {
2026-08-28T09:54:46.8463342Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.8463495Z               "line": 1223
2026-08-28T09:54:46.8463638Z             }
2026-08-28T09:54:46.8463772Z           ]
2026-08-28T09:54:46.8463914Z         }
2026-08-28T09:54:46.8464072Z       }
2026-08-28T09:54:46.8464224Z     },
2026-08-28T09:54:46.8464373Z     {
2026-08-28T09:54:46.8464702Z       "id": "REQ-HAZARD-RESTART-STRANDS-PERSISTENT-SHELLS",
2026-08-28T09:54:46.8482047Z       "title": "A NODE RESTART MUST NOT PERMANENTLY STRAND EVERY `persistent` SHELL, AND THE EXISTING CASCADE TEST CANNOT SEE THAT IT DOES. Distinct from REQ-HAZARD-SHELL-STALE-ONLINE, which governs a force-kill DURING operation: this is a different trigger with a different safe remedy, and conflating them is how the restart class stays invisible. THE COVERAGE GAP IS THE HAZARD'S OWN SUBJECT, and it must be named here so no future reader mistakes the cascade test for coverage of this class: `rest_edges_cascade_shells_with_divergence` (spt-daemon resting.rs) is the cascade's only coverage and it walks the graceful path ONLY -- it SUSPENDS FIRST, and the suspend edge WRITES the offline record, so by the time the wake edge fires the instance is already in exactly the state the to_active arm requires. The restart shape -- record left online over a corpse, no rest edge ever -- is UNREACHABLE FROM THAT TEST BY CONSTRUCTION. The test is not weak; its SETUP SUPPRESSES THE FAILING ARM, so a reader asking whether the cascade is covered gets a true answer to the wrong question. This is the third suppressed-arm instance found in one week, and the pattern is the same each time: a fixture that establishes the precondition the code under test is supposed to establish. THE OWNER-FACING SURFACES HIDE THE FAULT, which is why it survived unreported for days: every display path (`shell list`, its --json twin, the shell-context render) routes through the ONE discovery seam, which DERIVES status and so correctly reports the binary as offline, while the only consumer whose decision matters -- the wake cascade -- reads the RECORDED field that no owner-facing surface shows. Absence of a visible symptom is therefore not evidence of absence of this fault, and a clean-looking context render must never be taken as proof the class did not occur; the correct falsifier is the on-disk record. Gate: impl -- the restart shape reaches a restoration path at all (leg b) and the record stops lying (leg a); unit -- the RESTART shape specifically, constructed WITHOUT a suspend edge: an instance whose record says online over a corpse that predates boot, with an online owner, is restored -- the row `rest_edges_cascade_shells_with_divergence` cannot express, asserted on a fixture that never calls the suspend path, since a fixture that suspends first re-creates the suppressed arm and proves nothing about this class.",
2026-08-28T09:54:46.8482513Z       "requiredStages": [
2026-08-28T09:54:46.8482670Z         "doc",
2026-08-28T09:54:46.8482828Z         "impl",
2026-08-28T09:54:46.8482981Z         "unit"
2026-08-28T09:54:46.8483133Z       ],
2026-08-28T09:54:46.8483286Z       "stages": {
2026-08-28T09:54:46.8483438Z         "doc": {
2026-08-28T09:54:46.8483615Z           "complete": true,
2026-08-28T09:54:46.8483777Z           "evidence": [
2026-08-28T09:54:46.8483944Z             {
2026-08-28T09:54:46.8484153Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8484319Z               "line": 92
2026-08-28T09:54:46.8484468Z             }
2026-08-28T09:54:46.8484616Z           ]
2026-08-28T09:54:46.8484768Z         },
2026-08-28T09:54:46.8484916Z         "impl": {
2026-08-28T09:54:46.8485092Z           "complete": true,
2026-08-28T09:54:46.8485254Z           "evidence": [
2026-08-28T09:54:46.8485402Z             {
2026-08-28T09:54:46.8485659Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.8485832Z               "line": 615
2026-08-28T09:54:46.8485983Z             },
2026-08-28T09:54:46.8486128Z             {
2026-08-28T09:54:46.8486417Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.8486576Z               "line": 731
2026-08-28T09:54:46.8486744Z             }
2026-08-28T09:54:46.8486896Z           ]
2026-08-28T09:54:46.8487044Z         },
2026-08-28T09:54:46.8487196Z         "int": {
2026-08-28T09:54:46.8487393Z           "complete": false,
2026-08-28T09:54:46.8487587Z           "evidence": []
2026-08-28T09:54:46.8487735Z         },
2026-08-28T09:54:46.8487892Z         "unit": {
2026-08-28T09:54:46.8488064Z           "complete": true,
2026-08-28T09:54:46.8488231Z           "evidence": [
2026-08-28T09:54:46.8488384Z             {
2026-08-28T09:54:46.8488642Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.8488808Z               "line": 1066
2026-08-28T09:54:46.8489037Z             }
2026-08-28T09:54:46.8489192Z           ]
2026-08-28T09:54:46.8489553Z         }
2026-08-28T09:54:46.8489706Z       }
2026-08-28T09:54:46.8489843Z     },
2026-08-28T09:54:46.8489988Z     {
2026-08-28T09:54:46.8490246Z       "id": "REQ-HAZARD-RESUME-CUSTODY-ABA",
2026-08-28T09:54:46.8494042Z       "title": "KNOWN-HAZARDS 7.51: process custody is an identity, never a bare PID — a recycled pid must read NOT OURS. The hazard-conformance twin of REQ-RESUME-CUSTODY-IDENTITY: its int-stage recycled-pid rig IS this hazard's required test (custody pair mismatching a live impostor pid -> record deleted, reconcile proceeds, row goes honest). Registered separately so the hazard list stays a conformance checklist (CLAUDE.md rule 4) — evidence may tag the same rig.",
2026-08-28T09:54:46.8494227Z       "requiredStages": [
2026-08-28T09:54:46.8494381Z         "doc",
2026-08-28T09:54:46.8494528Z         "int"
2026-08-28T09:54:46.8494679Z       ],
2026-08-28T09:54:46.8494838Z       "stages": {
2026-08-28T09:54:46.8494998Z         "doc": {
2026-08-28T09:54:46.8495172Z           "complete": true,
2026-08-28T09:54:46.8495338Z           "evidence": [
2026-08-28T09:54:46.8495481Z             {
2026-08-28T09:54:46.8495691Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8495857Z               "line": 830
2026-08-28T09:54:46.8496006Z             }
2026-08-28T09:54:46.8496158Z           ]
2026-08-28T09:54:46.8496306Z         },
2026-08-28T09:54:46.8496457Z         "impl": {
2026-08-28T09:54:46.8496640Z           "complete": false,
2026-08-28T09:54:46.8496805Z           "evidence": []
2026-08-28T09:54:46.8496962Z         },
2026-08-28T09:54:46.8497127Z         "int": {
2026-08-28T09:54:46.8497304Z           "complete": true,
2026-08-28T09:54:46.8497470Z           "evidence": [
2026-08-28T09:54:46.8497623Z             {
2026-08-28T09:54:46.8497948Z               "path": "crates/spt-daemon/tests/resume_custody_aba.rs",
2026-08-28T09:54:46.8498109Z               "line": 128
2026-08-28T09:54:46.8498263Z             }
2026-08-28T09:54:46.8498519Z           ]
2026-08-28T09:54:46.8498676Z         },
2026-08-28T09:54:46.8498834Z         "unit": {
2026-08-28T09:54:46.8499096Z           "complete": false,
2026-08-28T09:54:46.8499268Z           "evidence": []
2026-08-28T09:54:46.8499416Z         }
2026-08-28T09:54:46.8499565Z       }
2026-08-28T09:54:46.8499711Z     },
2026-08-28T09:54:46.8499863Z     {
2026-08-28T09:54:46.8500098Z       "id": "REQ-HAZARD-RING-PERCH-ADOPTION",
2026-08-28T09:54:46.8528287Z       "title": "A ring NEVER adopts — and therefore never deletes — a perch directory it did not create in THIS invocation (3.4). The twin of REQ-HAZARD-EPHEMERAL-CLEANUP, which guarded the LEAK direction only: cleanup runs on every exit path, so the moment `ring` mistakes somebody's REAL perch for its own ephemeral one, that same guaranteed cleanup becomes a guaranteed DELETION — ready marker, info.json, spool.db and the dir itself, by silent CLI-side fs ops with no daemon log (field 2026-07-27: emphasys lost a live endpoint and its spooled mail this way). DELETION IS ONLY THE DURABILITY HALF: while the ring holds the adopted perch, its reply-wait `drain_one_at` CONSUMES whatever is in the victim's spool and RENDERS it to the ringer as the reply. When ringer and victim are the SAME agent (the field case) that is at worst loss — anything drained goes to its intended recipient. When a THIRD party rings a live agent it is CROSS-AGENT MAIL DISCLOSURE: the victim's inbox is drained into the ringer's output, with no trace on either side once the dir is removed, and on a subnet spanning machines that is a CONFIDENTIALITY failure, not merely a durability one. Proven by the red-first artifact — with the guard disabled the survival unit returns `Replied{from:\"someone\", body:\"mail that must survive\"}` instead of a refusal. (Field-bounded by emphasys 2026-07-27: his own 66-second ring window returned TIMEOUT with no `Replied`, so nothing was drained in THAT incident — the disclosure shape was available and did not fire.) SELF-CAMOUFLAGING, which is why it went unattributed: the damage — perch gone, roster row ghosted — MIMICS the stale-liveness condition people reach for `ring` to diagnose, so the field caller was probing a ghost-roster symptom and the probe manufactured a fresh one; debuggers of stale liveness are disproportionately its victims and read the wreckage as more of the symptom they were chasing. The misjudgement source is READY-MARKER-FIRST liveness: an existing perch whose ready marker is momentarily down (busy turn, soft session-end, stale re-bind — and on hosted OMP endpoints marker-down is the NORMAL steady state during work, since the extension owns the listener and publishes busy/idle through `api state`) reads 'caller is perchless', so marker-first misjudges HEALTHY endpoints routinely, not rarely. INVARIANT: before creating an ephemeral reply perch, probe the perch DIRECTORY, not the marker — a dir carrying a record or a spool is OCCUPIED and the ring refuses to adopt it; an UNREADABLE record (corrupt/truncated info.json) or an unreadable dir counts as OCCUPIED, never as residue, because deletion is irreversible and refusal is recoverable, so every ambiguity resolves toward refusal; a pre-existing EMPTY dir is refused too (it is not provably ring's own residue — `endpoint run` mid-create owns an empty perch dir for a window, and deleting it is the same race wearing a different hat). Refusal is never silent and never blocks: the message is DELIVERED, the call declines to block-wait (the reply lands on the caller's own listener), and the caller gets a distinct loud report — RING_PERCH_EXISTS (record/spool) or RING_STALE_DIR (empty, naming the path and the manual remedy), so the permanent-refusal failure mode is solved by LOUDNESS rather than by a self-heal that would re-introduce the deletion race. Structural, not advisory: the leaf dir is created with `create_dir` (fails AlreadyExists), so even a perch that appears between the probe and the create cannot be adopted, and the occupied-refusal path never calls cleanup.",
2026-08-28T09:54:46.8528761Z       "requiredStages": [
2026-08-28T09:54:46.8528926Z         "impl",
2026-08-28T09:54:46.8529169Z         "unit"
2026-08-28T09:54:46.8529318Z       ],
2026-08-28T09:54:46.8529479Z       "stages": {
2026-08-28T09:54:46.8529628Z         "doc": {
2026-08-28T09:54:46.8529813Z           "complete": true,
2026-08-28T09:54:46.8529972Z           "evidence": [
2026-08-28T09:54:46.8530114Z             {
2026-08-28T09:54:46.8530381Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:46.8530544Z               "line": 34
2026-08-28T09:54:46.8530695Z             },
2026-08-28T09:54:46.8530849Z             {
2026-08-28T09:54:46.8531063Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8531216Z               "line": 125
2026-08-28T09:54:46.8531367Z             }
2026-08-28T09:54:46.8531524Z           ]
2026-08-28T09:54:46.8531675Z         },
2026-08-28T09:54:46.8531827Z         "impl": {
2026-08-28T09:54:46.8531994Z           "complete": true,
2026-08-28T09:54:46.8532161Z           "evidence": [
2026-08-28T09:54:46.8532360Z             {
2026-08-28T09:54:46.8532585Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8532752Z               "line": 136
2026-08-28T09:54:46.8532905Z             },
2026-08-28T09:54:46.8533053Z             {
2026-08-28T09:54:46.8533276Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8533440Z               "line": 233
2026-08-28T09:54:46.8533591Z             },
2026-08-28T09:54:46.8533741Z             {
2026-08-28T09:54:46.8533953Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8534115Z               "line": 338
2026-08-28T09:54:46.8534260Z             },
2026-08-28T09:54:46.8534413Z             {
2026-08-28T09:54:46.8534608Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8534771Z               "line": 11720
2026-08-28T09:54:46.8534918Z             },
2026-08-28T09:54:46.8535072Z             {
2026-08-28T09:54:46.8535266Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8535434Z               "line": 11736
2026-08-28T09:54:46.8535706Z             }
2026-08-28T09:54:46.8535858Z           ]
2026-08-28T09:54:46.8536011Z         },
2026-08-28T09:54:46.8536158Z         "int": {
2026-08-28T09:54:46.8536341Z           "complete": false,
2026-08-28T09:54:46.8536506Z           "evidence": []
2026-08-28T09:54:46.8536660Z         },
2026-08-28T09:54:46.8536810Z         "unit": {
2026-08-28T09:54:46.8536982Z           "complete": true,
2026-08-28T09:54:46.8537153Z           "evidence": [
2026-08-28T09:54:46.8537302Z             {
2026-08-28T09:54:46.8537525Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8537683Z               "line": 605
2026-08-28T09:54:46.8537835Z             },
2026-08-28T09:54:46.8537983Z             {
2026-08-28T09:54:46.8538203Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8538360Z               "line": 648
2026-08-28T09:54:46.8538523Z             },
2026-08-28T09:54:46.8538703Z             {
2026-08-28T09:54:46.8538914Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8539164Z               "line": 699
2026-08-28T09:54:46.8539321Z             },
2026-08-28T09:54:46.8539477Z             {
2026-08-28T09:54:46.8543303Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8543513Z               "line": 728
2026-08-28T09:54:46.8543671Z             },
2026-08-28T09:54:46.8543817Z             {
2026-08-28T09:54:46.8544052Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:46.8544223Z               "line": 756
2026-08-28T09:54:46.8544377Z             }
2026-08-28T09:54:46.8544527Z           ]
2026-08-28T09:54:46.8544670Z         }
2026-08-28T09:54:46.8544825Z       }
2026-08-28T09:54:46.8544968Z     },
2026-08-28T09:54:46.8545116Z     {
2026-08-28T09:54:46.8545360Z       "id": "REQ-HAZARD-ROLLBACK-STATE-COMPAT",
2026-08-28T09:54:46.8550032Z       "title": "A brain must not irreversibly migrate durable state before update ready-promotion: the readiness-gated auto-rollback (ADR-0018 Q7) spawns the N-1 binary against durable state the new brain may have written, so every pre-ready write must stay N-1-readable (schema migrations gated behind ready-promotion, or written N-1-tolerant/additive). Else the first in-place schema migration silently bricks rollback (KNOWN-HAZARDS 6.8). Free now — a 2026-06-09 audit confirmed zero state-migration code exists; unmintable retroactively once a migration ships.",
2026-08-28T09:54:46.8550376Z       "requiredStages": [
2026-08-28T09:54:46.8550529Z         "doc",
2026-08-28T09:54:46.8550691Z         "impl",
2026-08-28T09:54:46.8550848Z         "unit"
2026-08-28T09:54:46.8550991Z       ],
2026-08-28T09:54:46.8551149Z       "stages": {
2026-08-28T09:54:46.8551296Z         "doc": {
2026-08-28T09:54:46.8551468Z           "complete": true,
2026-08-28T09:54:46.8551635Z           "evidence": [
2026-08-28T09:54:46.8551787Z             {
2026-08-28T09:54:46.8552003Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8552178Z               "line": 424
2026-08-28T09:54:46.8552333Z             }
2026-08-28T09:54:46.8552478Z           ]
2026-08-28T09:54:46.8552625Z         },
2026-08-28T09:54:46.8552776Z         "impl": {
2026-08-28T09:54:46.8552952Z           "complete": true,
2026-08-28T09:54:46.8553110Z           "evidence": [
2026-08-28T09:54:46.8553262Z             {
2026-08-28T09:54:46.8553548Z               "path": "crates/spt-daemon/src/rollback_compat.rs",
2026-08-28T09:54:46.8553711Z               "line": 33
2026-08-28T09:54:46.8553868Z             },
2026-08-28T09:54:46.8554020Z             {
2026-08-28T09:54:46.8554297Z               "path": "crates/spt-daemon/src/rollback_compat.rs",
2026-08-28T09:54:46.8554454Z               "line": 39
2026-08-28T09:54:46.8554603Z             }
2026-08-28T09:54:46.8554755Z           ]
2026-08-28T09:54:46.8554903Z         },
2026-08-28T09:54:46.8555054Z         "int": {
2026-08-28T09:54:46.8555225Z           "complete": false,
2026-08-28T09:54:46.8555399Z           "evidence": []
2026-08-28T09:54:46.8555538Z         },
2026-08-28T09:54:46.8555897Z         "unit": {
2026-08-28T09:54:46.8556071Z           "complete": true,
2026-08-28T09:54:46.8556230Z           "evidence": [
2026-08-28T09:54:46.8556372Z             {
2026-08-28T09:54:46.8556677Z               "path": "crates/spt-daemon/src/rollback_compat.rs",
2026-08-28T09:54:46.8556831Z               "line": 95
2026-08-28T09:54:46.8556983Z             }
2026-08-28T09:54:46.8557146Z           ]
2026-08-28T09:54:46.8557303Z         }
2026-08-28T09:54:46.8557466Z       }
2026-08-28T09:54:46.8557612Z     },
2026-08-28T09:54:46.8557757Z     {
2026-08-28T09:54:46.8557954Z       "id": "REQ-HAZARD-ROSTER-GHOST",
2026-08-28T09:54:46.8564552Z       "title": "A LOCAL subnet roster entry whose backing perch is erased does NOT keep advertising Active (no phantom perch-less endpoint). `api session-end <id> --erase` removes the perch (owlery dir gone) but the subnet roster (identity/registry/<subnet>.json) keeps the endpoint's instance row ACTIVE with no backing perch; `endpoint stop` says 'address unregistered' yet the line persists; no CLI verb forgets a roster entry, and a hand-edit is re-added by the single-writer daemon advertiser. FIX: daemon-side self-heal — the advertiser DROPS/forgets a LOCAL roster entry whose backing perch no longer exists (stops advertising it Active), and/or a `forget`/evict verb; verify whether the epoch lease eventually evicts it (slow-self-heal) vs a real leak and scope accordingly. doyle secondary finding (perri). (post-v0.10.0)",
2026-08-28T09:54:46.8564738Z       "requiredStages": [
2026-08-28T09:54:46.8564895Z         "impl",
2026-08-28T09:54:46.8565052Z         "unit"
2026-08-28T09:54:46.8565182Z       ],
2026-08-28T09:54:46.8565343Z       "stages": {
2026-08-28T09:54:46.8565497Z         "doc": {
2026-08-28T09:54:46.8565666Z           "complete": false,
2026-08-28T09:54:46.8565833Z           "evidence": []
2026-08-28T09:54:46.8565983Z         },
2026-08-28T09:54:46.8566142Z         "impl": {
2026-08-28T09:54:46.8566423Z           "complete": true,
2026-08-28T09:54:46.8566584Z           "evidence": [
2026-08-28T09:54:46.8566742Z             {
2026-08-28T09:54:46.8567067Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8567233Z               "line": 689
2026-08-28T09:54:46.8567382Z             }
2026-08-28T09:54:46.8567529Z           ]
2026-08-28T09:54:46.8567673Z         },
2026-08-28T09:54:46.8567824Z         "int": {
2026-08-28T09:54:46.8567993Z           "complete": false,
2026-08-28T09:54:46.8568157Z           "evidence": []
2026-08-28T09:54:46.8568307Z         },
2026-08-28T09:54:46.8568463Z         "unit": {
2026-08-28T09:54:46.8568639Z           "complete": true,
2026-08-28T09:54:46.8568801Z           "evidence": [
2026-08-28T09:54:46.8569040Z             {
2026-08-28T09:54:46.8569312Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.8569473Z               "line": 2323
2026-08-28T09:54:46.8569626Z             }
2026-08-28T09:54:46.8569778Z           ]
2026-08-28T09:54:46.8569927Z         }
2026-08-28T09:54:46.8570079Z       }
2026-08-28T09:54:46.8570232Z     },
2026-08-28T09:54:46.8570383Z     {
2026-08-28T09:54:46.8570642Z       "id": "REQ-HAZARD-SEEDMAP-CONNECT-UNBOUNDED",
2026-08-28T09:54:46.8579943Z       "title": "SEED (doyle-filed, 2026-07-05, from the REQ-HAZARD-DAEMON-STOP-BARRIER B2 fix): the PRODUCTION seedmap connect callers (put / take / is_running) inherit the SAME interprocess WaitNamedPipeW-forever hazard the stop path just bounded — a Windows named-pipe connect to a name that EXISTS but has NO accepting instance parks in NMPWAIT_WAIT_FOREVER, so a slow / half-dead seed daemon could wedge a live `api seed` / `api listen` / `daemon start`. UPDATE (2026-07-05, doyle reversed the stop-path scope-guard): request_stop's OWN initial connect became load-bearing (a stop-guard re-dialing an already-dying name parked forever, resurrecting the convoy) → it is now bounded via connect_bounded under REQ-HAZARD-DAEMON-STOP-BARRIER (every dial on the STOP path is bounded). REMAINING deferred here = the put / take / is_running production clients. FIX (deferred, needs its own ruling): a shared bounded seed-control connect for those — but a 2s-style cap on a legitimately slow daemon-start connect is a real behavior change (a slow-but-fine start could become a spurious failure), so the timeout + degrade semantics need design first. NOT built — activate when scoped.",
2026-08-28T09:54:46.8580267Z       "requiredStages": [],
2026-08-28T09:54:46.8580429Z       "stages": {
2026-08-28T09:54:46.8580582Z         "doc": {
2026-08-28T09:54:46.8580753Z           "complete": false,
2026-08-28T09:54:46.8580920Z           "evidence": []
2026-08-28T09:54:46.8581068Z         },
2026-08-28T09:54:46.8581230Z         "impl": {
2026-08-28T09:54:46.8581395Z           "complete": false,
2026-08-28T09:54:46.8581566Z           "evidence": []
2026-08-28T09:54:46.8581712Z         },
2026-08-28T09:54:46.8581872Z         "int": {
2026-08-28T09:54:46.8582042Z           "complete": false,
2026-08-28T09:54:46.8582214Z           "evidence": []
2026-08-28T09:54:46.8582371Z         },
2026-08-28T09:54:46.8582524Z         "unit": {
2026-08-28T09:54:46.8582696Z           "complete": false,
2026-08-28T09:54:46.8582853Z           "evidence": []
2026-08-28T09:54:46.8583005Z         }
2026-08-28T09:54:46.8583157Z       }
2026-08-28T09:54:46.8583306Z     },
2026-08-28T09:54:46.8583454Z     {
2026-08-28T09:54:46.8583660Z       "id": "REQ-HAZARD-SELF-ELEVATE",
2026-08-28T09:54:46.8589616Z       "title": "Self-elevation (REQ-ELEVATE-1) re-runs the EXACT original invocation with the binary's ABSOLUTE exe path — never widening privilege scope, never adding/altering args, never via a PATH-resolved bare name, never via a shell-interpolated command string (argv-array only, no `sh -c`); the elevated child drops state back to the user (composes with the 5.7 de-elevation) and NEVER re-elevates (loop-safe: decide_elevation_path returns AlreadyElevated whenever the process is already Elevated, on every OS). The user's UAC/polkit/sudo prompt is the only consent gate — we never bypass it; the print-hint floor prints the absolute-path command too. The unprivileged parent never depends on (pipes/captures) the privileged child's stdout.",
2026-08-28T09:54:46.8589921Z       "requiredStages": [
2026-08-28T09:54:46.8590088Z         "unit"
2026-08-28T09:54:46.8590245Z       ],
2026-08-28T09:54:46.8590389Z       "stages": {
2026-08-28T09:54:46.8590542Z         "doc": {
2026-08-28T09:54:46.8590718Z           "complete": false,
2026-08-28T09:54:46.8590889Z           "evidence": []
2026-08-28T09:54:46.8591038Z         },
2026-08-28T09:54:46.8591194Z         "impl": {
2026-08-28T09:54:46.8591372Z           "complete": true,
2026-08-28T09:54:46.8591537Z           "evidence": [
2026-08-28T09:54:46.8591696Z             {
2026-08-28T09:54:46.8591894Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8592061Z               "line": 13016
2026-08-28T09:54:46.8592206Z             },
2026-08-28T09:54:46.8592369Z             {
2026-08-28T09:54:46.8592564Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8592731Z               "line": 13068
2026-08-28T09:54:46.8592878Z             },
2026-08-28T09:54:46.8593028Z             {
2026-08-28T09:54:46.8593231Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.8593384Z               "line": 13113
2026-08-28T09:54:46.8593542Z             },
2026-08-28T09:54:46.8593690Z             {
2026-08-28T09:54:46.8593915Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8594070Z               "line": 92
2026-08-28T09:54:46.8594225Z             },
2026-08-28T09:54:46.8594371Z             {
2026-08-28T09:54:46.8594592Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8594756Z               "line": 148
2026-08-28T09:54:46.8594904Z             },
2026-08-28T09:54:46.8595059Z             {
2026-08-28T09:54:46.8595327Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8595498Z               "line": 192
2026-08-28T09:54:46.8595647Z             },
2026-08-28T09:54:46.8595904Z             {
2026-08-28T09:54:46.8596132Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8596299Z               "line": 200
2026-08-28T09:54:46.8596462Z             },
2026-08-28T09:54:46.8596609Z             {
2026-08-28T09:54:46.8596834Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8596981Z               "line": 211
2026-08-28T09:54:46.8597135Z             },
2026-08-28T09:54:46.8597276Z             {
2026-08-28T09:54:46.8597490Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8597645Z               "line": 265
2026-08-28T09:54:46.8597784Z             },
2026-08-28T09:54:46.8597936Z             {
2026-08-28T09:54:46.8598161Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8598308Z               "line": 279
2026-08-28T09:54:46.8598461Z             }
2026-08-28T09:54:46.8598637Z           ]
2026-08-28T09:54:46.8598790Z         },
2026-08-28T09:54:46.8599033Z         "int": {
2026-08-28T09:54:46.8599219Z           "complete": false,
2026-08-28T09:54:46.8599396Z           "evidence": []
2026-08-28T09:54:46.8599552Z         },
2026-08-28T09:54:46.8599707Z         "unit": {
2026-08-28T09:54:46.8599881Z           "complete": true,
2026-08-28T09:54:46.8600045Z           "evidence": [
2026-08-28T09:54:46.8600200Z             {
2026-08-28T09:54:46.8600425Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8600591Z               "line": 419
2026-08-28T09:54:46.8600739Z             },
2026-08-28T09:54:46.8600886Z             {
2026-08-28T09:54:46.8601111Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8601268Z               "line": 470
2026-08-28T09:54:46.8601420Z             },
2026-08-28T09:54:46.8601573Z             {
2026-08-28T09:54:46.8601826Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8601988Z               "line": 499
2026-08-28T09:54:46.8602247Z             },
2026-08-28T09:54:46.8602402Z             {
2026-08-28T09:54:46.8602630Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.8602790Z               "line": 526
2026-08-28T09:54:46.8602939Z             }
2026-08-28T09:54:46.8603090Z           ]
2026-08-28T09:54:46.8603239Z         }
2026-08-28T09:54:46.8603391Z       }
2026-08-28T09:54:46.8603535Z     },
2026-08-28T09:54:46.8603677Z     {
2026-08-28T09:54:46.8603921Z       "id": "REQ-HAZARD-SELF-ROW-LEASE-FREEZE",
2026-08-28T09:54:46.8612929Z       "title": "HAZARD: a node whose epoch counter has regressed below the lease on its own fleet-replicated roster row is FROZEN — it can never again change its advertised address, on any peer, and nothing in the system says so. The failure is silent by construction: the node keeps authoring self-entries at a lower lease, every peer's merge_entry returns Stale, net_up stays true, the heartbeat stays fresh, and the roster rows peers hold keep a fresh last_seen riding a dead address. Regression is near-deterministic on a hard reset because the counter is rewritten every few seconds through the non-durable atomic path and resurrects as a NUL husk that parses to absent and reloads as 0 (evidenced twice: ENLYZEAM Kernel-Power 41 seventy-two seconds after its last winning row; HFENDULEAM Jul-19 resets against a Jul-18 frozen row). Forbidden state: a node advertising a self-entry the fleet cannot admit, with no self-repair path. Twin of REQ-ROSTER-SELF-LEASE-HEAL. Gate: doc — the KNOWN-HAZARDS entry; int — the frozen-row shape is set up on a real node root and the boot heal is proved to break it (a pre-fix build strands).",
2026-08-28T09:54:46.8613129Z       "requiredStages": [
2026-08-28T09:54:46.8613289Z         "doc",
2026-08-28T09:54:46.8613441Z         "int"
2026-08-28T09:54:46.8613599Z       ],
2026-08-28T09:54:46.8613756Z       "stages": {
2026-08-28T09:54:46.8613904Z         "doc": {
2026-08-28T09:54:46.8614091Z           "complete": true,
2026-08-28T09:54:46.8614271Z           "evidence": [
2026-08-28T09:54:46.8614420Z             {
2026-08-28T09:54:46.8614748Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8614919Z               "line": 928
2026-08-28T09:54:46.8615068Z             }
2026-08-28T09:54:46.8615225Z           ]
2026-08-28T09:54:46.8615369Z         },
2026-08-28T09:54:46.8615529Z         "impl": {
2026-08-28T09:54:46.8615707Z           "complete": false,
2026-08-28T09:54:46.8615876Z           "evidence": []
2026-08-28T09:54:46.8616029Z         },
2026-08-28T09:54:46.8616189Z         "int": {
2026-08-28T09:54:46.8616376Z           "complete": true,
2026-08-28T09:54:46.8616546Z           "evidence": [
2026-08-28T09:54:46.8616715Z             {
2026-08-28T09:54:46.8617000Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:46.8617166Z               "line": 605
2026-08-28T09:54:46.8617325Z             }
2026-08-28T09:54:46.8617472Z           ]
2026-08-28T09:54:46.8617625Z         },
2026-08-28T09:54:46.8617782Z         "unit": {
2026-08-28T09:54:46.8617959Z           "complete": false,
2026-08-28T09:54:46.8618125Z           "evidence": []
2026-08-28T09:54:46.8618279Z         }
2026-08-28T09:54:46.8618472Z       }
2026-08-28T09:54:46.8618727Z     },
2026-08-28T09:54:46.8618875Z     {
2026-08-28T09:54:46.8619185Z       "id": "REQ-HAZARD-SESSION-PIN-WEDGE",
2026-08-28T09:54:46.8637187Z       "title": "A perch PINNED to a DEAD session-id self-heals instead of wedging forever. authenticate() (spt/src/api/auth.rs:78) gates api poll/state/boundary on proof-sid == info.json.session_id; if ONE boundary rotation is lost (transient env corruption kills the /clear-era hook), the perch stays pinned to the dead sid and EVERY id-scoped hook call refuses — INCLUDING boundary itself (it presents the new sid), a permanent strand (ready:false, stale .idle, drain no-ops, WAN spool sleeps forever; AUTH_REFUSED is stderr-only = invisible inside a hook). FIX: authenticate() gains a DEAD-OWNER fallback — when the sid MISMATCHES AND the perch's recorded pid is dead (proc::is_process_alive==false), ACCEPT the caller's sid and RE-PIN (rotate session_id + log SESSION_REPIN loud). Same trust model as establish_perch's conflict gate (api/startup.rs:207-210), which already allows rebind exactly when owner_alive==false (an orphaned perch accepts a new LOCAL owner). A LIVE-owner mismatch STILL refuses (squat protection UNCHANGED). ADDITIVE to token auth — the existing token-auth recovery path is UNTOUCHED; the new branch fires only on (no token) AND (sid mismatch) AND (owner dead). COVERAGE SPLIT (explicit, perri clean-room 2026-07-02 — the wedge latches on /clear even in a CLEAN env, so the corruption domino was sufficient but NOT necessary): the dead-owner re-pin rescues CRASHED/DEAD sessions ONLY; a LIVE-pid rotation (/clear, /compact — same process, new sid) is CORRECTLY refused without the departed session's prior-sid proof and MUST NOT be widened to live owners. The live-rotation contract is adapter-side: the adapter PERSISTS the prior sid across rotation and PRESENTS it as boundary proof (perri's state-file pattern = the reference); a silent boundary skip on an unresolvable id, or a boundary call with NO auth proof, strands the perch (perri's court). Core rescues only the dead-owner orphan; live-rotation proof is the harness-contract's job (see the harness-contract boundary section, which cross-refs this hazard). PARKED (not this wave, logged): pid-ancestry self-proving rotation (core walks the caller's real ancestry vs info.json.pid) — needs an ADR + Windows parent-spoof caveats. (F-024C, F024C-AUTHWEDGE-ADDENDUM + F024D-DOCSCOPE)",
2026-08-28T09:54:46.8637558Z       "requiredStages": [
2026-08-28T09:54:46.8637719Z         "doc",
2026-08-28T09:54:46.8637873Z         "impl",
2026-08-28T09:54:46.8638024Z         "unit"
2026-08-28T09:54:46.8638178Z       ],
2026-08-28T09:54:46.8638334Z       "stages": {
2026-08-28T09:54:46.8638487Z         "doc": {
2026-08-28T09:54:46.8638663Z           "complete": true,
2026-08-28T09:54:46.8638821Z           "evidence": [
2026-08-28T09:54:46.8639065Z             {
2026-08-28T09:54:46.8639399Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8639625Z               "line": 630
2026-08-28T09:54:46.8639777Z             },
2026-08-28T09:54:46.8639928Z             {
2026-08-28T09:54:46.8640139Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8640300Z               "line": 1050
2026-08-28T09:54:46.8640454Z             }
2026-08-28T09:54:46.8640601Z           ]
2026-08-28T09:54:46.8640758Z         },
2026-08-28T09:54:46.8640911Z         "impl": {
2026-08-28T09:54:46.8641092Z           "complete": true,
2026-08-28T09:54:46.8641254Z           "evidence": [
2026-08-28T09:54:46.8641407Z             {
2026-08-28T09:54:46.8641641Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.8641817Z               "line": 132
2026-08-28T09:54:46.8641971Z             }
2026-08-28T09:54:46.8642113Z           ]
2026-08-28T09:54:46.8642266Z         },
2026-08-28T09:54:46.8642421Z         "int": {
2026-08-28T09:54:46.8642598Z           "complete": false,
2026-08-28T09:54:46.8642774Z           "evidence": []
2026-08-28T09:54:46.8642928Z         },
2026-08-28T09:54:46.8643079Z         "unit": {
2026-08-28T09:54:46.8643257Z           "complete": true,
2026-08-28T09:54:46.8643427Z           "evidence": [
2026-08-28T09:54:46.8643581Z             {
2026-08-28T09:54:46.8643799Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.8643961Z               "line": 378
2026-08-28T09:54:46.8644114Z             },
2026-08-28T09:54:46.8644267Z             {
2026-08-28T09:54:46.8644482Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.8644643Z               "line": 468
2026-08-28T09:54:46.8644795Z             },
2026-08-28T09:54:46.8644946Z             {
2026-08-28T09:54:46.8645155Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:46.8645321Z               "line": 490
2026-08-28T09:54:46.8645470Z             }
2026-08-28T09:54:46.8645617Z           ]
2026-08-28T09:54:46.8645870Z         }
2026-08-28T09:54:46.8646022Z       }
2026-08-28T09:54:46.8646185Z     },
2026-08-28T09:54:46.8646328Z     {
2026-08-28T09:54:46.8646696Z       "id": "REQ-HAZARD-SHAREDSEND-NO-BLOCKING-WRITE-UNDER-LOCK",
2026-08-28T09:54:46.8674469Z       "title": "UPDATE-WEDGE round-4 (hertz RCA, root reproduced + source-pinned on Windows 2026-07-09): EVERY write on a physical broker connection rides ONE bounded + cancelable + poison-on-failure framed-write primitive — no writer may hold the connection's serialized send gate across an UNBOUNDED OS write. ROOT: controller_writer held the SharedSend = Arc<Mutex<SendHalf>> guard ACROSS a blocking write_frame; on Windows interprocess 2.4.2 routes the send to WriteFileEx + SleepEx(INFINITE, alertable) with NO supported write timeout (set_timeout → Unsupported), so an `rc --take` controller consumer that stops reading blocks the write INDEFINITELY (~127.95 s in the field capture, released only when a brain restart tore the conns down). Logical stall_evict_controller (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE) removes the controller ROLE but neither cancels the in-flight pipe write, closes the physical connection, nor invokes CancelIoEx — the detached writer keeps its SharedSend clone + live stack-owned mutex guard. Load-gated: needs a real seq>0 frame + a non-draining consumer (seq-0 boot conns + a quiescent update are clean — why v0.30.5's controlled apply passed); CTRL_WRITE_LOCKED wait_us=0 on all four capture writers exonerates the mutex convoy — the block is INSIDE the OS write, after lock acquisition. Existing deadlines can't bound it: CONTROLLER_WRITE_DEADLINE is output-driven channel-full handling (a writer blocked on its first owned frame never fills the channel); BRAIN_WRITE_DEADLINE is an age PREDICATE sampled opportunistically, not an I/O timer. FIX (accepted shape, doyle GO + 3 confirms): broker-owned Arc conn object (conn.rs BrokerConn) replacing raw Arc<Mutex<SendHalf>> — serialized write gate (bounded gate-wait) + send half (never leaves the object, so a bypass cannot compile) + idempotent poisoned state + per-in-flight op identity + platform abort seam, with an INDEPENDENT per-conn watchdog firing OUT OF BAND at an ABSOLUTE deadline stamped at write entry covering BOTH gate-wait and OS write completion (brain_write_deadline() — the existing SPT_BRAIN_WRITE_DEADLINE_MS knob; the abort NEVER relies on the write returning or on opportunistic stall-evict sampling). On deadline/partial/cancel/unknown completion: (1) poison the whole physical conn, (2) abort read+write (cfg(windows) CancelIoEx then DisconnectNamedPipe; cfg(unix) UnixStream::shutdown(Both)) so handle_conn reaches existing EOF cleanup, (3) wait for the canceled op to report completion before releasing its buffer (interprocess write_exsync returns only after the completion APC — release = write return), (4) NEVER reuse the conn (a timed-out length-prefixed frame may be partially written), (5) join/finish the retired writer before reporting physical cleanup. Controller (replay + live), viewer, dispatch-reply (send_frame/send_error + inline dispatch_* replies), and nethost stream-log/presence writes ALL route through the primitive — leaving ANY raw unbounded write behind the gate preserves the failure class (grep-proven: no surviving raw send.lock()+write_frame on a physical conn path). NO new output queue (the bounded queue + isolated writer exist; the block is BELOW them); NO PIPE_NOWAIT (recorded mid-frame corruption risk). Broker-side only, no wire change, mixed-version peers wire-compatible; Unix keeps existing semantics under the same poison/retire invariant.",
2026-08-28T09:54:46.8701134Z       "requiredStages": [
2026-08-28T09:54:46.8701591Z         "doc",
2026-08-28T09:54:46.8701995Z         "impl",
2026-08-28T09:54:46.8702354Z         "int"
2026-08-28T09:54:46.8702693Z       ],
2026-08-28T09:54:46.8703025Z       "stages": {
2026-08-28T09:54:46.8703394Z         "doc": {
2026-08-28T09:54:46.8703762Z           "complete": true,
2026-08-28T09:54:46.8704200Z           "evidence": [
2026-08-28T09:54:46.8704768Z             {
2026-08-28T09:54:46.8705173Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8705740Z               "line": 724
2026-08-28T09:54:46.8706149Z             }
2026-08-28T09:54:46.8706492Z           ]
2026-08-28T09:54:46.8706822Z         },
2026-08-28T09:54:46.8707151Z         "impl": {
2026-08-28T09:54:46.8707524Z           "complete": true,
2026-08-28T09:54:46.8707961Z           "evidence": [
2026-08-28T09:54:46.8708349Z             {
2026-08-28T09:54:46.8708778Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8709485Z               "line": 3538
2026-08-28T09:54:46.8709899Z             },
2026-08-28T09:54:46.8710242Z             {
2026-08-28T09:54:46.8710677Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8711264Z               "line": 3571
2026-08-28T09:54:46.8711674Z             },
2026-08-28T09:54:46.8712009Z             {
2026-08-28T09:54:46.8712446Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8713043Z               "line": 3770
2026-08-28T09:54:46.8713452Z             },
2026-08-28T09:54:46.8713802Z             {
2026-08-28T09:54:46.8714346Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8714947Z               "line": 5580
2026-08-28T09:54:46.8715352Z             },
2026-08-28T09:54:46.8715705Z             {
2026-08-28T09:54:46.8716135Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8716738Z               "line": 5700
2026-08-28T09:54:46.8717135Z             },
2026-08-28T09:54:46.8717478Z             {
2026-08-28T09:54:46.8717906Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.8718507Z               "line": 9623
2026-08-28T09:54:46.8718904Z             },
2026-08-28T09:54:46.8719338Z             {
2026-08-28T09:54:46.8719763Z               "path": "crates/spt-daemon/src/conn.rs",
2026-08-28T09:54:46.8720336Z               "line": 60
2026-08-28T09:54:46.8720736Z             }
2026-08-28T09:54:46.8721074Z           ]
2026-08-28T09:54:46.8721539Z         },
2026-08-28T09:54:46.8722392Z         "int": {
2026-08-28T09:54:46.8722782Z           "complete": true,
2026-08-28T09:54:46.8723232Z           "evidence": [
2026-08-28T09:54:46.8723636Z             {
2026-08-28T09:54:46.8724121Z               "path": "crates/spt-daemon/tests/brain_decouple.rs",
2026-08-28T09:54:46.8724786Z               "line": 474
2026-08-28T09:54:46.8725202Z             }
2026-08-28T09:54:46.8725545Z           ]
2026-08-28T09:54:46.8725883Z         },
2026-08-28T09:54:46.8726203Z         "unit": {
2026-08-28T09:54:46.8726603Z           "complete": false,
2026-08-28T09:54:46.8727070Z           "evidence": []
2026-08-28T09:54:46.8727480Z         }
2026-08-28T09:54:46.8727804Z       }
2026-08-28T09:54:46.8728119Z     },
2026-08-28T09:54:46.8728429Z     {
2026-08-28T09:54:46.8728819Z       "id": "REQ-HAZARD-SHELL-STALE-ONLINE",
2026-08-28T09:54:46.8830208Z       "title": "A shell instance's ONLINE-ness is DERIVED (recorded status AND its recorded `shell.pid` not provably dead), never the recorded `status` field alone — an abruptly-dead binary (force-kill, crash, OOM: no link-break, so `close_shell`'s offline flip never runs) must not read online forever. The shell-side twin of REQ-HAZARD-DAEMON-HOSTED-LIVENESS, which gave AGENT perches exactly this resolver and which shells never got. PROVABLY DEAD is the narrow discriminant: `shell.pid` present AND parses non-zero AND `!is_process_alive` — pid absent, unparseable, or 0 (a broker-hosted spawn whose backend exposed no pid records 0) reads ALIVE, the same interim-parity/fail-toward-alive stance `liveness.rs` already holds, so a pid-less backend is NEVER falsely declared dead. Recycled-pid caveat, accepted at mint: a reused pid reads alive, so the heal is missed, never mis-fired — the failure direction is 'stays stale', never 'kills a live instance'. SITE CLASSIFICATION IS PART OF THE REQUIREMENT (authoritative cfg(test)-excluded census at mint = 8 status reads, 3 classes — do NOT blanket-swap the predicate): (a) DERIVED — relink's already-online refusal (the gate that made recovery impossible), the `shell cmd` wake-if-offline arm (which silently spooled to a corpse), the drive drop-if-offline branch, `shelldisc::discover` (the single source of BOTH `shell list` renders, text + --json), and the activity fan-out's online filter; (b) RAW status, deliberately — `bind_shell_by_token`/`close_shell` (the WRITERS) and `cascade_owner_edge`'s suspend-close arm, where routing through the resolver would SKIP the close that is itself the cleanup, removing a heal path; (c) RAW recorded status AND the corpse-boot discriminant — the `shellwake::reconcile_once` watcher-eligibility read. AMENDED BAROMETER W2 (doyle, releases#78 comment 5156810267): this class's original text — 'RAW status, pending an operator ruling', with no spontaneous relaunch of anything — IS STRUCK, because it rested on a fact leg (a) deliberately ends. What actually held a force-killed instance out of the eligible set was the STALE `online` record itself; healing that record to the truth removes the accidental protection, so the guard had to move to a rule that STATES it. Eligibility is now recorded `offline` AND (no corpse, or the corpse's launch PREDATES THE BOOT INSTANT), reusing leg (b)'s `launch_predates_boot` and its slack constant verbatim. NO SPONTANEOUS RELAUNCH OF SAME-BOOT DEATHS: flynn's mid-deploy forcing case (an operator kills the process precisely to free the exe for overwrite — shared install dir ⇒ 'kill the process' is a routine deploy step) is preserved BY CONSTRUCTION, since a force-kill during steady state leaves a corpse launched AFTER boot, which the predicate can never accept; for those, recovery stays demand-driven (an unblocked `relink`, or a `shell cmd` that wakes). Boot-restoration of PRE-boot casualties is enabled, per #78 leg (b)'s operator-greenlit scope and this ruling (#78 thread). CORPSE IS DEFINED ON THE PARKED STAMPS, never on a bare pid re-probe: a RECYCLED pid — alive, but its native start stamp mismatching the one leg (a) parked — is corpse-equivalent because our process is dead, and the parked ABSOLUTE launch stamp is what decides pre/post-boot. Without that, the heal-then-recycle race reads 'alive ⇒ no corpse' on the next tick and walks back into the forbidden shape through a side door. Deriving is still WRONG at this site and this is NOT a swap to class (a): the census stays 8 reads / 3 classes — the site reclassifies, it does not multiply, the do-NOT-blanket-swap sentence above stands, and `shell list` still tells the truth by derivation (class (a), untouched). LOCALITY SYMMETRY (field-caught by flynn's leg-2 run, 2026-07-25): 'a shell cmd that wakes' holds for BOTH the local CLI cmd and the cross-node serve — at mint the wake arm lived in the SHELL_LINK_CMD serve handler only (module docs scoped wake-if-offline to remote cmd), so a LOCAL cmd against a corpse spooled silently and nothing woke, the exact accepted-happily/drained-by-nobody shape this req exists to kill; the arm is now the shared `linkhost::wake_if_offline_persistent`, called by both, and the derived status READ inside it is the same single census site as before (the census of 8 reads/3 classes is unchanged — the read moved, it did not multiply). ROTATION CARRIES THE DURABLE CHANNEL (flynn's frame-loss field catch, 2026-07-25, both trials): a spooled command frame is MAC-stamped under the link token current at SPOOL time, and the drain is a raw destructive passthrough — the shell verifies against its CURRENT key — so a relink's token mint orphaned every pending frame: drained to the woken binary, failed verify, correctly discarded BY THE ADAPTER, lost permanently; the wake-triggering command itself was the frame the wake lost (#23 armed the wake and never answered; #24/#19 spooled after rotation and drained in order). The fix is three-layered (todlando's A1/A2 race+crash hazards addressed at mint): (1) the token mint re-stamps all pending rows old-key→new-key (idempotent, crash-partial converges — an old-stamped remainder is converted by the next rotation or drain); (2) the rotated-out token is STASHED (`link.token.retired`, never a live credential — bind resolves only the parked file) so (3) the drain paths give any race straggler a second-chance re-stamp at delivery (`restamp_for_drain`), while frames verifying under neither key pass through untouched for the adapter to refuse exactly as before. Rows are selected by MAC verification against the threaded new key, never by token-snapshot equality (the D-2 class). MOCK CONFORMANCE IS A PROPERTY OF THE RIG, not a patch (todlando A4): mock-shell MUST verify inbound frame MACs exactly as the public contract demands of a real adapter and drop failures loudly — a mock that accepts what the field rejects is a broken rig, and that exact divergence (credulous mock) is how the frame loss passed the e2e while failing in the field. The adapter-side discard behavior is CORRECT and must never be softened to paper over the spool side. Relink additionally probes LOCALLY rather than trusting a daemon sweep, so recovery holds with the daemon down. RECOVERY PRESERVES CONSUMER STATE (the property consumers actually depend on, flynn 2026-07-25): 'same canonical id, same perch' exists so that state a consumer PERSISTED IN THE PERCH survives the recovery — an adapter's repo binding, a scanner's cursor. The teardown+spawn workaround destroyed exactly that, and its worst cost was SILENT, not the rename: alchemy's tag cursor re-baselines at the digest tip, so tags written between the kill and the re-bind are never scanned — not failed-and-retried, just never seen. A loud failure gets retried; a silent one does not. Gate: int — force-kill a bound persistent instance's process, then prove (1) `shell list` reads offline, (2) `relink` succeeds instead of SHELL_ALREADY_ONLINE and the SAME canonical id + perch survive, carrying perch-persisted consumer state with them (no teardown+spawn, no id churn, no re-baselined cursor), (3) no spontaneous relaunch occurs while the instance sits dead and undriven. FIELD VERDICT — PASS END-TO-END (flynn, alchemy-0, delivered 2026-07-26; v0.43.0, counter 77): every gate leg held in the field, on a record the pre-fix code had already poisoned. (1) `shell list` read OFFLINE while the on-disk info.json still said status=online — the daemon DERIVED offline from the corpse pid (29036 absent from the process table); the record was never corrected and did not need to be. (2) relink ADMITTED, no SHELL_ALREADY_ONLINE — verbatim SHELL_RELINKED:alchemy-0 owner=flynn pid=38644 status=offline, list online thereafter. (3) identity/state integrity: same canonical id, same owner, same perch; repo binding byte-identical (token_provenance=gh-cli); armed=true preserved; no spontaneous relaunch across the ~6.5h dead window. CURSOR SCOPING, ruled at closure (doyle 2026-07-26) — the one non-byte-identical field: the tag cursor moved 206158430541→210453397553 (gen:seq 48:333→49:49) because the recovery crossed a DAEMON restart that slid the retained digest window past the armed cursor. NOT a gap and NOT this req's property failing: spt-core raised after_predates_window and the consumer took its specced armed-cursor branch (alchemy REQ-TAG-SCANNER missed-rows leg — warn the owner, never silently re-baseline an armed cursor; alchemy src/tags.rs, two unit tests) — the FIRST FIELD FIRING of a path previously exercised only by unit tests. The 'no re-baselined cursor' gate property is hereby scoped: byte-identity holds across SHELL death within one daemon generation (the prior LEG 5 measurement, one daemon instance, uncontradicted — different scenario, generation never moved); across a daemon restart that slides the window the contract is DETECT-AND-ANNOUNCE, not preserve — corroborated independently by a second record's cursor decomposing under the same gen:seq scheme (4294967486 = 1:190). Practical exposure in this event: nil (every agent stood down through the gap; no tag traffic to miss). SECOND SPECIMEN HELD, not spent (doyle ruling 2026-07-26): liam's record — precondition verified by flynn (pid 35464 a CLEAN corpse, not recycled, so the accepted-at-mint recycled-pid caveat does not apply; same poisoned status=online shape; binding intact; cursor armed at 4294967486) — is deliberately NOT relinked while its owner is absent: the admit gate is already field-proven, a relink measurably re-baselines the cursor across a daemon-restart boundary, and liam's is the only untouched specimen with the longer (~8.5h) gap — spending it would destroy the cursor datum liam's own return produces, to buy a redundant second sample of a gate already proven to admit. It waits for liam. SPECIMEN HARVESTED (liam's own return, 2026-07-26 — operator-authorized endpoint start executed by doyle; pre-state snapshotted by doyle AND independently re-verified on disk by liam before touching anything): (1) relink ADMITTED at the ~8.5h gap — verbatim SHELL_RELINKED:alchemy-0 owner=liam pid=47608 status=offline (online at bind); the poisoned record did not refuse; info.json online is now TRUE. (2) integrity FULL PASS: id unchanged (no new mint slot), perch onlined at bind, repo binding byte-identical (token_provenance gh-cli), and the ROTATION-CARRIES-THE-DURABLE-CHANNEL machinery observed live in the field for the first time — link.token.retired present beside the fresh mint, and a post-relink round trip proven end-to-end (shell cmd spooled -> engine executed -> reply home on the owner's perch), not merely an outbound spool. (3) cursor, the sharpest datum of the harvest: BYTE-IDENTICAL through the relink itself (4294967486 armed at pid-change instant, doyle's file watch) — the relink preserves; the SCANNER moves. First scan re-baselined 1:190 -> 2:0 silently, and liam PROVED no-fire-by-precondition rather than assuming: the daemon restart bumped the generation but EVICTED NOTHING (window floor 4294967464 < cursor 4294967486, every gen-1 row past the cursor still retained), so after_predates_window is correctly false at every link of the chain (filter_after floor test -> emit-only-when-true -> unwrap_or(false)) and the missed-rows announce had no precondition to fire on. Flynn's earlier gen-bump reading is refined by this: a restart alone does not slide the window; flynn's announce fired because HIS window had genuinely slid. Scope note carried: a valid negative — the fix's announce chain verified link-by-link to contract on a specimen where it correctly stayed quiet. RESIDUE from the harvest (liam's find, alchemy lane, no core REQ): permanently-unsealable turns from a dark session are jumped by scanner cursor advance with no possible missed-rows notice (a generation bump is not a slide); ruled scanner-side announce for input-bearing null-seq jumps, pseudo-turns jump silently by design; core's per-turn input/input_seq/partial already suffice to discriminate.",
2026-08-28T09:54:46.8926860Z       "requiredStages": [
2026-08-28T09:54:46.8927466Z         "doc",
2026-08-28T09:54:46.8927969Z         "impl",
2026-08-28T09:54:46.8928476Z         "unit",
2026-08-28T09:54:46.8929062Z         "int"
2026-08-28T09:54:46.8929558Z       ],
2026-08-28T09:54:46.8930051Z       "stages": {
2026-08-28T09:54:46.8930579Z         "doc": {
2026-08-28T09:54:46.8931113Z           "complete": true,
2026-08-28T09:54:46.8931733Z           "evidence": [
2026-08-28T09:54:46.8932295Z             {
2026-08-28T09:54:46.8932932Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.8933728Z               "line": 992
2026-08-28T09:54:46.8934343Z             }
2026-08-28T09:54:46.8934954Z           ]
2026-08-28T09:54:46.8935593Z         },
2026-08-28T09:54:46.8936246Z         "impl": {
2026-08-28T09:54:46.8936939Z           "complete": true,
2026-08-28T09:54:46.8937701Z           "evidence": [
2026-08-28T09:54:46.8938435Z             {
2026-08-28T09:54:46.8939402Z               "path": "crates/spt-daemon/src/activity.rs",
2026-08-28T09:54:46.8940569Z               "line": 143
2026-08-28T09:54:46.8941411Z             },
2026-08-28T09:54:46.8942203Z             {
2026-08-28T09:54:46.8943120Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:46.8944408Z               "line": 253
2026-08-28T09:54:46.8945295Z             },
2026-08-28T09:54:46.8946111Z             {
2026-08-28T09:54:46.8947018Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.8948099Z               "line": 426
2026-08-28T09:54:46.8949076Z             },
2026-08-28T09:54:46.8949887Z             {
2026-08-28T09:54:46.8950798Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.8951933Z               "line": 487
2026-08-28T09:54:46.8952811Z             },
2026-08-28T09:54:46.8953609Z             {
2026-08-28T09:54:46.8954485Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.8955593Z               "line": 502
2026-08-28T09:54:46.8956434Z             },
2026-08-28T09:54:46.8957201Z             {
2026-08-28T09:54:46.8958078Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.8959192Z               "line": 675
2026-08-28T09:54:46.8959999Z             },
2026-08-28T09:54:46.8960738Z             {
2026-08-28T09:54:46.8961575Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.8962609Z               "line": 894
2026-08-28T09:54:46.8963423Z             },
2026-08-28T09:54:46.8964183Z             {
2026-08-28T09:54:46.8965007Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.8966009Z               "line": 217
2026-08-28T09:54:46.8966783Z             },
2026-08-28T09:54:46.8967490Z             {
2026-08-28T09:54:46.8968315Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.8969415Z               "line": 240
2026-08-28T09:54:46.8970186Z             },
2026-08-28T09:54:46.8970898Z             {
2026-08-28T09:54:46.8971717Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.8972724Z               "line": 337
2026-08-28T09:54:46.8973502Z             },
2026-08-28T09:54:46.8974212Z             {
2026-08-28T09:54:46.8975026Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.8976041Z               "line": 75
2026-08-28T09:54:46.8976990Z             },
2026-08-28T09:54:46.8977693Z             {
2026-08-28T09:54:46.8978521Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.8979632Z               "line": 54
2026-08-28T09:54:46.8980403Z             },
2026-08-28T09:54:46.8981105Z             {
2026-08-28T09:54:46.8981925Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.8982937Z               "line": 195
2026-08-28T09:54:46.8983710Z             },
2026-08-28T09:54:46.8984410Z             {
2026-08-28T09:54:46.8985231Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.8986243Z               "line": 367
2026-08-28T09:54:46.8987029Z             },
2026-08-28T09:54:46.8987731Z             {
2026-08-28T09:54:46.8988548Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.8989634Z               "line": 870
2026-08-28T09:54:46.8990408Z             },
2026-08-28T09:54:46.8991112Z             {
2026-08-28T09:54:46.8991921Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.8992938Z               "line": 695
2026-08-28T09:54:46.8994256Z             },
2026-08-28T09:54:46.8994961Z             {
2026-08-28T09:54:46.8995748Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.8996702Z               "line": 197
2026-08-28T09:54:46.8997432Z             },
2026-08-28T09:54:46.8998091Z             {
2026-08-28T09:54:46.8998850Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.8999927Z               "line": 236
2026-08-28T09:54:46.9000658Z             },
2026-08-28T09:54:46.9001340Z             {
2026-08-28T09:54:46.9002124Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.9003088Z               "line": 246
2026-08-28T09:54:46.9003811Z             },
2026-08-28T09:54:46.9004477Z             {
2026-08-28T09:54:46.9005230Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.9006351Z               "line": 878
2026-08-28T09:54:46.9007082Z             },
2026-08-28T09:54:46.9012900Z             {
2026-08-28T09:54:46.9013778Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:46.9014727Z               "line": 532
2026-08-28T09:54:46.9015443Z             },
2026-08-28T09:54:46.9016100Z             {
2026-08-28T09:54:46.9016810Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.9017685Z               "line": 22811
2026-08-28T09:54:46.9018419Z             }
2026-08-28T09:54:46.9019163Z           ]
2026-08-28T09:54:46.9019800Z         },
2026-08-28T09:54:46.9020427Z         "int": {
2026-08-28T09:54:46.9021096Z           "complete": true,
2026-08-28T09:54:46.9021844Z           "evidence": [
2026-08-28T09:54:46.9022553Z             {
2026-08-28T09:54:46.9023355Z               "path": "crates/spt/tests/shell_stale_online_e2e.rs",
2026-08-28T09:54:46.9024357Z               "line": 24
2026-08-28T09:54:46.9025069Z             }
2026-08-28T09:54:46.9025726Z           ]
2026-08-28T09:54:46.9026365Z         },
2026-08-28T09:54:46.9026989Z         "unit": {
2026-08-28T09:54:46.9027671Z           "complete": true,
2026-08-28T09:54:46.9028431Z           "evidence": [
2026-08-28T09:54:46.9029199Z             {
2026-08-28T09:54:46.9029961Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.9030907Z               "line": 1337
2026-08-28T09:54:46.9031636Z             },
2026-08-28T09:54:46.9032275Z             {
2026-08-28T09:54:46.9033025Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.9033982Z               "line": 1386
2026-08-28T09:54:46.9034697Z             },
2026-08-28T09:54:46.9035335Z             {
2026-08-28T09:54:46.9036099Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:46.9037082Z               "line": 466
2026-08-28T09:54:46.9037798Z             },
2026-08-28T09:54:46.9038435Z             {
2026-08-28T09:54:46.9039291Z               "path": "crates/spt-daemon/src/shelldisc.rs",
2026-08-28T09:54:46.9040550Z               "line": 320
2026-08-28T09:54:46.9041262Z             },
2026-08-28T09:54:46.9041906Z             {
2026-08-28T09:54:46.9042702Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.9043660Z               "line": 1171
2026-08-28T09:54:46.9044393Z             },
2026-08-28T09:54:46.9045037Z             {
2026-08-28T09:54:46.9045821Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.9046809Z               "line": 1493
2026-08-28T09:54:46.9047547Z             },
2026-08-28T09:54:46.9048191Z             {
2026-08-28T09:54:46.9049024Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.9049986Z               "line": 1566
2026-08-28T09:54:46.9050705Z             },
2026-08-28T09:54:46.9051348Z             {
2026-08-28T09:54:46.9052127Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.9053081Z               "line": 507
2026-08-28T09:54:46.9053793Z             },
2026-08-28T09:54:46.9054444Z             {
2026-08-28T09:54:46.9055202Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:46.9056169Z               "line": 544
2026-08-28T09:54:46.9056863Z             }
2026-08-28T09:54:46.9057506Z           ]
2026-08-28T09:54:46.9058154Z         }
2026-08-28T09:54:46.9058784Z       }
2026-08-28T09:54:46.9059503Z     },
2026-08-28T09:54:46.9060116Z     {
2026-08-28T09:54:46.9060803Z       "id": "REQ-HAZARD-SINGLE-PATH-SOURCE",
2026-08-28T09:54:46.9062051Z       "title": "Single path/registry source of truth; no layout ambiguity (6.1)",
2026-08-28T09:54:46.9063283Z       "requiredStages": [
2026-08-28T09:54:46.9064010Z         "impl",
2026-08-28T09:54:46.9064658Z         "unit"
2026-08-28T09:54:46.9065291Z       ],
2026-08-28T09:54:46.9065905Z       "stages": {
2026-08-28T09:54:46.9066555Z         "doc": {
2026-08-28T09:54:46.9067263Z           "complete": false,
2026-08-28T09:54:46.9068028Z           "evidence": []
2026-08-28T09:54:46.9068910Z         },
2026-08-28T09:54:46.9069626Z         "impl": {
2026-08-28T09:54:46.9070332Z           "complete": true,
2026-08-28T09:54:46.9071083Z           "evidence": [
2026-08-28T09:54:46.9071782Z             {
2026-08-28T09:54:46.9072567Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.9073543Z               "line": 62
2026-08-28T09:54:46.9074255Z             },
2026-08-28T09:54:46.9074908Z             {
2026-08-28T09:54:46.9075703Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.9076652Z               "line": 71
2026-08-28T09:54:46.9077376Z             },
2026-08-28T09:54:46.9078026Z             {
2026-08-28T09:54:46.9078813Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.9079918Z               "line": 80
2026-08-28T09:54:46.9080775Z             },
2026-08-28T09:54:46.9081428Z             {
2026-08-28T09:54:46.9082214Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:46.9083199Z               "line": 88
2026-08-28T09:54:46.9083913Z             },
2026-08-28T09:54:46.9084585Z             {
2026-08-28T09:54:46.9085348Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:46.9086396Z               "line": 49
2026-08-28T09:54:46.9087102Z             },
2026-08-28T09:54:46.9087741Z             {
2026-08-28T09:54:46.9088481Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9089482Z               "line": 33
2026-08-28T09:54:46.9090193Z             },
2026-08-28T09:54:46.9090842Z             {
2026-08-28T09:54:46.9091583Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9092527Z               "line": 65
2026-08-28T09:54:46.9093246Z             },
2026-08-28T09:54:46.9093897Z             {
2026-08-28T09:54:46.9094644Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9095574Z               "line": 87
2026-08-28T09:54:46.9096276Z             },
2026-08-28T09:54:46.9096922Z             {
2026-08-28T09:54:46.9097809Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9098748Z               "line": 103
2026-08-28T09:54:46.9099561Z             },
2026-08-28T09:54:46.9100210Z             {
2026-08-28T09:54:46.9100944Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9101862Z               "line": 112
2026-08-28T09:54:46.9102585Z             },
2026-08-28T09:54:46.9103229Z             {
2026-08-28T09:54:46.9103964Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9104875Z               "line": 129
2026-08-28T09:54:46.9105582Z             },
2026-08-28T09:54:46.9106236Z             {
2026-08-28T09:54:46.9106974Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9107894Z               "line": 136
2026-08-28T09:54:46.9108594Z             },
2026-08-28T09:54:46.9109327Z             {
2026-08-28T09:54:46.9110068Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9111003Z               "line": 145
2026-08-28T09:54:46.9111734Z             },
2026-08-28T09:54:46.9112385Z             {
2026-08-28T09:54:46.9113122Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9114061Z               "line": 154
2026-08-28T09:54:46.9114770Z             },
2026-08-28T09:54:46.9115416Z             {
2026-08-28T09:54:46.9116157Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9117081Z               "line": 163
2026-08-28T09:54:46.9117800Z             },
2026-08-28T09:54:46.9118445Z             {
2026-08-28T09:54:46.9119283Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9120214Z               "line": 174
2026-08-28T09:54:46.9120924Z             },
2026-08-28T09:54:46.9121568Z             {
2026-08-28T09:54:46.9122317Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9123248Z               "line": 192
2026-08-28T09:54:46.9123954Z             },
2026-08-28T09:54:46.9124726Z             {
2026-08-28T09:54:46.9125469Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9126407Z               "line": 205
2026-08-28T09:54:46.9127131Z             },
2026-08-28T09:54:46.9127784Z             {
2026-08-28T09:54:46.9128531Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9129533Z               "line": 215
2026-08-28T09:54:46.9130245Z             },
2026-08-28T09:54:46.9130888Z             {
2026-08-28T09:54:46.9131633Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9132558Z               "line": 224
2026-08-28T09:54:46.9133277Z             },
2026-08-28T09:54:46.9133932Z             {
2026-08-28T09:54:46.9134671Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9135597Z               "line": 235
2026-08-28T09:54:46.9136308Z             },
2026-08-28T09:54:46.9136957Z             {
2026-08-28T09:54:46.9137710Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9138641Z               "line": 243
2026-08-28T09:54:46.9139454Z             },
2026-08-28T09:54:46.9140166Z             {
2026-08-28T09:54:46.9140913Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9141836Z               "line": 252
2026-08-28T09:54:46.9142541Z             },
2026-08-28T09:54:46.9143188Z             {
2026-08-28T09:54:46.9143922Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9144835Z               "line": 269
2026-08-28T09:54:46.9145555Z             },
2026-08-28T09:54:46.9146205Z             {
2026-08-28T09:54:46.9147064Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9147989Z               "line": 278
2026-08-28T09:54:46.9148714Z             },
2026-08-28T09:54:46.9149437Z             {
2026-08-28T09:54:46.9150167Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9151088Z               "line": 291
2026-08-28T09:54:46.9151805Z             },
2026-08-28T09:54:46.9152453Z             {
2026-08-28T09:54:46.9153177Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9154285Z               "line": 305
2026-08-28T09:54:46.9154996Z             },
2026-08-28T09:54:46.9155629Z             {
2026-08-28T09:54:46.9156354Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9157285Z               "line": 315
2026-08-28T09:54:46.9158015Z             },
2026-08-28T09:54:46.9158658Z             {
2026-08-28T09:54:46.9159478Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9160404Z               "line": 328
2026-08-28T09:54:46.9161109Z             },
2026-08-28T09:54:46.9161752Z             {
2026-08-28T09:54:46.9162492Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9163422Z               "line": 347
2026-08-28T09:54:46.9164124Z             },
2026-08-28T09:54:46.9164773Z             {
2026-08-28T09:54:46.9165494Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9166410Z               "line": 359
2026-08-28T09:54:46.9167121Z             },
2026-08-28T09:54:46.9167776Z             {
2026-08-28T09:54:46.9168508Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9169524Z               "line": 369
2026-08-28T09:54:46.9170240Z             },
2026-08-28T09:54:46.9170882Z             {
2026-08-28T09:54:46.9171626Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9172542Z               "line": 380
2026-08-28T09:54:46.9173267Z             },
2026-08-28T09:54:46.9173911Z             {
2026-08-28T09:54:46.9174640Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9175546Z               "line": 391
2026-08-28T09:54:46.9176258Z             },
2026-08-28T09:54:46.9176887Z             {
2026-08-28T09:54:46.9177614Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9178554Z               "line": 400
2026-08-28T09:54:46.9179341Z             },
2026-08-28T09:54:46.9179994Z             {
2026-08-28T09:54:46.9180877Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9181801Z               "line": 432
2026-08-28T09:54:46.9182505Z             },
2026-08-28T09:54:46.9183163Z             {
2026-08-28T09:54:46.9183904Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9184805Z               "line": 472
2026-08-28T09:54:46.9185506Z             },
2026-08-28T09:54:46.9186153Z             {
2026-08-28T09:54:46.9186881Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9187796Z               "line": 479
2026-08-28T09:54:46.9188517Z             },
2026-08-28T09:54:46.9189239Z             {
2026-08-28T09:54:46.9189976Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9190892Z               "line": 492
2026-08-28T09:54:46.9191611Z             },
2026-08-28T09:54:46.9192250Z             {
2026-08-28T09:54:46.9192971Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9193870Z               "line": 499
2026-08-28T09:54:46.9194583Z             },
2026-08-28T09:54:46.9195223Z             {
2026-08-28T09:54:46.9195961Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9196871Z               "line": 508
2026-08-28T09:54:46.9197570Z             },
2026-08-28T09:54:46.9198209Z             {
2026-08-28T09:54:46.9198924Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9199931Z               "line": 515
2026-08-28T09:54:46.9200633Z             },
2026-08-28T09:54:46.9201262Z             {
2026-08-28T09:54:46.9201983Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9202897Z               "line": 582
2026-08-28T09:54:46.9203603Z             },
2026-08-28T09:54:46.9204232Z             {
2026-08-28T09:54:46.9204944Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9205836Z               "line": 594
2026-08-28T09:54:46.9206526Z             },
2026-08-28T09:54:46.9207151Z             {
2026-08-28T09:54:46.9207863Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9208907Z               "line": 652
2026-08-28T09:54:46.9209680Z             },
2026-08-28T09:54:46.9210316Z             {
2026-08-28T09:54:46.9211016Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9211918Z               "line": 769
2026-08-28T09:54:46.9212613Z             },
2026-08-28T09:54:46.9213228Z             {
2026-08-28T09:54:46.9213938Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9214826Z               "line": 785
2026-08-28T09:54:46.9215532Z             },
2026-08-28T09:54:46.9216180Z             {
2026-08-28T09:54:46.9216900Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9217810Z               "line": 856
2026-08-28T09:54:46.9218494Z             },
2026-08-28T09:54:46.9219205Z             {
2026-08-28T09:54:46.9219944Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:46.9220861Z               "line": 44
2026-08-28T09:54:46.9221557Z             },
2026-08-28T09:54:46.9222191Z             {
2026-08-28T09:54:46.9222921Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:46.9223840Z               "line": 99
2026-08-28T09:54:46.9224526Z             },
2026-08-28T09:54:46.9225213Z             {
2026-08-28T09:54:46.9226002Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:46.9226922Z               "line": 184
2026-08-28T09:54:46.9227614Z             }
2026-08-28T09:54:46.9228244Z           ]
2026-08-28T09:54:46.9228855Z         },
2026-08-28T09:54:46.9229550Z         "int": {
2026-08-28T09:54:46.9230218Z           "complete": false,
2026-08-28T09:54:46.9230970Z           "evidence": []
2026-08-28T09:54:46.9231664Z         },
2026-08-28T09:54:46.9232265Z         "unit": {
2026-08-28T09:54:46.9232918Z           "complete": true,
2026-08-28T09:54:46.9233645Z           "evidence": [
2026-08-28T09:54:46.9234320Z             {
2026-08-28T09:54:46.9235039Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9236125Z               "line": 1001
2026-08-28T09:54:46.9236824Z             },
2026-08-28T09:54:46.9237435Z             {
2026-08-28T09:54:46.9238155Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9239135Z               "line": 1042
2026-08-28T09:54:46.9239830Z             },
2026-08-28T09:54:46.9240521Z             {
2026-08-28T09:54:46.9241227Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9242128Z               "line": 1055
2026-08-28T09:54:46.9242830Z             },
2026-08-28T09:54:46.9243450Z             {
2026-08-28T09:54:46.9244171Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9245060Z               "line": 1228
2026-08-28T09:54:46.9245757Z             }
2026-08-28T09:54:46.9246387Z           ]
2026-08-28T09:54:46.9246983Z         }
2026-08-28T09:54:46.9247570Z       }
2026-08-28T09:54:46.9248157Z     },
2026-08-28T09:54:46.9248743Z     {
2026-08-28T09:54:46.9249476Z       "id": "REQ-HAZARD-SOFT-CLEANUP",
2026-08-28T09:54:46.9250681Z       "title": "Soft-cleanup preserves state, removes only the ready marker (6.2)",
2026-08-28T09:54:46.9251897Z       "requiredStages": [
2026-08-28T09:54:46.9252605Z         "impl",
2026-08-28T09:54:46.9253233Z         "unit"
2026-08-28T09:54:46.9253848Z       ],
2026-08-28T09:54:46.9254450Z       "stages": {
2026-08-28T09:54:46.9255082Z         "doc": {
2026-08-28T09:54:46.9255764Z           "complete": false,
2026-08-28T09:54:46.9256526Z           "evidence": []
2026-08-28T09:54:46.9257221Z         },
2026-08-28T09:54:46.9257820Z         "impl": {
2026-08-28T09:54:46.9258483Z           "complete": true,
2026-08-28T09:54:46.9259294Z           "evidence": [
2026-08-28T09:54:46.9259970Z             {
2026-08-28T09:54:46.9260678Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:46.9261565Z               "line": 211
2026-08-28T09:54:46.9262265Z             },
2026-08-28T09:54:46.9263020Z             {
2026-08-28T09:54:46.9263869Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.9269502Z               "line": 332
2026-08-28T09:54:46.9270239Z             }
2026-08-28T09:54:46.9270866Z           ]
2026-08-28T09:54:46.9271462Z         },
2026-08-28T09:54:46.9272063Z         "int": {
2026-08-28T09:54:46.9272374Z           "complete": false,
2026-08-28T09:54:46.9272675Z           "evidence": []
2026-08-28T09:54:46.9272951Z         },
2026-08-28T09:54:46.9273234Z         "unit": {
2026-08-28T09:54:46.9273532Z           "complete": true,
2026-08-28T09:54:46.9273828Z           "evidence": [
2026-08-28T09:54:46.9274105Z             {
2026-08-28T09:54:46.9274472Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:46.9274763Z               "line": 361
2026-08-28T09:54:46.9275040Z             },
2026-08-28T09:54:46.9275326Z             {
2026-08-28T09:54:46.9275712Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.9276012Z               "line": 1651
2026-08-28T09:54:46.9276298Z             },
2026-08-28T09:54:46.9276589Z             {
2026-08-28T09:54:46.9276980Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:46.9277265Z               "line": 1664
2026-08-28T09:54:46.9277543Z             }
2026-08-28T09:54:46.9277815Z           ]
2026-08-28T09:54:46.9278092Z         }
2026-08-28T09:54:46.9278365Z       }
2026-08-28T09:54:46.9278640Z     },
2026-08-28T09:54:46.9278912Z     {
2026-08-28T09:54:46.9279409Z       "id": "REQ-HAZARD-SPOOL-SENTINEL-CREATE-FAIL",
2026-08-28T09:54:46.9285309Z       "title": "A persistent failure to (re)create the spool has-messages sentinel is SURFACED, never silently swallowed. touch_has_messages (spt-store/src/spool.rs:147) does `let _ = File::create(...)` — a live field defect on ENLYZEAM left a stale .has-messages (2026-06-29) beside a fresh spool.db insert (06:59:17Z) in ONE directory, i.e. the create silently failed while rows accumulated (suspected read-only-attrib / share-lock). FIX: on File::create failure emit a LOUD-ONCE-per-perch stderr diagnostic naming the concrete io::Error (self-identifying regardless of kind); do NOT make it fatal (spool writes still proceed). (F-024C item 2, doyle)",
2026-08-28T09:54:46.9285962Z       "requiredStages": [
2026-08-28T09:54:46.9286267Z         "impl",
2026-08-28T09:54:46.9286553Z         "unit"
2026-08-28T09:54:46.9286825Z       ],
2026-08-28T09:54:46.9287111Z       "stages": {
2026-08-28T09:54:46.9287392Z         "doc": {
2026-08-28T09:54:46.9287698Z           "complete": false,
2026-08-28T09:54:46.9287988Z           "evidence": []
2026-08-28T09:54:46.9288274Z         },
2026-08-28T09:54:46.9288564Z         "impl": {
2026-08-28T09:54:46.9288864Z           "complete": true,
2026-08-28T09:54:46.9289291Z           "evidence": [
2026-08-28T09:54:46.9289562Z             {
2026-08-28T09:54:46.9289959Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.9290250Z               "line": 167
2026-08-28T09:54:46.9290530Z             },
2026-08-28T09:54:46.9290812Z             {
2026-08-28T09:54:46.9291195Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.9291495Z               "line": 179
2026-08-28T09:54:46.9291774Z             }
2026-08-28T09:54:46.9292062Z           ]
2026-08-28T09:54:46.9292330Z         },
2026-08-28T09:54:46.9292617Z         "int": {
2026-08-28T09:54:46.9292916Z           "complete": false,
2026-08-28T09:54:46.9293226Z           "evidence": []
2026-08-28T09:54:46.9293499Z         },
2026-08-28T09:54:46.9293785Z         "unit": {
2026-08-28T09:54:46.9294095Z           "complete": true,
2026-08-28T09:54:46.9294384Z           "evidence": [
2026-08-28T09:54:46.9294667Z             {
2026-08-28T09:54:46.9295039Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:46.9295340Z               "line": 1464
2026-08-28T09:54:46.9295616Z             }
2026-08-28T09:54:46.9295892Z           ]
2026-08-28T09:54:46.9296165Z         }
2026-08-28T09:54:46.9296441Z       }
2026-08-28T09:54:46.9296723Z     },
2026-08-28T09:54:46.9296996Z     {
2026-08-28T09:54:46.9297352Z       "id": "REQ-HAZARD-STALE-INDEX-LOCK",
2026-08-28T09:54:46.9297904Z       "title": "Sweep stale lockfiles on daemon boot (1.3)",
2026-08-28T09:54:46.9298219Z       "requiredStages": [
2026-08-28T09:54:46.9298495Z         "impl",
2026-08-28T09:54:46.9298868Z         "unit"
2026-08-28T09:54:46.9299339Z       ],
2026-08-28T09:54:46.9299642Z       "stages": {
2026-08-28T09:54:46.9299933Z         "doc": {
2026-08-28T09:54:46.9300238Z           "complete": false,
2026-08-28T09:54:46.9300538Z           "evidence": []
2026-08-28T09:54:46.9300811Z         },
2026-08-28T09:54:46.9301100Z         "impl": {
2026-08-28T09:54:46.9301406Z           "complete": true,
2026-08-28T09:54:46.9301701Z           "evidence": [
2026-08-28T09:54:46.9301973Z             {
2026-08-28T09:54:46.9302367Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9302661Z               "line": 131
2026-08-28T09:54:46.9302937Z             },
2026-08-28T09:54:46.9303224Z             {
2026-08-28T09:54:46.9303624Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9303924Z               "line": 620
2026-08-28T09:54:46.9304206Z             }
2026-08-28T09:54:46.9304477Z           ]
2026-08-28T09:54:46.9304750Z         },
2026-08-28T09:54:46.9305035Z         "int": {
2026-08-28T09:54:46.9305347Z           "complete": false,
2026-08-28T09:54:46.9305639Z           "evidence": []
2026-08-28T09:54:46.9305915Z         },
2026-08-28T09:54:46.9306195Z         "unit": {
2026-08-28T09:54:46.9306501Z           "complete": true,
2026-08-28T09:54:46.9306791Z           "evidence": [
2026-08-28T09:54:46.9307068Z             {
2026-08-28T09:54:46.9307484Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9307782Z               "line": 799
2026-08-28T09:54:46.9308064Z             }
2026-08-28T09:54:46.9308340Z           ]
2026-08-28T09:54:46.9308608Z         }
2026-08-28T09:54:46.9308884Z       }
2026-08-28T09:54:46.9309375Z     },
2026-08-28T09:54:46.9309647Z     {
2026-08-28T09:54:46.9310036Z       "id": "REQ-HAZARD-STALE-SIGNOFF-SENTINEL",
2026-08-28T09:54:46.9310564Z       "title": "Stale signoff sentinel does not kill a fresh start (3.2)",
2026-08-28T09:54:46.9310878Z       "requiredStages": [
2026-08-28T09:54:46.9311165Z         "impl",
2026-08-28T09:54:46.9311446Z         "unit"
2026-08-28T09:54:46.9311723Z       ],
2026-08-28T09:54:46.9312010Z       "stages": {
2026-08-28T09:54:46.9312290Z         "doc": {
2026-08-28T09:54:46.9312601Z           "complete": false,
2026-08-28T09:54:46.9312908Z           "evidence": []
2026-08-28T09:54:46.9313235Z         },
2026-08-28T09:54:46.9313521Z         "impl": {
2026-08-28T09:54:46.9313831Z           "complete": true,
2026-08-28T09:54:46.9314122Z           "evidence": [
2026-08-28T09:54:46.9314409Z             {
2026-08-28T09:54:46.9314814Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.9315114Z               "line": 1901
2026-08-28T09:54:46.9315389Z             },
2026-08-28T09:54:46.9315669Z             {
2026-08-28T09:54:46.9316049Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.9316341Z               "line": 28
2026-08-28T09:54:46.9316613Z             }
2026-08-28T09:54:46.9316885Z           ]
2026-08-28T09:54:46.9317162Z         },
2026-08-28T09:54:46.9317439Z         "int": {
2026-08-28T09:54:46.9317744Z           "complete": false,
2026-08-28T09:54:46.9318029Z           "evidence": []
2026-08-28T09:54:46.9318300Z         },
2026-08-28T09:54:46.9318576Z         "unit": {
2026-08-28T09:54:46.9318891Z           "complete": true,
2026-08-28T09:54:46.9319291Z           "evidence": [
2026-08-28T09:54:46.9319596Z             {
2026-08-28T09:54:46.9319969Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:46.9320259Z               "line": 229
2026-08-28T09:54:46.9320540Z             }
2026-08-28T09:54:46.9320819Z           ]
2026-08-28T09:54:46.9321096Z         }
2026-08-28T09:54:46.9321368Z       }
2026-08-28T09:54:46.9321649Z     },
2026-08-28T09:54:46.9321931Z     {
2026-08-28T09:54:46.9322411Z       "id": "REQ-HAZARD-STDIN-SESSION-ID",
2026-08-28T09:54:46.9322856Z       "title": "Stdin session_id precedence over env (2.2)",
2026-08-28T09:54:46.9323180Z       "requiredStages": [],
2026-08-28T09:54:46.9323468Z       "stages": {
2026-08-28T09:54:46.9323747Z         "doc": {
2026-08-28T09:54:46.9324058Z           "complete": false,
2026-08-28T09:54:46.9324353Z           "evidence": []
2026-08-28T09:54:46.9324635Z         },
2026-08-28T09:54:46.9324921Z         "impl": {
2026-08-28T09:54:46.9325231Z           "complete": false,
2026-08-28T09:54:46.9325527Z           "evidence": []
2026-08-28T09:54:46.9325799Z         },
2026-08-28T09:54:46.9326083Z         "int": {
2026-08-28T09:54:46.9326391Z           "complete": false,
2026-08-28T09:54:46.9326691Z           "evidence": []
2026-08-28T09:54:46.9326962Z         },
2026-08-28T09:54:46.9327244Z         "unit": {
2026-08-28T09:54:46.9327559Z           "complete": false,
2026-08-28T09:54:46.9327860Z           "evidence": []
2026-08-28T09:54:46.9328145Z         }
2026-08-28T09:54:46.9328418Z       }
2026-08-28T09:54:46.9328690Z     },
2026-08-28T09:54:46.9329041Z     {
2026-08-28T09:54:46.9329470Z       "id": "REQ-HAZARD-STOP-PATH-PSYCHE-ORPHAN-REAP",
2026-08-28T09:54:46.9338191Z       "title": "Endpoint-stop and brain-death reconcile MUST reap a brain-less perch's orphan detached Psyche via the cmdline-scoped guard (`psyche_orphan_should_reap`) — the handle-reap (`LiveSet::stop_host`, REQ-HAZARD-UNHOST-PSYCHE-REAP) CANNOT, because the owning brain is gone (its `psyche_child` handle died with it), and the brain-start scoped-reap (REQ-HAZARD-BRAIN-RESTART-PSYCHE-DUP) never fires for a perch being STOPPED rather than re-hosted. So the live-host calls the scoped reap after `stop_host` at the reconcile stop-side AND in `confirm_residency_or_unhost`. Preserves fail-safe-decline (pid-alive AND exe-basename==psyche-program AND cmdline contains `<id>-psyche`; any unreadable signal DECLINES — a missed dup is bounded, a wrong-kill is catastrophic). This is the orphan-leak half of the perri F-010xF-015 field bug (the unsupervised install-dir Psyche that locked an update); the other half is the psyche own-copy (ADR-0025 amendment). (v0.13.2 W3 (a))",
2026-08-28T09:54:46.9338649Z       "requiredStages": [],
2026-08-28T09:54:46.9338926Z       "stages": {
2026-08-28T09:54:46.9339302Z         "doc": {
2026-08-28T09:54:46.9339602Z           "complete": true,
2026-08-28T09:54:46.9339903Z           "evidence": [
2026-08-28T09:54:46.9340288Z             {
2026-08-28T09:54:46.9340656Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9340965Z               "line": 1044
2026-08-28T09:54:46.9341237Z             },
2026-08-28T09:54:46.9341519Z             {
2026-08-28T09:54:46.9342096Z               "path": "docs/adr/0025-live-daemon-coordinated-adapter-update.md",
2026-08-28T09:54:46.9342387Z               "line": 45
2026-08-28T09:54:46.9342663Z             }
2026-08-28T09:54:46.9342945Z           ]
2026-08-28T09:54:46.9343217Z         },
2026-08-28T09:54:46.9343503Z         "impl": {
2026-08-28T09:54:46.9343813Z           "complete": false,
2026-08-28T09:54:46.9344104Z           "evidence": []
2026-08-28T09:54:46.9344382Z         },
2026-08-28T09:54:46.9344656Z         "int": {
2026-08-28T09:54:46.9344968Z           "complete": false,
2026-08-28T09:54:46.9345274Z           "evidence": []
2026-08-28T09:54:46.9345549Z         },
2026-08-28T09:54:46.9345831Z         "unit": {
2026-08-28T09:54:46.9346136Z           "complete": false,
2026-08-28T09:54:46.9346432Z           "evidence": []
2026-08-28T09:54:46.9346703Z         }
2026-08-28T09:54:46.9347000Z       }
2026-08-28T09:54:46.9347392Z     },
2026-08-28T09:54:46.9347754Z     {
2026-08-28T09:54:46.9348112Z       "id": "REQ-HAZARD-STOP-RESPAWN-CONVOY",
2026-08-28T09:54:46.9352177Z       "title": "KNOWN-HAZARDS 7.52: an operator stop outranks every implicit ensure — no convenience path resurrects what the operator just killed. The hazard-conformance twin of REQ-ENSURE-DAEMON-STOP-INHIBIT: its int-stage convoy rig IS this hazard's required test (stop under api-call storm -> down + zero respawns + honest refusal; start clears; one-daemon race). Registered separately per CLAUDE.md rule 4 — evidence may tag the same rig.",
2026-08-28T09:54:46.9352643Z       "requiredStages": [
2026-08-28T09:54:46.9352952Z         "doc",
2026-08-28T09:54:46.9353247Z         "int"
2026-08-28T09:54:46.9353524Z       ],
2026-08-28T09:54:46.9353810Z       "stages": {
2026-08-28T09:54:46.9354092Z         "doc": {
2026-08-28T09:54:46.9354401Z           "complete": true,
2026-08-28T09:54:46.9354702Z           "evidence": [
2026-08-28T09:54:46.9354979Z             {
2026-08-28T09:54:46.9355334Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9355624Z               "line": 838
2026-08-28T09:54:46.9355906Z             }
2026-08-28T09:54:46.9356183Z           ]
2026-08-28T09:54:46.9356468Z         },
2026-08-28T09:54:46.9356744Z         "impl": {
2026-08-28T09:54:46.9357073Z           "complete": false,
2026-08-28T09:54:46.9357383Z           "evidence": []
2026-08-28T09:54:46.9357654Z         },
2026-08-28T09:54:46.9357943Z         "int": {
2026-08-28T09:54:46.9358248Z           "complete": true,
2026-08-28T09:54:46.9358539Z           "evidence": [
2026-08-28T09:54:46.9358815Z             {
2026-08-28T09:54:46.9359340Z               "path": "crates/spt/tests/daemon_stop_convoy_e2e.rs",
2026-08-28T09:54:46.9359621Z               "line": 119
2026-08-28T09:54:46.9359994Z             }
2026-08-28T09:54:46.9360299Z           ]
2026-08-28T09:54:46.9360573Z         },
2026-08-28T09:54:46.9360855Z         "unit": {
2026-08-28T09:54:46.9361160Z           "complete": false,
2026-08-28T09:54:46.9361470Z           "evidence": []
2026-08-28T09:54:46.9361742Z         }
2026-08-28T09:54:46.9362033Z       }
2026-08-28T09:54:46.9362301Z     },
2026-08-28T09:54:46.9362568Z     {
2026-08-28T09:54:46.9362928Z       "id": "REQ-HAZARD-STORE-INIT-RACE",
2026-08-28T09:54:46.9371767Z       "title": "Concurrent first-touch of ONE fresh BranchStore must ALL succeed, never a hard error. BranchStore::open_or_init (spt-store/src/branchstore.rs:47) is a TOCTOU: it gates on HEAD.exists() then runs a NON-ATOMIC init (`git init --bare` + `git config core.autocrlf false` + best-effort worktree.useRelativePaths). Two processes that both observe !HEAD.exists() on one fresh store race the `git config` step, which takes git's per-repo config.lock — the loser fails with 'could not lock config file …/config: File exists', an io::Error that strands the caller (the G3-gate pump.rs:442 flake, doyle-ledgered). FIX: make init race-tolerant — `git init --bare` is idempotent, and `git config` is idempotent (same bytes), so tolerate a concurrent winner (open-after-lose: if init errors but HEAD now exists, proceed as opened) and retry a transient config.lock collision a bounded number of times so the required core.autocrlf=false is guaranteed set. N concurrent open_or_init on ONE fresh dir must ALL return Ok. (F-025 wave, doyle Item 2)",
2026-08-28T09:54:46.9372126Z       "requiredStages": [
2026-08-28T09:54:46.9372416Z         "doc",
2026-08-28T09:54:46.9372698Z         "impl",
2026-08-28T09:54:46.9372974Z         "unit"
2026-08-28T09:54:46.9373236Z       ],
2026-08-28T09:54:46.9373521Z       "stages": {
2026-08-28T09:54:46.9373805Z         "doc": {
2026-08-28T09:54:46.9374106Z           "complete": true,
2026-08-28T09:54:46.9374407Z           "evidence": [
2026-08-28T09:54:46.9374683Z             {
2026-08-28T09:54:46.9375046Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9375351Z               "line": 637
2026-08-28T09:54:46.9375617Z             },
2026-08-28T09:54:46.9375890Z             {
2026-08-28T09:54:46.9376245Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9376538Z               "line": 1060
2026-08-28T09:54:46.9376806Z             }
2026-08-28T09:54:46.9377083Z           ]
2026-08-28T09:54:46.9377351Z         },
2026-08-28T09:54:46.9377632Z         "impl": {
2026-08-28T09:54:46.9377951Z           "complete": true,
2026-08-28T09:54:46.9378375Z           "evidence": [
2026-08-28T09:54:46.9378657Z             {
2026-08-28T09:54:46.9379148Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9379439Z               "line": 61
2026-08-28T09:54:46.9379716Z             },
2026-08-28T09:54:46.9379998Z             {
2026-08-28T09:54:46.9380407Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9380698Z               "line": 84
2026-08-28T09:54:46.9380980Z             },
2026-08-28T09:54:46.9381256Z             {
2026-08-28T09:54:46.9381670Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9381965Z               "line": 654
2026-08-28T09:54:46.9382242Z             },
2026-08-28T09:54:46.9382514Z             {
2026-08-28T09:54:46.9382928Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9383225Z               "line": 672
2026-08-28T09:54:46.9383505Z             }
2026-08-28T09:54:46.9383788Z           ]
2026-08-28T09:54:46.9384063Z         },
2026-08-28T09:54:46.9384347Z         "int": {
2026-08-28T09:54:46.9384652Z           "complete": false,
2026-08-28T09:54:46.9384952Z           "evidence": []
2026-08-28T09:54:46.9385228Z         },
2026-08-28T09:54:46.9385519Z         "unit": {
2026-08-28T09:54:46.9385887Z           "complete": true,
2026-08-28T09:54:46.9386187Z           "evidence": [
2026-08-28T09:54:46.9386473Z             {
2026-08-28T09:54:46.9386887Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9387180Z               "line": 711
2026-08-28T09:54:46.9387456Z             },
2026-08-28T09:54:46.9387733Z             {
2026-08-28T09:54:46.9388139Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:46.9388439Z               "line": 747
2026-08-28T09:54:46.9388720Z             }
2026-08-28T09:54:46.9389118Z           ]
2026-08-28T09:54:46.9389420Z         }
2026-08-28T09:54:46.9389814Z       }
2026-08-28T09:54:46.9390095Z     },
2026-08-28T09:54:46.9390371Z     {
2026-08-28T09:54:46.9390739Z       "id": "REQ-HAZARD-SUBPROCESS-TIMEOUT",
2026-08-28T09:54:46.9391216Z       "title": "Every harness/git subprocess has a timeout (5.3)",
2026-08-28T09:54:46.9391545Z       "requiredStages": [
2026-08-28T09:54:46.9391825Z         "impl",
2026-08-28T09:54:46.9392117Z         "unit"
2026-08-28T09:54:46.9392393Z       ],
2026-08-28T09:54:46.9392669Z       "stages": {
2026-08-28T09:54:46.9392960Z         "doc": {
2026-08-28T09:54:46.9393265Z           "complete": false,
2026-08-28T09:54:46.9393560Z           "evidence": []
2026-08-28T09:54:46.9393847Z         },
2026-08-28T09:54:46.9394123Z         "impl": {
2026-08-28T09:54:46.9394432Z           "complete": true,
2026-08-28T09:54:46.9394730Z           "evidence": [
2026-08-28T09:54:46.9395008Z             {
2026-08-28T09:54:46.9395407Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:46.9395693Z               "line": 44
2026-08-28T09:54:46.9395980Z             },
2026-08-28T09:54:46.9396256Z             {
2026-08-28T09:54:46.9396618Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:46.9396909Z               "line": 19
2026-08-28T09:54:46.9397192Z             },
2026-08-28T09:54:46.9397476Z             {
2026-08-28T09:54:46.9397870Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9398166Z               "line": 990
2026-08-28T09:54:46.9398442Z             },
2026-08-28T09:54:46.9398718Z             {
2026-08-28T09:54:46.9399190Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9399486Z               "line": 1026
2026-08-28T09:54:46.9399773Z             },
2026-08-28T09:54:46.9400042Z             {
2026-08-28T09:54:46.9400437Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9400728Z               "line": 1074
2026-08-28T09:54:46.9401009Z             },
2026-08-28T09:54:46.9401286Z             {
2026-08-28T09:54:46.9401672Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.9402076Z               "line": 15
2026-08-28T09:54:46.9402358Z             },
2026-08-28T09:54:46.9402640Z             {
2026-08-28T09:54:46.9403025Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.9403315Z               "line": 78
2026-08-28T09:54:46.9403588Z             },
2026-08-28T09:54:46.9403869Z             {
2026-08-28T09:54:46.9404246Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.9404537Z               "line": 151
2026-08-28T09:54:46.9404813Z             }
2026-08-28T09:54:46.9405097Z           ]
2026-08-28T09:54:46.9405371Z         },
2026-08-28T09:54:46.9405648Z         "int": {
2026-08-28T09:54:46.9405962Z           "complete": false,
2026-08-28T09:54:46.9406253Z           "evidence": []
2026-08-28T09:54:46.9406530Z         },
2026-08-28T09:54:46.9406812Z         "unit": {
2026-08-28T09:54:46.9407127Z           "complete": true,
2026-08-28T09:54:46.9407418Z           "evidence": [
2026-08-28T09:54:46.9407695Z             {
2026-08-28T09:54:46.9408097Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9408387Z               "line": 1723
2026-08-28T09:54:46.9408669Z             },
2026-08-28T09:54:46.9408940Z             {
2026-08-28T09:54:46.9409412Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.9409703Z               "line": 197
2026-08-28T09:54:46.9409984Z             },
2026-08-28T09:54:46.9410262Z             {
2026-08-28T09:54:46.9410645Z               "path": "crates/spt-store/src/gitrun.rs",
2026-08-28T09:54:46.9410944Z               "line": 207
2026-08-28T09:54:46.9411221Z             }
2026-08-28T09:54:46.9411501Z           ]
2026-08-28T09:54:46.9411777Z         }
2026-08-28T09:54:46.9412059Z       }
2026-08-28T09:54:46.9412331Z     },
2026-08-28T09:54:46.9412608Z     {
2026-08-28T09:54:46.9412965Z       "id": "REQ-HAZARD-SUDO-SECURE-PATH",
2026-08-28T09:54:46.9415510Z       "title": "Elevation guidance on Unix names the binary's ABSOLUTE path under sudo (a user-local install ~/.local/bin · ~/.cargo/bin is not on sudo's secure_path, so bare `sudo spt` dies 'command not found'); gated commands auto-elevate on an interactive TTY, else print the runnable hint (5.10)",
2026-08-28T09:54:46.9416418Z       "requiredStages": [
2026-08-28T09:54:46.9416700Z         "impl",
2026-08-28T09:54:46.9416981Z         "unit"
2026-08-28T09:54:46.9417262Z       ],
2026-08-28T09:54:46.9417548Z       "stages": {
2026-08-28T09:54:46.9417829Z         "doc": {
2026-08-28T09:54:46.9418139Z           "complete": false,
2026-08-28T09:54:46.9418444Z           "evidence": []
2026-08-28T09:54:46.9418718Z         },
2026-08-28T09:54:46.9419094Z         "impl": {
2026-08-28T09:54:46.9419394Z           "complete": true,
2026-08-28T09:54:46.9419704Z           "evidence": [
2026-08-28T09:54:46.9419981Z             {
2026-08-28T09:54:46.9420353Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.9420639Z               "line": 192
2026-08-28T09:54:46.9420935Z             },
2026-08-28T09:54:46.9421228Z             {
2026-08-28T09:54:46.9421595Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.9421890Z               "line": 279
2026-08-28T09:54:46.9422162Z             }
2026-08-28T09:54:46.9422444Z           ]
2026-08-28T09:54:46.9422725Z         },
2026-08-28T09:54:46.9423006Z         "int": {
2026-08-28T09:54:46.9423316Z           "complete": false,
2026-08-28T09:54:46.9423616Z           "evidence": []
2026-08-28T09:54:46.9423901Z         },
2026-08-28T09:54:46.9424188Z         "unit": {
2026-08-28T09:54:46.9424497Z           "complete": true,
2026-08-28T09:54:46.9424789Z           "evidence": [
2026-08-28T09:54:46.9425079Z             {
2026-08-28T09:54:46.9425451Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.9425756Z               "line": 470
2026-08-28T09:54:46.9426029Z             },
2026-08-28T09:54:46.9426308Z             {
2026-08-28T09:54:46.9426679Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:46.9427092Z               "line": 526
2026-08-28T09:54:46.9427374Z             }
2026-08-28T09:54:46.9427646Z           ]
2026-08-28T09:54:46.9427923Z         }
2026-08-28T09:54:46.9428195Z       }
2026-08-28T09:54:46.9428477Z     },
2026-08-28T09:54:46.9428743Z     {
2026-08-28T09:54:46.9429190Z       "id": "REQ-HAZARD-TEARDOWN-DEADEND",
2026-08-28T09:54:46.9442734Z       "title": "TEARDOWN-AUTHORITY W1 HAZARD (ADR-0045 decision 8; hertz RCA 2 — hit doyle's OWN live production endpoint, recoverable only by out-of-band scoped kill): `endpoint stop` followed by `endpoint start <same>` MUST succeed (a fresh session or a resume) and must NEVER answer ENDPOINT_CREATE_CONFLICT about a session that stop claimed to end. TRAP SHAPE (two individually-CORRECT behaviors composing into a lifecycle DEAD END with no in-band exit): (1) stop leaves the broker session alive (REQ-ENDPOINT-TEARDOWN-AUTHORITY), and (2) `endpoint run` correctly REFUSES ENDPOINT_CREATE_CONFLICT rather than silently reattaching (v0.37.0 no-silent-reattach rule, deliberately chosen). The survivor is therefore simultaneously what stop claims to have killed AND what run refuses to work around; with a wedged harness every in-band verb is exhausted (stop lies, run refuses, rc replays a dead PTY, rc --take controls a process that never answers). Neither behavior is individually wrong — the COMPOSITION is the hazard, so the regression must assert the composition, not either verb alone. This single assertion is the whole user-visible point of W1. Gate: impl — covered by the shared primitive; int — start a real broker host, hard-stop it, assert subtree + broker row gone, THEN `endpoint start <same>` SUCCEEDS (never CREATE_CONFLICT) and `endpoint run --resume <recorded sid>` creates a NEW PTY rather than rc-ing the old one; PLUS the durability leg — info stays offline + terminally-normalized across a bounded settle window (proves no re-bind by a survivor, the field rest_state=active finding made into an assertion).",
2026-08-28T09:54:46.9443311Z       "requiredStages": [
2026-08-28T09:54:46.9443625Z         "impl",
2026-08-28T09:54:46.9443912Z         "int"
2026-08-28T09:54:46.9444194Z       ],
2026-08-28T09:54:46.9444480Z       "stages": {
2026-08-28T09:54:46.9444761Z         "doc": {
2026-08-28T09:54:46.9445059Z           "complete": true,
2026-08-28T09:54:46.9445355Z           "evidence": [
2026-08-28T09:54:46.9445631Z             {
2026-08-28T09:54:46.9445999Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9446289Z               "line": 812
2026-08-28T09:54:46.9446571Z             },
2026-08-28T09:54:46.9446848Z             {
2026-08-28T09:54:46.9447314Z               "path": "docs/adr/0045-endpoint-teardown-authority.md",
2026-08-28T09:54:46.9447611Z               "line": 120
2026-08-28T09:54:46.9447889Z             }
2026-08-28T09:54:46.9448160Z           ]
2026-08-28T09:54:46.9448433Z         },
2026-08-28T09:54:46.9448723Z         "impl": {
2026-08-28T09:54:46.9449109Z           "complete": true,
2026-08-28T09:54:46.9449410Z           "evidence": [
2026-08-28T09:54:46.9449696Z             {
2026-08-28T09:54:46.9450082Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9450389Z               "line": 9403
2026-08-28T09:54:46.9450665Z             },
2026-08-28T09:54:46.9450938Z             {
2026-08-28T09:54:46.9451281Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.9451581Z               "line": 12059
2026-08-28T09:54:46.9451849Z             },
2026-08-28T09:54:46.9452134Z             {
2026-08-28T09:54:46.9452479Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.9452761Z               "line": 24216
2026-08-28T09:54:46.9453031Z             },
2026-08-28T09:54:46.9453308Z             {
2026-08-28T09:54:46.9453670Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.9453961Z               "line": 140
2026-08-28T09:54:46.9454238Z             },
2026-08-28T09:54:46.9454519Z             {
2026-08-28T09:54:46.9454881Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.9455316Z               "line": 168
2026-08-28T09:54:46.9455605Z             },
2026-08-28T09:54:46.9455882Z             {
2026-08-28T09:54:46.9456244Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.9456535Z               "line": 203
2026-08-28T09:54:46.9456840Z             }
2026-08-28T09:54:46.9457122Z           ]
2026-08-28T09:54:46.9457403Z         },
2026-08-28T09:54:46.9457680Z         "int": {
2026-08-28T09:54:46.9457988Z           "complete": true,
2026-08-28T09:54:46.9458282Z           "evidence": [
2026-08-28T09:54:46.9458558Z             {
2026-08-28T09:54:46.9459159Z               "path": "crates/spt/tests/endpoint_teardown_authority_e2e.rs",
2026-08-28T09:54:46.9459454Z               "line": 529
2026-08-28T09:54:46.9459727Z             }
2026-08-28T09:54:46.9460008Z           ]
2026-08-28T09:54:46.9460294Z         },
2026-08-28T09:54:46.9460567Z         "unit": {
2026-08-28T09:54:46.9460874Z           "complete": true,
2026-08-28T09:54:46.9461163Z           "evidence": [
2026-08-28T09:54:46.9461440Z             {
2026-08-28T09:54:46.9461808Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:46.9462104Z               "line": 627
2026-08-28T09:54:46.9462379Z             },
2026-08-28T09:54:46.9462660Z             {
2026-08-28T09:54:46.9463019Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:46.9463313Z               "line": 353
2026-08-28T09:54:46.9463591Z             }
2026-08-28T09:54:46.9463859Z           ]
2026-08-28T09:54:46.9464136Z         }
2026-08-28T09:54:46.9464403Z       }
2026-08-28T09:54:46.9464670Z     },
2026-08-28T09:54:46.9464941Z     {
2026-08-28T09:54:46.9465304Z       "id": "REQ-HAZARD-TEMPLATE-ARGV-FILL",
2026-08-28T09:54:46.9476092Z       "title": "Command-template substitution fills argv ELEMENTS, not a re-tokenized string: spt-core currently `fill_template`s {key} values INTO the command STRING and THEN `tokenize`s the filled string (runtime.rs:94/122), so a multi-word {key} value whitespace-SPLITS into multiple argv tokens unless the adapter hand-quotes the placeholder, and a value containing a `\"` (or `;`) injects/breaks tokenization (shell-injection-adjacent). A filled value MUST become exactly ONE argv element regardless of spaces/quotes in the value. Fix: tokenize the TEMPLATE into argv FIRST, then `fill_template` EACH token, so a `{key}` slot resolves to a single element and the value never participates in tokenization (no whitespace-split, no quote/semicolon injection); preserve the missing-key / empty-command errors and `{{`/`}}` non-interpretation. perri's F-009 (v0.8.1 dogfood, argv-capture-confirmed): a multi-word `{psyche_prompt}` = \"PSYCHE REVIVAL time: epoch-ms:… incoming event: (none)\" arrived as argv[6..12] (7 stray tokens), the harness runner strict-parsed `--prompt` against the 2nd word, exited 2 within ~1s → phantom hosted perch. Applies to EVERY [session.<role>] template (psyche_init, extractor, notif, …); digest survives today only because its fills ({session_id}/{source}) are single-token.",
2026-08-28T09:54:46.9476561Z       "requiredStages": [
2026-08-28T09:54:46.9476840Z         "impl",
2026-08-28T09:54:46.9477122Z         "unit",
2026-08-28T09:54:46.9477388Z         "int"
2026-08-28T09:54:46.9477669Z       ],
2026-08-28T09:54:46.9477956Z       "stages": {
2026-08-28T09:54:46.9478242Z         "doc": {
2026-08-28T09:54:46.9478551Z           "complete": false,
2026-08-28T09:54:46.9478843Z           "evidence": []
2026-08-28T09:54:46.9479197Z         },
2026-08-28T09:54:46.9479485Z         "impl": {
2026-08-28T09:54:46.9479793Z           "complete": true,
2026-08-28T09:54:46.9480080Z           "evidence": [
2026-08-28T09:54:46.9480352Z             {
2026-08-28T09:54:46.9480770Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:46.9481080Z               "line": 153
2026-08-28T09:54:46.9481349Z             },
2026-08-28T09:54:46.9481616Z             {
2026-08-28T09:54:46.9482027Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:46.9482445Z               "line": 480
2026-08-28T09:54:46.9482727Z             },
2026-08-28T09:54:46.9482990Z             {
2026-08-28T09:54:46.9483390Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:46.9483680Z               "line": 231
2026-08-28T09:54:46.9483948Z             },
2026-08-28T09:54:46.9484221Z             {
2026-08-28T09:54:46.9484617Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:46.9484904Z               "line": 570
2026-08-28T09:54:46.9485166Z             },
2026-08-28T09:54:46.9485432Z             {
2026-08-28T09:54:46.9485819Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9486106Z               "line": 311
2026-08-28T09:54:46.9486386Z             },
2026-08-28T09:54:46.9486672Z             {
2026-08-28T09:54:46.9487055Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9487348Z               "line": 804
2026-08-28T09:54:46.9487624Z             },
2026-08-28T09:54:46.9487891Z             {
2026-08-28T09:54:46.9488278Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9488568Z               "line": 1082
2026-08-28T09:54:46.9488841Z             }
2026-08-28T09:54:46.9489193Z           ]
2026-08-28T09:54:46.9489459Z         },
2026-08-28T09:54:46.9489739Z         "int": {
2026-08-28T09:54:46.9490035Z           "complete": true,
2026-08-28T09:54:46.9490330Z           "evidence": [
2026-08-28T09:54:46.9490597Z             {
2026-08-28T09:54:46.9491164Z               "path": "crates/spt-daemon/tests/psyche_residency_expectation_e2e.rs",
2026-08-28T09:54:46.9491450Z               "line": 44
2026-08-28T09:54:46.9491731Z             },
2026-08-28T09:54:46.9492002Z             {
2026-08-28T09:54:46.9492574Z               "path": "crates/spt-daemon/tests/psyche_residency_expectation_e2e.rs",
2026-08-28T09:54:46.9492868Z               "line": 207
2026-08-28T09:54:46.9493140Z             }
2026-08-28T09:54:46.9493530Z           ]
2026-08-28T09:54:46.9493798Z         },
2026-08-28T09:54:46.9494079Z         "unit": {
2026-08-28T09:54:46.9494380Z           "complete": true,
2026-08-28T09:54:46.9494670Z           "evidence": [
2026-08-28T09:54:46.9494945Z             {
2026-08-28T09:54:46.9495339Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9495629Z               "line": 1527
2026-08-28T09:54:46.9495901Z             },
2026-08-28T09:54:46.9496169Z             {
2026-08-28T09:54:46.9496555Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9496850Z               "line": 1548
2026-08-28T09:54:46.9497127Z             },
2026-08-28T09:54:46.9497394Z             {
2026-08-28T09:54:46.9497789Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9498085Z               "line": 1620
2026-08-28T09:54:46.9498357Z             },
2026-08-28T09:54:46.9498629Z             {
2026-08-28T09:54:46.9499109Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9499401Z               "line": 1638
2026-08-28T09:54:46.9499677Z             },
2026-08-28T09:54:46.9499945Z             {
2026-08-28T09:54:46.9500337Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9500628Z               "line": 1662
2026-08-28T09:54:46.9500895Z             }
2026-08-28T09:54:46.9501172Z           ]
2026-08-28T09:54:46.9501439Z         }
2026-08-28T09:54:46.9501715Z       }
2026-08-28T09:54:46.9501977Z     },
2026-08-28T09:54:46.9502253Z     {
2026-08-28T09:54:46.9502659Z       "id": "REQ-HAZARD-TEST-PID-TREE-KILL-IDENTITY",
2026-08-28T09:54:46.9520755Z       "title": "Seed (DE-SCOPED from TEST-only, BAROMETER 2026-08-02 — the id keeps its `-TEST-` infix for registry stability, but the rule always covered both populations and the product half is now proven, tracked by REQ-SHELL-KILL-AUTHENTICATED): any process kill driven by a pid read from a best-effort breadcrumb FILE — tree or single-process, IN A TEST RIG OR IN SHIPPED PRODUCT CODE — must first distinguish an already-exited process (benign: log and skip) from a live process, then prove the live process is the one the record MEANS before terminating it: in a rig by re-resolving its executable path and requiring it under that test job's own target directory (self and test-harness ancestors always refused); in product code by the pid+birth PAIR via `liveness::relay_liveness`, since the daemon can park a birth stamp at launch and an image path cannot separate two shells sharing one binary. A live but unidentifiable process is NEVER a legitimate kill target in either population, and the refusal must be AUDIBLE — a destructive path that treats unknown as do-not-fire trades a loud wrong action for a quiet wrong state unless it names the pid it spared and why. `/T` grades blast radius; it is not the defect. Field trigger: golden run 30501468421 Windows job 90742055246 ended worker_lifecycle_e2e with bare exit 1 after every assertion and observability point had been placed after taskkill /PID <daemon.pid> /F /T. Predicate-bounded breadth on crates/*/tests/*.rs: 42 taskkill-/T files; 30 also reference a literal pid/ready breadcrumb filename; 23 breadcrumb-to-tree-kill flows manually confirmed and 7 unconfirmed. brain.ready dominates (26 references), and its heartbeat refresh makes staleness correlate with the original target already being dead — precisely when pid reuse bites. An independent wider-root predicate reproduced exactly the original 6 daemon.pid tree-kill flows. A graded second tier adds 12 manually-confirmed daemon.pid taskkill-/F files without /T: smaller blast radius, identical unauthenticated-termination defect.",
2026-08-28T09:54:46.9521249Z       "requiredStages": [],
2026-08-28T09:54:46.9521542Z       "stages": {
2026-08-28T09:54:46.9521824Z         "doc": {
2026-08-28T09:54:46.9522139Z           "complete": true,
2026-08-28T09:54:46.9522434Z           "evidence": [
2026-08-28T09:54:46.9522716Z             {
2026-08-28T09:54:46.9523059Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9523459Z               "line": 890
2026-08-28T09:54:46.9523751Z             },
2026-08-28T09:54:46.9524022Z             {
2026-08-28T09:54:46.9524367Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9524653Z               "line": 905
2026-08-28T09:54:46.9524925Z             }
2026-08-28T09:54:46.9525207Z           ]
2026-08-28T09:54:46.9525478Z         },
2026-08-28T09:54:46.9525740Z         "impl": {
2026-08-28T09:54:46.9526041Z           "complete": false,
2026-08-28T09:54:46.9526346Z           "evidence": []
2026-08-28T09:54:46.9526607Z         },
2026-08-28T09:54:46.9526886Z         "int": {
2026-08-28T09:54:46.9527183Z           "complete": true,
2026-08-28T09:54:46.9527482Z           "evidence": [
2026-08-28T09:54:46.9527754Z             {
2026-08-28T09:54:46.9528179Z               "path": "crates/spt/tests/resident_service_e2e.rs",
2026-08-28T09:54:46.9528521Z               "line": 554
2026-08-28T09:54:46.9528783Z             }
2026-08-28T09:54:46.9529165Z           ]
2026-08-28T09:54:46.9529436Z         },
2026-08-28T09:54:46.9529709Z         "unit": {
2026-08-28T09:54:46.9530009Z           "complete": false,
2026-08-28T09:54:46.9530305Z           "evidence": []
2026-08-28T09:54:46.9530562Z         }
2026-08-28T09:54:46.9530837Z       }
2026-08-28T09:54:46.9531100Z     },
2026-08-28T09:54:46.9531371Z     {
2026-08-28T09:54:46.9531729Z       "id": "REQ-HAZARD-THRASH-GUARD-BLIND",
2026-08-28T09:54:46.9535256Z       "title": "W3 (F030 hazard; paid-for: evidence #6, hall-bf ~12/min re-host NEVER tripped the C3(b) thrash guard — boot records were not ledger boundaries to the guard): the failure budget must count REAL attempts (ledger-derived: boot/turn records via the psyche perch ledger), not whatever it counted that let 12/min churn run invisibly. Red-first synthetic loop: a 12/min synthetic failure loop MUST trip the budget.",
2026-08-28T09:54:46.9535566Z       "requiredStages": [
2026-08-28T09:54:46.9535838Z         "doc",
2026-08-28T09:54:46.9536110Z         "impl",
2026-08-28T09:54:46.9536373Z         "unit"
2026-08-28T09:54:46.9536768Z       ],
2026-08-28T09:54:46.9537055Z       "stages": {
2026-08-28T09:54:46.9537329Z         "doc": {
2026-08-28T09:54:46.9537641Z           "complete": true,
2026-08-28T09:54:46.9537938Z           "evidence": [
2026-08-28T09:54:46.9538213Z             {
2026-08-28T09:54:46.9538558Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9538853Z               "line": 676
2026-08-28T09:54:46.9539212Z             },
2026-08-28T09:54:46.9539483Z             {
2026-08-28T09:54:46.9539827Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9540173Z               "line": 1059
2026-08-28T09:54:46.9540448Z             }
2026-08-28T09:54:46.9540711Z           ]
2026-08-28T09:54:46.9540992Z         },
2026-08-28T09:54:46.9541264Z         "impl": {
2026-08-28T09:54:46.9541584Z           "complete": true,
2026-08-28T09:54:46.9541879Z           "evidence": [
2026-08-28T09:54:46.9542157Z             {
2026-08-28T09:54:46.9542567Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.9542859Z               "line": 1698
2026-08-28T09:54:46.9543136Z             }
2026-08-28T09:54:46.9543408Z           ]
2026-08-28T09:54:46.9543694Z         },
2026-08-28T09:54:46.9543964Z         "int": {
2026-08-28T09:54:46.9544323Z           "complete": false,
2026-08-28T09:54:46.9544672Z           "evidence": []
2026-08-28T09:54:46.9548622Z         },
2026-08-28T09:54:46.9549074Z         "unit": {
2026-08-28T09:54:46.9549384Z           "complete": true,
2026-08-28T09:54:46.9549666Z           "evidence": [
2026-08-28T09:54:46.9549942Z             {
2026-08-28T09:54:46.9550343Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:46.9550642Z               "line": 2690
2026-08-28T09:54:46.9550909Z             }
2026-08-28T09:54:46.9551177Z           ]
2026-08-28T09:54:46.9551453Z         }
2026-08-28T09:54:46.9551716Z       }
2026-08-28T09:54:46.9551987Z     },
2026-08-28T09:54:46.9552398Z     {
2026-08-28T09:54:46.9552858Z       "id": "REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH",
2026-08-28T09:54:46.9558623Z       "title": "C-1 hazard (F029; paid-for: B6 + three-version checkpoint-wake breakage): a REAL translation fault (binary death — stdin write fail / stdout disconnect — or strike-budget exhaustion) must get a BOUNDED eager respawn (C3(b) give-up budget) instead of permanent death, and must stamp a PERCH-VISIBLE fault surface (mutate_info field, cleared on healthy respawn/commit) — TRANSLATION_FAULT is daemon-stderr-only today (the F-019 unread-channel trap; same honesty rule as F-027 ENDPOINT_SPAWN_FAIL). A real fault legitimately loses in-memory state (the wake is NOT carried across a real fault, unlike a mere commit-miss). See addendum C-1 (3)-(4).",
2026-08-28T09:54:46.9559043Z       "requiredStages": [
2026-08-28T09:54:46.9559319Z         "impl",
2026-08-28T09:54:46.9559591Z         "unit",
2026-08-28T09:54:46.9559868Z         "int"
2026-08-28T09:54:46.9560150Z       ],
2026-08-28T09:54:46.9560421Z       "stages": {
2026-08-28T09:54:46.9560708Z         "doc": {
2026-08-28T09:54:46.9561009Z           "complete": false,
2026-08-28T09:54:46.9561308Z           "evidence": []
2026-08-28T09:54:46.9561574Z         },
2026-08-28T09:54:46.9561850Z         "impl": {
2026-08-28T09:54:46.9562146Z           "complete": true,
2026-08-28T09:54:46.9562433Z           "evidence": [
2026-08-28T09:54:46.9562699Z             {
2026-08-28T09:54:46.9563109Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9563399Z               "line": 8454
2026-08-28T09:54:46.9563670Z             },
2026-08-28T09:54:46.9563946Z             {
2026-08-28T09:54:46.9564308Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.9564603Z               "line": 727
2026-08-28T09:54:46.9564871Z             }
2026-08-28T09:54:46.9565143Z           ]
2026-08-28T09:54:46.9565409Z         },
2026-08-28T09:54:46.9565681Z         "int": {
2026-08-28T09:54:46.9566015Z           "complete": true,
2026-08-28T09:54:46.9566305Z           "evidence": [
2026-08-28T09:54:46.9566852Z             {
2026-08-28T09:54:46.9567376Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.9567666Z               "line": 2028
2026-08-28T09:54:46.9567933Z             },
2026-08-28T09:54:46.9568204Z             {
2026-08-28T09:54:46.9568669Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.9569047Z               "line": 2088
2026-08-28T09:54:46.9569327Z             }
2026-08-28T09:54:46.9569598Z           ]
2026-08-28T09:54:46.9569875Z         },
2026-08-28T09:54:46.9570142Z         "unit": {
2026-08-28T09:54:46.9570452Z           "complete": true,
2026-08-28T09:54:46.9570738Z           "evidence": [
2026-08-28T09:54:46.9571015Z             {
2026-08-28T09:54:46.9571377Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:46.9571667Z               "line": 1799
2026-08-28T09:54:46.9571949Z             }
2026-08-28T09:54:46.9572221Z           ]
2026-08-28T09:54:46.9572483Z         }
2026-08-28T09:54:46.9572749Z       }
2026-08-28T09:54:46.9573021Z     },
2026-08-28T09:54:46.9573283Z     {
2026-08-28T09:54:46.9573626Z       "id": "REQ-HAZARD-TREE-CWD-PIN",
2026-08-28T09:54:46.9606553Z       "title": "releases#110: a directory that is a live process's CURRENT DIRECTORY cannot be renamed or deleted on Windows while files INSIDE it stay writable, so a test descendant that outlives its run leaves an undeletable `.worktrees` skeleton that reads as neither a file lock nor a rig failure. cargo runs each test binary with cwd = the PACKAGE ROOT, so every spawned child — and every grandchild inheriting through it — takes `<worktree>/crates/<pkg>` as its own cwd. THE FILED MECHANISM IS REFUTED AND THE CORRECTION IS THE POINT: #110 named the holder an orphaned `conhost.exe` holding the crate root; measurement on HFENDULEAM 2026-08-02 shows `CREATE_NO_WINDOW` does mint exactly one conhost per console child (counted by ParentProcessId) but that conhost's cwd is OS-assigned, not inherited — a census of every conhost on the box returned 43 readable, all `C:\\WINDOWS\\` or `C:\\WINDOWS\\system32\\`, ZERO under any worktree (4 unopenable, stated). Positive control on a scratch dir: write-inside OK, delete BLOCKED, kill the CONHOST → still BLOCKED, kill the actual holder → deletes first try; the holder was an orphaned GRANDCHILD (`PING.exe`, cwd inherited through `cmd`) that survived its parent's kill. A CREATE_NO_WINDOW conhost is a byproduct, never the pin — killing it is not the cure and \"no conhosts\" is not the all-clear. AMENDED 2026-08-02, on field evidence that landed BEFORE this shipped in a golden run: a `--headless` ConPTY conhost is a DIFFERENT population and the word 'never' does not survive it. It inherits the cwd of whoever created the pseudoconsole and can be the SOLE pin — BAROMETER W4 specimen pid 46556, `conhost.exe --headless --width 80 --height 24`, parent dead, PEB cwd inside that worktree's crates/spt, killed and the tree deleted (todlando). Reproduced deliberately through CreatePseudoConsole from a chosen cwd, with the pin's own control (write-inside OK, delete BLOCKED while it lives, DELETED after ClosePseudoConsole) and the pty-teardown alternative excluded by a kill-ORDER rig: client killed first and the directory is STILL pinned, conhost killed and it deletes. Read a conhost's COMMAND LINE before deciding — a bare `conhost.exe 0x...` is never the pin, a `--headless` one can be, and its child count says nothing either way because a ConPTY client is a child of the creator, not of the conhost. Two tempting fixes are refused ON EVIDENCE: flipping the rigs' `CommandNoWindowExt::no_window()` to `DETACHED_PROCESS` removes the conhost (1 → 0) but not the pin, and `job_escape_e2e::conhost_children_of` shells to powershell through that helper with an `unwrap_or(0)` fallback, so under a flag where powershell does not execute at all (KH 5.17 amendment) the `REQ-HAZARD-WMI-DAEMON-WINDOW` guard would assert \"no conhost\" VACUOUSLY GREEN — a gate whose failure signature is identical to the fault it guards; and the helper cannot hand children a neutral cwd because `bind_cwd_project_e2e` and `resume_template_e2e` assert on the INHERITED cwd, which is the behavior under test. Doc stage carries the triage step that the diagnosis tool cannot: the finder answers WHO pins a directory, never whether it is SAFE TO KILL, and the blocked-delete error is identical for an orphan and for a working agent's own shell (confirmed live — one worktree's holder was an agent's pwsh tool shell with its Bash tool holding a SEPARATE cwd in the same tree; a pattern-matched kill would have cost that agent their session). Kin REQ-TEST-TMPDIR-HYGIENE (which lists 'children pinning the dir cwd so removal fails' as an unproven candidate root — this proves that class), REQ-TEST-RIG-DAEMON-TEARDOWN-PROVEN (teardown completeness is the prevention side, extended to grandchildren), REQ-HAZARD-WMI-DAEMON-WINDOW (the guard the refused fix would have hollowed out).",
2026-08-28T09:54:46.9607188Z       "requiredStages": [
2026-08-28T09:54:46.9607464Z         "doc"
2026-08-28T09:54:46.9607737Z       ],
2026-08-28T09:54:46.9608018Z       "stages": {
2026-08-28T09:54:46.9608295Z         "doc": {
2026-08-28T09:54:46.9608602Z           "complete": true,
2026-08-28T09:54:46.9608885Z           "evidence": [
2026-08-28T09:54:46.9609244Z             {
2026-08-28T09:54:46.9609592Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9609878Z               "line": 331
2026-08-28T09:54:46.9610140Z             }
2026-08-28T09:54:46.9610416Z           ]
2026-08-28T09:54:46.9610693Z         },
2026-08-28T09:54:46.9610971Z         "impl": {
2026-08-28T09:54:46.9611283Z           "complete": false,
2026-08-28T09:54:46.9611572Z           "evidence": []
2026-08-28T09:54:46.9611844Z         },
2026-08-28T09:54:46.9612111Z         "int": {
2026-08-28T09:54:46.9612415Z           "complete": false,
2026-08-28T09:54:46.9612707Z           "evidence": []
2026-08-28T09:54:46.9613089Z         },
2026-08-28T09:54:46.9613370Z         "unit": {
2026-08-28T09:54:46.9613679Z           "complete": false,
2026-08-28T09:54:46.9613984Z           "evidence": []
2026-08-28T09:54:46.9614261Z         }
2026-08-28T09:54:46.9614528Z       }
2026-08-28T09:54:46.9614796Z     },
2026-08-28T09:54:46.9615067Z     {
2026-08-28T09:54:46.9615406Z       "id": "REQ-HAZARD-UNC-PATH-STRIP",
2026-08-28T09:54:46.9615905Z       "title": "Strip Windows UNC prefix on serialized paths (5.4)",
2026-08-28T09:54:46.9616210Z       "requiredStages": [
2026-08-28T09:54:46.9616503Z         "impl",
2026-08-28T09:54:46.9616785Z         "unit"
2026-08-28T09:54:46.9617047Z       ],
2026-08-28T09:54:46.9617324Z       "stages": {
2026-08-28T09:54:46.9617591Z         "doc": {
2026-08-28T09:54:46.9617905Z           "complete": false,
2026-08-28T09:54:46.9618195Z           "evidence": []
2026-08-28T09:54:46.9618467Z         },
2026-08-28T09:54:46.9618739Z         "impl": {
2026-08-28T09:54:46.9619110Z           "complete": true,
2026-08-28T09:54:46.9619418Z           "evidence": [
2026-08-28T09:54:46.9619680Z             {
2026-08-28T09:54:46.9620066Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.9620347Z               "line": 43
2026-08-28T09:54:46.9620615Z             }
2026-08-28T09:54:46.9620877Z           ]
2026-08-28T09:54:46.9621150Z         },
2026-08-28T09:54:46.9621417Z         "int": {
2026-08-28T09:54:46.9621719Z           "complete": false,
2026-08-28T09:54:46.9622012Z           "evidence": []
2026-08-28T09:54:46.9622276Z         },
2026-08-28T09:54:46.9622548Z         "unit": {
2026-08-28T09:54:46.9622839Z           "complete": true,
2026-08-28T09:54:46.9623129Z           "evidence": [
2026-08-28T09:54:46.9623383Z             {
2026-08-28T09:54:46.9623759Z               "path": "crates/spt-store/src/atomic.rs",
2026-08-28T09:54:46.9624045Z               "line": 378
2026-08-28T09:54:46.9624322Z             }
2026-08-28T09:54:46.9624601Z           ]
2026-08-28T09:54:46.9624868Z         }
2026-08-28T09:54:46.9625136Z       }
2026-08-28T09:54:46.9625398Z     },
2026-08-28T09:54:46.9625803Z     {
2026-08-28T09:54:46.9626160Z       "id": "REQ-HAZARD-UNHOST-PSYCHE-REAP",
2026-08-28T09:54:46.9635353Z       "title": "On un-host, the detached `{id}-psyche` HARNESS PROCESS is reaped — not just its in-brain pulse-driver thread. Today stop_host (livehost.rs:203) trips the HostedLife stop flag + JOINS the driver thread, but the Psyche is a detached harness process (spawn_psyche → ManifestRuntime detached spawn, runtime.rs:341-356; its pid is untracked in HostedLife though stamped on the `{id}-psyche` perch, where residency-confirm already reads it). So endpoint-stop / mid-life agent-death / a B2/B5 offline-then-unhost leaves the psyche process ORPHANED, alive until the next daemon-stop (where Breap's job/group reaps the whole brain subtree). The Psyche STAYS a harness process by design (CONTEXT.md 97/203/251 — headless harness session, its own perch) — the fix does NOT move it in-brain; it SCOPED-kills the `{id}-psyche` pid on un-host (never machine-wide — shared box). Track the pid in HostedLife at host_one (cleanest) or read the `{id}-psyche` perch pid at stop_host. Composes with H3 (endpoint stop → offline → reconcile un-host → reap) and B2/B5 (the offline arms that trigger un-host). (v0.12.0)",
2026-08-28T09:54:46.9635729Z       "requiredStages": [],
2026-08-28T09:54:46.9636001Z       "stages": {
2026-08-28T09:54:46.9636282Z         "doc": {
2026-08-28T09:54:46.9636592Z           "complete": false,
2026-08-28T09:54:46.9636888Z           "evidence": []
2026-08-28T09:54:46.9637160Z         },
2026-08-28T09:54:46.9637430Z         "impl": {
2026-08-28T09:54:46.9637737Z           "complete": true,
2026-08-28T09:54:46.9638019Z           "evidence": [
2026-08-28T09:54:46.9638290Z             {
2026-08-28T09:54:46.9638686Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9639078Z               "line": 582
2026-08-28T09:54:46.9639355Z             },
2026-08-28T09:54:46.9639621Z             {
2026-08-28T09:54:46.9640240Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9640547Z               "line": 619
2026-08-28T09:54:46.9640824Z             },
2026-08-28T09:54:46.9641087Z             {
2026-08-28T09:54:46.9641491Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:46.9641783Z               "line": 906
2026-08-28T09:54:46.9642054Z             }
2026-08-28T09:54:46.9642332Z           ]
2026-08-28T09:54:46.9642599Z         },
2026-08-28T09:54:46.9642878Z         "int": {
2026-08-28T09:54:46.9643181Z           "complete": false,
2026-08-28T09:54:46.9643481Z           "evidence": []
2026-08-28T09:54:46.9643743Z         },
2026-08-28T09:54:46.9644020Z         "unit": {
2026-08-28T09:54:46.9644326Z           "complete": false,
2026-08-28T09:54:46.9644616Z           "evidence": []
2026-08-28T09:54:46.9644893Z         }
2026-08-28T09:54:46.9645157Z       }
2026-08-28T09:54:46.9645423Z     },
2026-08-28T09:54:46.9645687Z     {
2026-08-28T09:54:46.9646041Z       "id": "REQ-HAZARD-UPDATE-ROLLBACK",
2026-08-28T09:54:46.9646885Z       "title": "Self-update rejects version rollback; metadata expiry + adapter content signing (codex #5)",
2026-08-28T09:54:46.9647195Z       "requiredStages": [
2026-08-28T09:54:46.9647472Z         "impl",
2026-08-28T09:54:46.9647744Z         "unit"
2026-08-28T09:54:46.9648019Z       ],
2026-08-28T09:54:46.9648302Z       "stages": {
2026-08-28T09:54:46.9648583Z         "doc": {
2026-08-28T09:54:46.9648884Z           "complete": false,
2026-08-28T09:54:46.9649256Z           "evidence": []
2026-08-28T09:54:46.9649522Z         },
2026-08-28T09:54:46.9649800Z         "impl": {
2026-08-28T09:54:46.9650105Z           "complete": true,
2026-08-28T09:54:46.9650391Z           "evidence": [
2026-08-28T09:54:46.9650659Z             {
2026-08-28T09:54:46.9651060Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:46.9651347Z               "line": 440
2026-08-28T09:54:46.9651618Z             },
2026-08-28T09:54:46.9651895Z             {
2026-08-28T09:54:46.9652271Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.9652672Z               "line": 496
2026-08-28T09:54:46.9652952Z             },
2026-08-28T09:54:46.9653221Z             {
2026-08-28T09:54:46.9653622Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:46.9653923Z               "line": 156
2026-08-28T09:54:46.9654194Z             }
2026-08-28T09:54:46.9654448Z           ]
2026-08-28T09:54:46.9654715Z         },
2026-08-28T09:54:46.9654986Z         "int": {
2026-08-28T09:54:46.9655368Z           "complete": false,
2026-08-28T09:54:46.9655745Z           "evidence": []
2026-08-28T09:54:46.9656046Z         },
2026-08-28T09:54:46.9656315Z         "unit": {
2026-08-28T09:54:46.9656606Z           "complete": true,
2026-08-28T09:54:46.9656892Z           "evidence": [
2026-08-28T09:54:46.9657154Z             {
2026-08-28T09:54:46.9657540Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.9657827Z               "line": 1060
2026-08-28T09:54:46.9658098Z             },
2026-08-28T09:54:46.9658365Z             {
2026-08-28T09:54:46.9658739Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.9659120Z               "line": 1074
2026-08-28T09:54:46.9659387Z             },
2026-08-28T09:54:46.9659659Z             {
2026-08-28T09:54:46.9660041Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.9660327Z               "line": 1093
2026-08-28T09:54:46.9660598Z             },
2026-08-28T09:54:46.9660876Z             {
2026-08-28T09:54:46.9661261Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:46.9661545Z               "line": 1110
2026-08-28T09:54:46.9661821Z             },
2026-08-28T09:54:46.9662098Z             {
2026-08-28T09:54:46.9662508Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:46.9662794Z               "line": 535
2026-08-28T09:54:46.9663075Z             }
2026-08-28T09:54:46.9663471Z           ]
2026-08-28T09:54:46.9663743Z         }
2026-08-28T09:54:46.9664018Z       }
2026-08-28T09:54:46.9664282Z     },
2026-08-28T09:54:46.9664549Z     {
2026-08-28T09:54:46.9664902Z       "id": "REQ-HAZARD-VIEWER-CLOSE-DETACH",
2026-08-28T09:54:46.9692722Z       "title": "A VIEW is independent from the endpoint: closing the tab/window where the endpoint was brought up must detach ONLY the `spt rc` attach pump — the daemon-hosted harness keeps running and stays re-attachable via `spt rc <id>`. ROOT (Windows, v0.12.0 real-harness defect): the daemon never breaks away from the launching terminal's Job Object. Windows Terminal / VS Code place the launched shell AND every descendant into a Job Object with JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; closing the tab drops the terminal's last job handle → the OS terminates every process still in that job. A child escapes only with CREATE_BREAKAWAY_FROM_JOB — used NOWHERE in the tree. Both daemon spawn paths (daemon.rs:707 detached_no_inherit = DETACHED_PROCESS|CREATE_NEW_PROCESS_GROUP|CREATE_NO_WINDOW; deelevate.rs:519 elevated = CREATE_NEW_CONSOLE|...) drop the CONSOLE but NOT job membership, so the daemon's freshly broker-spawned ConPTY harness subtree is reaped on tab-close. The ConPTY/pseudoconsole isolation itself is CORRECT (portable-pty builds the pseudoconsole in the daemon; no console signal / handle leak) — the leaking lifetime binding is the Job Object, not the console. FIX: add CREATE_BREAKAWAY_FROM_JOB to both daemon spawn paths AND pin each broker-spawned harness into a DAEMON-OWNED Job Object (mirror reap.rs/Breap) as backstop (survives even where a terminal sets SILENT_BREAKAWAY_OK=false). Unix: the daemon's own session detachment (new session, no controlling terminal) already keeps a closing terminal's SIGHUP off its children — verify, add a guard test, no code expected. FIX UPDATE (v0.12.1 L1.5, doyle re-scope operator-approved 2026-06-18): job-neutral daemon launch is now PRIMARY, breakaway DEMOTED to a fallback rung. ROOT reframed — the daemon INHERITS the terminal's Job because spawn_detached runs FROM the terminal-child CLI (DETACHED_PROCESS detaches the console, not the job); breakaway tried to claw back out but a job CAN deny it (the L1 finding). FIX: launch the cold-started daemon via a job-NEUTRAL creator so it is WmiPrvSE/Task-Scheduler-owned, OUTSIDE any terminal job from birth (why Task-Scheduler-autostarted daemons never had this bug). Launcher ladder (first-success-wins, daemon.rs spawn_detached → BOTH cold-start AND `spt daemon start`): (1) WMI Win32_Process.Create via ABSOLUTE powershell -EncodedCommand (KH 5.12 abs path; base64-UTF16LE dodges all quoting; success requires BOTH ReturnValue==0 AND a parsed ProcessId, else fall-through — never a silent launched), forwarding SPT_* env via a `cmd /c set … & start /b` wrapper because a WMI/scheduler child does NOT inherit transient shell env (verified — SPT_HOME would be lost, wrong universe); (2) schtasks one-shot (same env wrapper; best-effort fallback); (3) CREATE_BREAKAWAY_FROM_JOB (the L1 code, reordered below); (4) in-job last resort (logs DETACH_IN_JOB + tab-close caveat). detached_no_inherit (breakaway-then-in-job) is UNCHANGED for its other caller shellhost::launch_shell (a daemon-spawned shell is already job-neutral once the daemon is). The elevated deelevate path keeps its L1 breakaway for now (elevated-case WMI-reparent = FOLLOW-UP). (v0.12.1)",
2026-08-28T09:54:46.9693339Z       "requiredStages": [
2026-08-28T09:54:46.9693625Z         "doc",
2026-08-28T09:54:46.9693939Z         "impl",
2026-08-28T09:54:46.9694212Z         "unit",
2026-08-28T09:54:46.9694498Z         "int"
2026-08-28T09:54:46.9694761Z       ],
2026-08-28T09:54:46.9695052Z       "stages": {
2026-08-28T09:54:46.9695371Z         "doc": {
2026-08-28T09:54:46.9695664Z           "complete": true,
2026-08-28T09:54:46.9695948Z           "evidence": [
2026-08-28T09:54:46.9696215Z             {
2026-08-28T09:54:46.9696535Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.9696826Z               "line": 531
2026-08-28T09:54:46.9697221Z             },
2026-08-28T09:54:46.9697489Z             {
2026-08-28T09:54:46.9697841Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9698142Z               "line": 513
2026-08-28T09:54:46.9698408Z             }
2026-08-28T09:54:46.9698681Z           ]
2026-08-28T09:54:46.9699033Z         },
2026-08-28T09:54:46.9699314Z         "impl": {
2026-08-28T09:54:46.9699620Z           "complete": true,
2026-08-28T09:54:46.9699911Z           "evidence": [
2026-08-28T09:54:46.9700178Z             {
2026-08-28T09:54:46.9700588Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9700886Z               "line": 1368
2026-08-28T09:54:46.9701170Z             },
2026-08-28T09:54:46.9701442Z             {
2026-08-28T09:54:46.9701820Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9702115Z               "line": 1906
2026-08-28T09:54:46.9702381Z             },
2026-08-28T09:54:46.9702653Z             {
2026-08-28T09:54:46.9703041Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9703346Z               "line": 1923
2026-08-28T09:54:46.9703620Z             },
2026-08-28T09:54:46.9703885Z             {
2026-08-28T09:54:46.9704270Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9704557Z               "line": 1938
2026-08-28T09:54:46.9704833Z             },
2026-08-28T09:54:46.9705100Z             {
2026-08-28T09:54:46.9705482Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9705772Z               "line": 1958
2026-08-28T09:54:46.9706049Z             },
2026-08-28T09:54:46.9706325Z             {
2026-08-28T09:54:46.9706709Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9707005Z               "line": 2103
2026-08-28T09:54:46.9707276Z             },
2026-08-28T09:54:46.9707549Z             {
2026-08-28T09:54:46.9707930Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9708226Z               "line": 2155
2026-08-28T09:54:46.9708508Z             },
2026-08-28T09:54:46.9708898Z             {
2026-08-28T09:54:46.9709358Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9709640Z               "line": 2214
2026-08-28T09:54:46.9709913Z             },
2026-08-28T09:54:46.9710170Z             {
2026-08-28T09:54:46.9710560Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:46.9710842Z               "line": 527
2026-08-28T09:54:46.9711115Z             }
2026-08-28T09:54:46.9711385Z           ]
2026-08-28T09:54:46.9711644Z         },
2026-08-28T09:54:46.9711916Z         "int": {
2026-08-28T09:54:46.9712216Z           "complete": true,
2026-08-28T09:54:46.9712507Z           "evidence": [
2026-08-28T09:54:46.9712774Z             {
2026-08-28T09:54:46.9713161Z               "path": "crates/spt/tests/job_escape_e2e.rs",
2026-08-28T09:54:46.9713441Z               "line": 35
2026-08-28T09:54:46.9713714Z             },
2026-08-28T09:54:46.9713987Z             {
2026-08-28T09:54:46.9714360Z               "path": "crates/spt/tests/job_escape_e2e.rs",
2026-08-28T09:54:46.9714650Z               "line": 595
2026-08-28T09:54:46.9714908Z             },
2026-08-28T09:54:46.9715179Z             {
2026-08-28T09:54:46.9715547Z               "path": "crates/spt/tests/job_escape_e2e.rs",
2026-08-28T09:54:46.9715833Z               "line": 616
2026-08-28T09:54:46.9716090Z             }
2026-08-28T09:54:46.9716357Z           ]
2026-08-28T09:54:46.9716637Z         },
2026-08-28T09:54:46.9716904Z         "unit": {
2026-08-28T09:54:46.9717203Z           "complete": true,
2026-08-28T09:54:46.9717490Z           "evidence": [
2026-08-28T09:54:46.9717756Z             {
2026-08-28T09:54:46.9718138Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9718429Z               "line": 3133
2026-08-28T09:54:46.9718695Z             },
2026-08-28T09:54:46.9719044Z             {
2026-08-28T09:54:46.9719430Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9719829Z               "line": 3177
2026-08-28T09:54:46.9720101Z             },
2026-08-28T09:54:46.9720377Z             {
2026-08-28T09:54:46.9720749Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9721045Z               "line": 3191
2026-08-28T09:54:46.9721327Z             },
2026-08-28T09:54:46.9721593Z             {
2026-08-28T09:54:46.9721973Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9722267Z               "line": 3209
2026-08-28T09:54:46.9722543Z             },
2026-08-28T09:54:46.9722809Z             {
2026-08-28T09:54:46.9723192Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9723483Z               "line": 3233
2026-08-28T09:54:46.9723763Z             },
2026-08-28T09:54:46.9724041Z             {
2026-08-28T09:54:46.9724422Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9724716Z               "line": 3460
2026-08-28T09:54:46.9724986Z             }
2026-08-28T09:54:46.9725348Z           ]
2026-08-28T09:54:46.9725648Z         }
2026-08-28T09:54:46.9725987Z       }
2026-08-28T09:54:46.9726250Z     },
2026-08-28T09:54:46.9726517Z     {
2026-08-28T09:54:46.9726869Z       "id": "REQ-HAZARD-VIEWER-ISOLATION",
2026-08-28T09:54:46.9733069Z       "title": "A slow / dead / hostile VIEWER must NEVER stall the controller, the PTY child, or the session drain thread. The broker drain fans output to the controller on the authoritative blocking bounded path (advances delivered_through) but to each viewer via a bounded per-viewer channel with a dedicated writer thread; the drain `try_send`s under the log lock and a viewer whose bounded queue OVERFLOWS (can't keep up) is EVICTED (queue dropped, writer thread ends, removed from the viewers map) — the drain thread NEVER touches a viewer socket, so no viewer write can backpressure or block it. A soft viewer cap bounds the thread count. Viewer eviction never perturbs the controller stream, the delivered_through cursor, or the child.",
2026-08-28T09:54:46.9733398Z       "requiredStages": [
2026-08-28T09:54:46.9733675Z         "unit",
2026-08-28T09:54:46.9734195Z         "int"
2026-08-28T09:54:46.9734468Z       ],
2026-08-28T09:54:46.9734740Z       "stages": {
2026-08-28T09:54:46.9735021Z         "doc": {
2026-08-28T09:54:46.9735314Z           "complete": true,
2026-08-28T09:54:46.9735593Z           "evidence": [
2026-08-28T09:54:46.9735861Z             {
2026-08-28T09:54:46.9736209Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9736495Z               "line": 492
2026-08-28T09:54:46.9736757Z             }
2026-08-28T09:54:46.9737034Z           ]
2026-08-28T09:54:46.9737302Z         },
2026-08-28T09:54:46.9737583Z         "impl": {
2026-08-28T09:54:46.9737881Z           "complete": true,
2026-08-28T09:54:46.9738179Z           "evidence": [
2026-08-28T09:54:46.9738446Z             {
2026-08-28T09:54:46.9738847Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9739282Z               "line": 119
2026-08-28T09:54:46.9739554Z             }
2026-08-28T09:54:46.9739825Z           ]
2026-08-28T09:54:46.9740092Z         },
2026-08-28T09:54:46.9740426Z         "int": {
2026-08-28T09:54:46.9740725Z           "complete": true,
2026-08-28T09:54:46.9741015Z           "evidence": [
2026-08-28T09:54:46.9741288Z             {
2026-08-28T09:54:46.9741683Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:46.9741973Z               "line": 1351
2026-08-28T09:54:46.9742236Z             }
2026-08-28T09:54:46.9742499Z           ]
2026-08-28T09:54:46.9742762Z         },
2026-08-28T09:54:46.9743041Z         "unit": {
2026-08-28T09:54:46.9743329Z           "complete": true,
2026-08-28T09:54:46.9743620Z           "evidence": [
2026-08-28T09:54:46.9743897Z             {
2026-08-28T09:54:46.9744273Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9744574Z               "line": 9925
2026-08-28T09:54:46.9744836Z             }
2026-08-28T09:54:46.9745108Z           ]
2026-08-28T09:54:46.9745490Z         }
2026-08-28T09:54:46.9745756Z       }
2026-08-28T09:54:46.9746031Z     },
2026-08-28T09:54:46.9746302Z     {
2026-08-28T09:54:46.9746669Z       "id": "REQ-HAZARD-VIEWER-RING-ROLL-SNAP",
2026-08-28T09:54:46.9759434Z       "title": "A read-only rc --view VIEWER whose serving brain falls behind the live ring under a hard flood and receives a FORWARD Output seq gap (the ring rolled frames out between reads, BEFORE any channel-overflow eviction → NO KIND_VIEWER_EVICTED marker) must SNAP TO LIVE (accept-and-advance via dedup-below + snap-above), NOT fatal with output gap (brain.rs:624/628 legacy reject-gap). ROOT (v0.13.0 forkpty, post-b4+skip-to-live): serve_attach subscribes a viewer via brain.attach_as(Viewer) leaving session_cursors EMPTY → the viewer serve-brain uses the LEGACY reject-gap → a PRE-eviction ring-roll forward-gap FATALS read_event → serve_attach returns → forwarding stops → attach_received_pty_output=FALSE (a_journaled / p0_paste / attach.rs:1071 wedged_viewer, Linux forkpty; Windows ConPTY floods slower → MASKED false-green). DISTINCT from REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT (the POST-eviction re-subscribe-from-floor): this is PRE-eviction gap-tolerance while STILL subscribed. VIEWER-only → B2-SAFE (a viewer never advances delivered_through / is not authoritative); the CONTROLLER keeps strict reject-gap (exactly-once resume). FIX: arm snap-above at initial viewer attach (attach_as_viewer_snap = attach_as(Viewer) + session_cursors.insert(session_id, from_seq)); the two viewer-survival mechanisms COMPOSE — this tolerates pre-eviction ring-roll gaps, REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT recovers post-eviction. (v0.13.0)",
2026-08-28T09:54:46.9759778Z       "requiredStages": [
2026-08-28T09:54:46.9760059Z         "doc",
2026-08-28T09:54:46.9760331Z         "impl",
2026-08-28T09:54:46.9760611Z         "unit",
2026-08-28T09:54:46.9760878Z         "int"
2026-08-28T09:54:46.9761155Z       ],
2026-08-28T09:54:46.9761441Z       "stages": {
2026-08-28T09:54:46.9761708Z         "doc": {
2026-08-28T09:54:46.9762022Z           "complete": true,
2026-08-28T09:54:46.9762309Z           "evidence": [
2026-08-28T09:54:46.9762723Z             {
2026-08-28T09:54:46.9763037Z               "path": "CONTEXT.md",
2026-08-28T09:54:46.9763328Z               "line": 405
2026-08-28T09:54:46.9763601Z             }
2026-08-28T09:54:46.9763873Z           ]
2026-08-28T09:54:46.9764142Z         },
2026-08-28T09:54:46.9764412Z         "impl": {
2026-08-28T09:54:46.9764707Z           "complete": true,
2026-08-28T09:54:46.9764989Z           "evidence": [
2026-08-28T09:54:46.9765266Z             {
2026-08-28T09:54:46.9765651Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.9765943Z               "line": 341
2026-08-28T09:54:46.9766214Z             },
2026-08-28T09:54:46.9766482Z             {
2026-08-28T09:54:46.9766858Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.9767147Z               "line": 1505
2026-08-28T09:54:46.9767413Z             }
2026-08-28T09:54:46.9767680Z           ]
2026-08-28T09:54:46.9767951Z         },
2026-08-28T09:54:46.9768218Z         "int": {
2026-08-28T09:54:46.9768514Z           "complete": true,
2026-08-28T09:54:46.9768795Z           "evidence": [
2026-08-28T09:54:46.9769186Z             {
2026-08-28T09:54:46.9769662Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.9769941Z               "line": 939
2026-08-28T09:54:46.9770213Z             },
2026-08-28T09:54:46.9770480Z             {
2026-08-28T09:54:46.9770962Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.9771239Z               "line": 2907
2026-08-28T09:54:46.9771510Z             }
2026-08-28T09:54:46.9771777Z           ]
2026-08-28T09:54:46.9772049Z         },
2026-08-28T09:54:46.9772324Z         "unit": {
2026-08-28T09:54:46.9772621Z           "complete": true,
2026-08-28T09:54:46.9772907Z           "evidence": [
2026-08-28T09:54:46.9773174Z             {
2026-08-28T09:54:46.9773545Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:46.9773951Z               "line": 3029
2026-08-28T09:54:46.9774227Z             }
2026-08-28T09:54:46.9774499Z           ]
2026-08-28T09:54:46.9774774Z         }
2026-08-28T09:54:46.9775044Z       }
2026-08-28T09:54:46.9775310Z     },
2026-08-28T09:54:46.9775577Z     {
2026-08-28T09:54:46.9776121Z       "id": "REQ-HAZARD-VIEWER-STARVE-UNDER-CONTROLLER-BACKPRESSURE",
2026-08-28T09:54:46.9791982Z       "title": "A SLOW controller must not starve a concurrent `rc --view` VIEWER. W1 (REQ-HAZARD-INJECT-CONTROL-COEXIST) moved the controller SOCKET WRITE off the drain thread onto controller_writer, but left the bounded HANDOFF (ControllerJob::deliver) as an INLINE try_send SLEEP-POLL on the drain (broker.rs:1450-1457 → deliver:669-685, up to CONTROLLER_WRITE_DEADLINE=5s). So when a controller drains slower than the PTY floods, its CONTROLLER_CHANNEL_DEPTH(4096) channel fills, deliver() polls inline, and the DRAIN THREAD is throttled to the controller's read rate → OutputLog::append's viewer fan-out (try_send) stops running → a concurrent VIEWER receives only the initial replay then nothing (root 'b4', warm forkpty: a_journaled c1=0/EVICT=0/got_output=FALSE; steady-state-near-full = no recovery; forkpty-only, floods harder than Windows ConPTY). The viewer-not-starved-by-a-busy-session property is legitimate (rc --view of a noisy session must show LIVE output). FIX: the controller becomes a SINGLE NON-BLOCKING try_send (like a viewer), done IN append() under the log lock; deliver()'s sleep-poll DELETED; the drain NEVER sleeps. ControllerSink gains a stateful last_ok deadline → a TRULY-stalled controller (continuous-Full past CONTROLLER_WRITE_DEADLINE) is evicted (bounded-wedge preserved); a slow-but-alive controller DROPS frames + falls behind the ring (resume-from-floor, the existing reconnect case). B2 GAPLESS-HANDOFF PRESERVED via a CONTIGUOUS delivered_through: controller_writer advances the cursor ONLY when the written seq == cursor (next expected); a gap from a drop FREEZES the cursor at last-contiguous so a re-attaching brain's resume_seq never skips a dropped chunk (a high-watermark advance past the gap would be a not-exactly-once resume = B2 violation, doyle's gate). (v0.13.0)",
2026-08-28T09:54:46.9792516Z       "requiredStages": [
2026-08-28T09:54:46.9792796Z         "impl",
2026-08-28T09:54:46.9793074Z         "unit",
2026-08-28T09:54:46.9793351Z         "int"
2026-08-28T09:54:46.9793621Z       ],
2026-08-28T09:54:46.9793907Z       "stages": {
2026-08-28T09:54:46.9794192Z         "doc": {
2026-08-28T09:54:46.9794493Z           "complete": false,
2026-08-28T09:54:46.9794779Z           "evidence": []
2026-08-28T09:54:46.9795047Z         },
2026-08-28T09:54:46.9795323Z         "impl": {
2026-08-28T09:54:46.9795624Z           "complete": true,
2026-08-28T09:54:46.9795913Z           "evidence": [
2026-08-28T09:54:46.9796188Z             {
2026-08-28T09:54:46.9796575Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9796865Z               "line": 1303
2026-08-28T09:54:46.9797152Z             },
2026-08-28T09:54:46.9797423Z             {
2026-08-28T09:54:46.9797810Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9798096Z               "line": 3683
2026-08-28T09:54:46.9798363Z             }
2026-08-28T09:54:46.9798628Z           ]
2026-08-28T09:54:46.9798898Z         },
2026-08-28T09:54:46.9799250Z         "int": {
2026-08-28T09:54:46.9799551Z           "complete": true,
2026-08-28T09:54:46.9799842Z           "evidence": [
2026-08-28T09:54:46.9800114Z             {
2026-08-28T09:54:46.9800585Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:46.9800867Z               "line": 938
2026-08-28T09:54:46.9801147Z             }
2026-08-28T09:54:46.9801422Z           ]
2026-08-28T09:54:46.9801693Z         },
2026-08-28T09:54:46.9801975Z         "unit": {
2026-08-28T09:54:46.9802276Z           "complete": true,
2026-08-28T09:54:46.9802576Z           "evidence": [
2026-08-28T09:54:46.9802953Z             {
2026-08-28T09:54:46.9803352Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9803643Z               "line": 10331
2026-08-28T09:54:46.9803930Z             },
2026-08-28T09:54:46.9804205Z             {
2026-08-28T09:54:46.9804601Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:46.9804887Z               "line": 10405
2026-08-28T09:54:46.9805155Z             }
2026-08-28T09:54:46.9805426Z           ]
2026-08-28T09:54:46.9805683Z         }
2026-08-28T09:54:46.9805950Z       }
2026-08-28T09:54:46.9806202Z     },
2026-08-28T09:54:46.9806473Z     {
2026-08-28T09:54:46.9806806Z       "id": "REQ-HAZARD-WAN-ORIGIN-AUTH",
2026-08-28T09:54:46.9809345Z       "title": "WAN-inbound origin is transport truth, never payload: the access gate's subject (ADR-0009 origin-node whitelist) is the QUIC handshake-proven remote node id from the broker's conn/stream table — a forged origin/node field inside record bytes is inert (7.5)",
2026-08-28T09:54:46.9809668Z       "requiredStages": [
2026-08-28T09:54:46.9809940Z         "doc",
2026-08-28T09:54:46.9810220Z         "impl",
2026-08-28T09:54:46.9810487Z         "unit"
2026-08-28T09:54:46.9810755Z       ],
2026-08-28T09:54:46.9811026Z       "stages": {
2026-08-28T09:54:46.9811299Z         "doc": {
2026-08-28T09:54:46.9811595Z           "complete": true,
2026-08-28T09:54:46.9811883Z           "evidence": [
2026-08-28T09:54:46.9812158Z             {
2026-08-28T09:54:46.9812506Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9812792Z               "line": 476
2026-08-28T09:54:46.9813054Z             }
2026-08-28T09:54:46.9813321Z           ]
2026-08-28T09:54:46.9813588Z         },
2026-08-28T09:54:46.9813870Z         "impl": {
2026-08-28T09:54:46.9814171Z           "complete": true,
2026-08-28T09:54:46.9814462Z           "evidence": [
2026-08-28T09:54:46.9814732Z             {
2026-08-28T09:54:46.9815109Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:46.9815391Z               "line": 44
2026-08-28T09:54:46.9815657Z             },
2026-08-28T09:54:46.9816049Z             {
2026-08-28T09:54:46.9816467Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:46.9816763Z               "line": 444
2026-08-28T09:54:46.9817034Z             },
2026-08-28T09:54:46.9817313Z             {
2026-08-28T09:54:46.9817718Z               "path": "crates/spt-daemon/src/digestlink.rs",
2026-08-28T09:54:46.9818009Z               "line": 116
2026-08-28T09:54:46.9818287Z             },
2026-08-28T09:54:46.9818553Z             {
2026-08-28T09:54:46.9819043Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9819329Z               "line": 56
2026-08-28T09:54:46.9819607Z             },
2026-08-28T09:54:46.9819882Z             {
2026-08-28T09:54:46.9820281Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9820576Z               "line": 1681
2026-08-28T09:54:46.9820843Z             },
2026-08-28T09:54:46.9821124Z             {
2026-08-28T09:54:46.9821515Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9821816Z               "line": 2037
2026-08-28T09:54:46.9822084Z             },
2026-08-28T09:54:46.9822362Z             {
2026-08-28T09:54:46.9822756Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.9823042Z               "line": 31
2026-08-28T09:54:46.9823314Z             },
2026-08-28T09:54:46.9823586Z             {
2026-08-28T09:54:46.9823986Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:46.9824292Z               "line": 776
2026-08-28T09:54:46.9824568Z             },
2026-08-28T09:54:46.9824835Z             {
2026-08-28T09:54:46.9825230Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:46.9825520Z               "line": 103
2026-08-28T09:54:46.9825802Z             },
2026-08-28T09:54:46.9826089Z             {
2026-08-28T09:54:46.9826488Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:46.9826890Z               "line": 29
2026-08-28T09:54:46.9827161Z             },
2026-08-28T09:54:46.9827441Z             {
2026-08-28T09:54:46.9827840Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:46.9828135Z               "line": 105
2026-08-28T09:54:46.9828411Z             },
2026-08-28T09:54:46.9828678Z             {
2026-08-28T09:54:46.9829166Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:46.9829452Z               "line": 50
2026-08-28T09:54:46.9829723Z             },
2026-08-28T09:54:46.9829990Z             {
2026-08-28T09:54:46.9830404Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:46.9830697Z               "line": 229
2026-08-28T09:54:46.9830969Z             },
2026-08-28T09:54:46.9831240Z             {
2026-08-28T09:54:46.9831626Z               "path": "crates/spt-daemon/src/resthost.rs",
2026-08-28T09:54:46.9831908Z               "line": 28
2026-08-28T09:54:46.9832175Z             },
2026-08-28T09:54:46.9832447Z             {
2026-08-28T09:54:46.9832833Z               "path": "crates/spt-daemon/src/resthost.rs",
2026-08-28T09:54:46.9833121Z               "line": 90
2026-08-28T09:54:46.9833389Z             },
2026-08-28T09:54:46.9833651Z             {
2026-08-28T09:54:46.9834037Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:46.9834318Z               "line": 95
2026-08-28T09:54:46.9834591Z             },
2026-08-28T09:54:46.9834842Z             {
2026-08-28T09:54:46.9835244Z               "path": "crates/spt-daemon/src/serveprobe.rs",
2026-08-28T09:54:46.9835525Z               "line": 32
2026-08-28T09:54:46.9835804Z             },
2026-08-28T09:54:46.9836080Z             {
2026-08-28T09:54:46.9836448Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:46.9836729Z               "line": 40
2026-08-28T09:54:46.9836997Z             },
2026-08-28T09:54:46.9837268Z             {
2026-08-28T09:54:46.9837635Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:46.9837930Z               "line": 185
2026-08-28T09:54:46.9838342Z             },
2026-08-28T09:54:46.9838614Z             {
2026-08-28T09:54:46.9839073Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.9839354Z               "line": 69
2026-08-28T09:54:46.9839625Z             },
2026-08-28T09:54:46.9839896Z             {
2026-08-28T09:54:46.9840313Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:46.9840593Z               "line": 707
2026-08-28T09:54:46.9840869Z             },
2026-08-28T09:54:46.9841133Z             {
2026-08-28T09:54:46.9841505Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:46.9841795Z               "line": 224
2026-08-28T09:54:46.9842069Z             },
2026-08-28T09:54:46.9842340Z             {
2026-08-28T09:54:46.9842702Z               "path": "crates/spt-net/src/net/sync.rs",
2026-08-28T09:54:46.9842993Z               "line": 37
2026-08-28T09:54:46.9843257Z             },
2026-08-28T09:54:46.9843535Z             {
2026-08-28T09:54:46.9843925Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:46.9844230Z               "line": 38
2026-08-28T09:54:46.9844502Z             },
2026-08-28T09:54:46.9844768Z             {
2026-08-28T09:54:46.9845156Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:46.9845441Z               "line": 102
2026-08-28T09:54:46.9845717Z             },
2026-08-28T09:54:46.9845984Z             {
2026-08-28T09:54:46.9846354Z               "path": "crates/spt-net/src/net/xfer.rs",
2026-08-28T09:54:46.9846640Z               "line": 40
2026-08-28T09:54:46.9846908Z             },
2026-08-28T09:54:46.9847175Z             {
2026-08-28T09:54:46.9847533Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:46.9847824Z               "line": 190
2026-08-28T09:54:46.9848091Z             }
2026-08-28T09:54:46.9848368Z           ]
2026-08-28T09:54:46.9848633Z         },
2026-08-28T09:54:46.9848907Z         "int": {
2026-08-28T09:54:46.9849418Z           "complete": true,
2026-08-28T09:54:46.9849713Z           "evidence": [
2026-08-28T09:54:46.9849986Z             {
2026-08-28T09:54:46.9850448Z               "path": "crates/spt-daemon/tests/digest_cross_node.rs",
2026-08-28T09:54:46.9850743Z               "line": 323
2026-08-28T09:54:46.9851010Z             }
2026-08-28T09:54:46.9851288Z           ]
2026-08-28T09:54:46.9851552Z         },
2026-08-28T09:54:46.9851827Z         "unit": {
2026-08-28T09:54:46.9852131Z           "complete": true,
2026-08-28T09:54:46.9852423Z           "evidence": [
2026-08-28T09:54:46.9852699Z             {
2026-08-28T09:54:46.9853081Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:46.9853382Z               "line": 220
2026-08-28T09:54:46.9853648Z             },
2026-08-28T09:54:46.9853924Z             {
2026-08-28T09:54:46.9854308Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:46.9854603Z               "line": 674
2026-08-28T09:54:46.9854876Z             },
2026-08-28T09:54:46.9855147Z             {
2026-08-28T09:54:46.9855538Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:46.9855824Z               "line": 225
2026-08-28T09:54:46.9856101Z             },
2026-08-28T09:54:46.9856369Z             {
2026-08-28T09:54:46.9856777Z               "path": "crates/spt-daemon/tests/notifsync.rs",
2026-08-28T09:54:46.9857073Z               "line": 137
2026-08-28T09:54:46.9857354Z             },
2026-08-28T09:54:46.9857622Z             {
2026-08-28T09:54:46.9858031Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:46.9858313Z               "line": 779
2026-08-28T09:54:46.9862282Z             },
2026-08-28T09:54:46.9862583Z             {
2026-08-28T09:54:46.9862983Z               "path": "crates/spt-daemon/tests/sync.rs",
2026-08-28T09:54:46.9863268Z               "line": 222
2026-08-28T09:54:46.9863542Z             },
2026-08-28T09:54:46.9863813Z             {
2026-08-28T09:54:46.9864199Z               "path": "crates/spt-daemon/tests/wanmsg.rs",
2026-08-28T09:54:46.9864651Z               "line": 202
2026-08-28T09:54:46.9864920Z             },
2026-08-28T09:54:46.9865192Z             {
2026-08-28T09:54:46.9865568Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:46.9865859Z               "line": 144
2026-08-28T09:54:46.9866126Z             },
2026-08-28T09:54:46.9866399Z             {
2026-08-28T09:54:46.9866761Z               "path": "crates/spt-net/src/net/sync.rs",
2026-08-28T09:54:46.9867046Z               "line": 157
2026-08-28T09:54:46.9867319Z             },
2026-08-28T09:54:46.9867581Z             {
2026-08-28T09:54:46.9867967Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:46.9868253Z               "line": 215
2026-08-28T09:54:46.9868516Z             },
2026-08-28T09:54:46.9868777Z             {
2026-08-28T09:54:46.9869254Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:46.9869540Z               "line": 269
2026-08-28T09:54:46.9869820Z             },
2026-08-28T09:54:46.9870090Z             {
2026-08-28T09:54:46.9870452Z               "path": "crates/spt-net/src/net/xfer.rs",
2026-08-28T09:54:46.9870744Z               "line": 162
2026-08-28T09:54:46.9871005Z             }
2026-08-28T09:54:46.9871281Z           ]
2026-08-28T09:54:46.9871544Z         }
2026-08-28T09:54:46.9871816Z       }
2026-08-28T09:54:46.9872084Z     },
2026-08-28T09:54:46.9872347Z     {
2026-08-28T09:54:46.9872730Z       "id": "REQ-HAZARD-WIN-PTY-PROGRAM-RESOLVE",
2026-08-28T09:54:46.9878208Z       "title": "Native-PTY spawn must resolve a bare program name with PATHEXT precedence and run a non-PE target through its interpreter: portable-pty's own `which` takes the FIRST PATH match — an extensionless shebang shim (e.g. a node CLI `ccs` shipped beside `ccs.cmd`) — and CreateProcessW then rejects the non-PE file with os error 193 ('not a valid Win32 application'); spt-term resolves the program itself (PATHEXT order prefers .EXE over .CMD; .cmd/.bat → cmd.exe /d /c, .ps1 → powershell -NoProfile -File) so a bare harness/shell [session.self] command actually launches on Windows. Unix is a passthrough (execve honours the shebang).",
2026-08-28T09:54:46.9878665Z       "requiredStages": [
2026-08-28T09:54:46.9879037Z         "doc",
2026-08-28T09:54:46.9879313Z         "impl",
2026-08-28T09:54:46.9879590Z         "unit",
2026-08-28T09:54:46.9879852Z         "int"
2026-08-28T09:54:46.9880119Z       ],
2026-08-28T09:54:46.9880395Z       "stages": {
2026-08-28T09:54:46.9880674Z         "doc": {
2026-08-28T09:54:46.9880969Z           "complete": true,
2026-08-28T09:54:46.9881255Z           "evidence": [
2026-08-28T09:54:46.9881527Z             {
2026-08-28T09:54:46.9881909Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9882194Z               "line": 289
2026-08-28T09:54:46.9882457Z             }
2026-08-28T09:54:46.9882724Z           ]
2026-08-28T09:54:46.9883001Z         },
2026-08-28T09:54:46.9883276Z         "impl": {
2026-08-28T09:54:46.9883594Z           "complete": true,
2026-08-28T09:54:46.9883885Z           "evidence": [
2026-08-28T09:54:46.9884166Z             {
2026-08-28T09:54:46.9884519Z               "path": "crates/spt-term/src/pty.rs",
2026-08-28T09:54:46.9884810Z               "line": 135
2026-08-28T09:54:46.9885081Z             },
2026-08-28T09:54:46.9885348Z             {
2026-08-28T09:54:46.9885685Z               "path": "crates/spt-term/src/pty.rs",
2026-08-28T09:54:46.9885983Z               "line": 157
2026-08-28T09:54:46.9886251Z             }
2026-08-28T09:54:46.9886518Z           ]
2026-08-28T09:54:46.9886776Z         },
2026-08-28T09:54:46.9887043Z         "int": {
2026-08-28T09:54:46.9887367Z           "complete": true,
2026-08-28T09:54:46.9887662Z           "evidence": [
2026-08-28T09:54:46.9887934Z             {
2026-08-28T09:54:46.9888321Z               "path": "crates/spt-term/tests/winspawn.rs",
2026-08-28T09:54:46.9888614Z               "line": 15
2026-08-28T09:54:46.9888891Z             }
2026-08-28T09:54:46.9889239Z           ]
2026-08-28T09:54:46.9889510Z         },
2026-08-28T09:54:46.9889897Z         "unit": {
2026-08-28T09:54:46.9890207Z           "complete": true,
2026-08-28T09:54:46.9890488Z           "evidence": [
2026-08-28T09:54:46.9890759Z             {
2026-08-28T09:54:46.9891138Z               "path": "crates/spt-term/src/winprog.rs",
2026-08-28T09:54:46.9891429Z               "line": 233
2026-08-28T09:54:46.9891710Z             }
2026-08-28T09:54:46.9891978Z           ]
2026-08-28T09:54:46.9892254Z         }
2026-08-28T09:54:46.9892517Z       }
2026-08-28T09:54:46.9892789Z     },
2026-08-28T09:54:46.9893050Z     {
2026-08-28T09:54:46.9893414Z       "id": "REQ-HAZARD-WINDOWS-PID-RECYCLE",
2026-08-28T09:54:46.9893915Z       "title": "Windows PID-recycling false positives guarded (5.1)",
2026-08-28T09:54:46.9894221Z       "requiredStages": [
2026-08-28T09:54:46.9894507Z         "impl",
2026-08-28T09:54:46.9894779Z         "unit"
2026-08-28T09:54:46.9895045Z       ],
2026-08-28T09:54:46.9895321Z       "stages": {
2026-08-28T09:54:46.9895603Z         "doc": {
2026-08-28T09:54:46.9895908Z           "complete": false,
2026-08-28T09:54:46.9896207Z           "evidence": []
2026-08-28T09:54:46.9896473Z         },
2026-08-28T09:54:46.9896754Z         "impl": {
2026-08-28T09:54:46.9897060Z           "complete": true,
2026-08-28T09:54:46.9897345Z           "evidence": [
2026-08-28T09:54:46.9897618Z             {
2026-08-28T09:54:46.9897985Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:46.9898271Z               "line": 101
2026-08-28T09:54:46.9898537Z             },
2026-08-28T09:54:46.9898813Z             {
2026-08-28T09:54:46.9899281Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.9899576Z               "line": 138
2026-08-28T09:54:46.9899848Z             }
2026-08-28T09:54:46.9900114Z           ]
2026-08-28T09:54:46.9900381Z         },
2026-08-28T09:54:46.9900648Z         "int": {
2026-08-28T09:54:46.9900948Z           "complete": false,
2026-08-28T09:54:46.9901244Z           "evidence": []
2026-08-28T09:54:46.9901627Z         },
2026-08-28T09:54:46.9901900Z         "unit": {
2026-08-28T09:54:46.9902204Z           "complete": true,
2026-08-28T09:54:46.9902504Z           "evidence": [
2026-08-28T09:54:46.9902772Z             {
2026-08-28T09:54:46.9903134Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:46.9903421Z               "line": 391
2026-08-28T09:54:46.9903693Z             },
2026-08-28T09:54:46.9903959Z             {
2026-08-28T09:54:46.9904349Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:46.9904637Z               "line": 573
2026-08-28T09:54:46.9904913Z             },
2026-08-28T09:54:46.9905180Z             {
2026-08-28T09:54:46.9905543Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.9905862Z               "line": 1831
2026-08-28T09:54:46.9906139Z             },
2026-08-28T09:54:46.9906411Z             {
2026-08-28T09:54:46.9906773Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:46.9907085Z               "line": 1889
2026-08-28T09:54:46.9907357Z             }
2026-08-28T09:54:46.9907624Z           ]
2026-08-28T09:54:46.9907896Z         }
2026-08-28T09:54:46.9908158Z       }
2026-08-28T09:54:46.9908424Z     },
2026-08-28T09:54:46.9908687Z     {
2026-08-28T09:54:46.9909151Z       "id": "REQ-HAZARD-WIRE-UNTAGGED-RECORD",
2026-08-28T09:54:46.9924602Z       "title": "A NEW WIRE RECORD MUST CARRY A `kind` TAG, because the untagged shape is already claimed. The stream dispatcher classifies a feed by sniffing its FIRST LINE, and the message family (`WanMessage`) is deliberately untagged: any first line carrying `target` plus `op_id` and no `kind` is read as a message feed. A new record type that omits the tag is therefore not merely unrecognized on an older daemon — it is MISCLASSIFIED as a message and DELIVERED INTO THE TARGET ENDPOINT'S SPOOL AS CHAT, on every N-1 node in the fleet, silently and without error. The failure is invisible to any same-version test, because both ends of a same-version pair agree; only a cross-version reading finds it. Discovered in W4 T10 (releases#53) while designing the knock record, which necessarily carries a `target` and would have hit exactly this arm. INVARIANT: every wire record minted from here on carries a `kind` tag that the dispatcher's tagged arm routes, so an older daemon's `Some(_)` catch-all resolves it to the Unknown family and DROPS it cleanly — no delivery, no wedge, no misread. The correct degrade for a request an old peer cannot serve is that it never arrives, never that it arrives as something else. PROOF OBLIGATION, both halves, or the pin goes vacuous: (a) this version routes the record to its own family AND is asserted NOT to route it to the message family; (b) the same bytes under a tag this version does not know resolve to Unknown; and (c) the untagged shape is asserted to genuinely BE claimed by the message arm — without (c) the test passes for the wrong reason the day the record's fields drift and it would no longer have collided anyway. Gate: doc — the KNOWN-HAZARDS entry stating the invariant and the misdelivery mechanism; impl — the tag on the record plus the dispatcher arm that routes it; unit — the three-part classifier pin above, run against the REAL classifier rather than a restatement of it.",
2026-08-28T09:54:46.9925123Z       "requiredStages": [
2026-08-28T09:54:46.9925397Z         "doc",
2026-08-28T09:54:46.9925681Z         "impl",
2026-08-28T09:54:46.9925953Z         "unit"
2026-08-28T09:54:46.9926221Z       ],
2026-08-28T09:54:46.9926516Z       "stages": {
2026-08-28T09:54:46.9926788Z         "doc": {
2026-08-28T09:54:46.9927089Z           "complete": true,
2026-08-28T09:54:46.9927375Z           "evidence": [
2026-08-28T09:54:46.9927651Z             {
2026-08-28T09:54:46.9928002Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:46.9928285Z               "line": 948
2026-08-28T09:54:46.9928572Z             }
2026-08-28T09:54:46.9928839Z           ]
2026-08-28T09:54:46.9929168Z         },
2026-08-28T09:54:46.9929740Z         "impl": {
2026-08-28T09:54:46.9930040Z           "complete": true,
2026-08-28T09:54:46.9930355Z           "evidence": [
2026-08-28T09:54:46.9930638Z             {
2026-08-28T09:54:46.9931032Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9931323Z               "line": 251
2026-08-28T09:54:46.9931595Z             },
2026-08-28T09:54:46.9931867Z             {
2026-08-28T09:54:46.9932262Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9932544Z               "line": 254
2026-08-28T09:54:46.9932816Z             },
2026-08-28T09:54:46.9933085Z             {
2026-08-28T09:54:46.9933480Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9933770Z               "line": 260
2026-08-28T09:54:46.9934051Z             },
2026-08-28T09:54:46.9934323Z             {
2026-08-28T09:54:46.9934714Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9935000Z               "line": 263
2026-08-28T09:54:46.9935277Z             },
2026-08-28T09:54:46.9935543Z             {
2026-08-28T09:54:46.9935924Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9936222Z               "line": 269
2026-08-28T09:54:46.9936490Z             },
2026-08-28T09:54:46.9936757Z             {
2026-08-28T09:54:46.9937157Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:46.9937438Z               "line": 65
2026-08-28T09:54:46.9937720Z             },
2026-08-28T09:54:46.9937988Z             {
2026-08-28T09:54:46.9938368Z               "path": "crates/spt-net/src/net/forkmsg.rs",
2026-08-28T09:54:46.9938653Z               "line": 50
2026-08-28T09:54:46.9938927Z             },
2026-08-28T09:54:46.9939300Z             {
2026-08-28T09:54:46.9939686Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:46.9939976Z               "line": 51
2026-08-28T09:54:46.9940249Z             },
2026-08-28T09:54:46.9940610Z             {
2026-08-28T09:54:46.9941025Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:46.9941430Z               "line": 65
2026-08-28T09:54:46.9941706Z             },
2026-08-28T09:54:46.9941978Z             {
2026-08-28T09:54:46.9942384Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:46.9942683Z               "line": 78
2026-08-28T09:54:46.9942960Z             },
2026-08-28T09:54:46.9943236Z             {
2026-08-28T09:54:46.9943627Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:46.9943906Z               "line": 33
2026-08-28T09:54:46.9944187Z             }
2026-08-28T09:54:46.9944459Z           ]
2026-08-28T09:54:46.9944727Z         },
2026-08-28T09:54:46.9944999Z         "int": {
2026-08-28T09:54:46.9945304Z           "complete": false,
2026-08-28T09:54:46.9945594Z           "evidence": []
2026-08-28T09:54:46.9945860Z         },
2026-08-28T09:54:46.9946138Z         "unit": {
2026-08-28T09:54:46.9946437Z           "complete": true,
2026-08-28T09:54:46.9946735Z           "evidence": [
2026-08-28T09:54:46.9947002Z             {
2026-08-28T09:54:46.9947397Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9947689Z               "line": 2301
2026-08-28T09:54:46.9947956Z             },
2026-08-28T09:54:46.9948228Z             {
2026-08-28T09:54:46.9948618Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9948905Z               "line": 2429
2026-08-28T09:54:46.9949255Z             },
2026-08-28T09:54:46.9949536Z             {
2026-08-28T09:54:46.9949918Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9950203Z               "line": 2603
2026-08-28T09:54:46.9950480Z             },
2026-08-28T09:54:46.9950747Z             {
2026-08-28T09:54:46.9951138Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:46.9951425Z               "line": 2677
2026-08-28T09:54:46.9951692Z             },
2026-08-28T09:54:46.9951956Z             {
2026-08-28T09:54:46.9952468Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:46.9952758Z               "line": 177
2026-08-28T09:54:46.9953058Z             },
2026-08-28T09:54:46.9953326Z             {
2026-08-28T09:54:46.9953707Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:46.9953994Z               "line": 140
2026-08-28T09:54:46.9954263Z             },
2026-08-28T09:54:46.9954547Z             {
2026-08-28T09:54:46.9954943Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:46.9955240Z               "line": 268
2026-08-28T09:54:46.9955496Z             }
2026-08-28T09:54:46.9955772Z           ]
2026-08-28T09:54:46.9956044Z         }
2026-08-28T09:54:46.9956297Z       }
2026-08-28T09:54:46.9956560Z     },
2026-08-28T09:54:46.9956818Z     {
2026-08-28T09:54:46.9957169Z       "id": "REQ-HAZARD-WMI-DAEMON-WINDOW",
2026-08-28T09:54:46.9964482Z       "title": "`spt daemon start` launches the daemon with NO visible console window. REGRESSION (v0.12.1 L1.5): the WMI job-neutral launch (spawn_daemon_via_wmi) set CREATE_NO_WINDOW on the launching powershell but NOT on the Win32_Process.Create call — Win32_Process.Create does not inherit it, so the spawned cmd.exe env-forwarding wrapper popped a console window on every cold-start (violating REQ-INSTALL-10's v0.7.4 no-persistent-window invariant; the old detached_no_inherit path set DETACHED_PROCESS|CREATE_NO_WINDOW). FIX: pass a Win32_ProcessStartup with CreateFlags=DETACHED_PROCESS (0x8 — no console so no window; CREATE_NO_WINDOW 0x08000000 is NOT a valid Win32_ProcessStartup flag → ReturnValue 21 invalid-param, which is why the naive port fails) + ShowWindow=SW_HIDE(0) belt, via the ProcessStartupInformation argument. (v0.12.2)",
2026-08-28T09:54:46.9964809Z       "requiredStages": [
2026-08-28T09:54:46.9965078Z         "impl",
2026-08-28T09:54:46.9965350Z         "unit",
2026-08-28T09:54:46.9965617Z         "int"
2026-08-28T09:54:46.9965889Z       ],
2026-08-28T09:54:46.9966162Z       "stages": {
2026-08-28T09:54:46.9966462Z         "doc": {
2026-08-28T09:54:46.9966905Z           "complete": false,
2026-08-28T09:54:46.9967195Z           "evidence": []
2026-08-28T09:54:46.9967463Z         },
2026-08-28T09:54:46.9967743Z         "impl": {
2026-08-28T09:54:46.9968032Z           "complete": true,
2026-08-28T09:54:46.9968318Z           "evidence": [
2026-08-28T09:54:46.9968603Z             {
2026-08-28T09:54:46.9969062Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9969348Z               "line": 2009
2026-08-28T09:54:46.9969616Z             },
2026-08-28T09:54:46.9969887Z             {
2026-08-28T09:54:46.9970262Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9970555Z               "line": 2133
2026-08-28T09:54:46.9970822Z             }
2026-08-28T09:54:46.9971089Z           ]
2026-08-28T09:54:46.9971357Z         },
2026-08-28T09:54:46.9971629Z         "int": {
2026-08-28T09:54:46.9971934Z           "complete": true,
2026-08-28T09:54:46.9972220Z           "evidence": [
2026-08-28T09:54:46.9972493Z             {
2026-08-28T09:54:46.9972874Z               "path": "crates/spt/tests/job_escape_e2e.rs",
2026-08-28T09:54:46.9973163Z               "line": 183
2026-08-28T09:54:46.9973434Z             },
2026-08-28T09:54:46.9973715Z             {
2026-08-28T09:54:46.9974112Z               "path": "crates/spt/tests/job_escape_e2e.rs",
2026-08-28T09:54:46.9974418Z               "line": 358
2026-08-28T09:54:46.9974689Z             }
2026-08-28T09:54:46.9974950Z           ]
2026-08-28T09:54:46.9975222Z         },
2026-08-28T09:54:46.9975492Z         "unit": {
2026-08-28T09:54:46.9975792Z           "complete": true,
2026-08-28T09:54:46.9976078Z           "evidence": [
2026-08-28T09:54:46.9976350Z             {
2026-08-28T09:54:46.9976731Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:46.9977018Z               "line": 3137
2026-08-28T09:54:46.9977289Z             },
2026-08-28T09:54:46.9977551Z             {
2026-08-28T09:54:46.9978005Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:46.9978294Z               "line": 30697
2026-08-28T09:54:46.9978563Z             }
2026-08-28T09:54:46.9978834Z           ]
2026-08-28T09:54:46.9979193Z         }
2026-08-28T09:54:46.9979473Z       }
2026-08-28T09:54:46.9979736Z     },
2026-08-28T09:54:46.9979998Z     {
2026-08-28T09:54:46.9980322Z       "id": "REQ-HAZARD-WORKER-PATH",
2026-08-28T09:54:46.9980888Z       "title": "Single source of truth for Worker/Psyche perch location (1.5)",
2026-08-28T09:54:46.9981192Z       "requiredStages": [
2026-08-28T09:54:46.9981469Z         "impl",
2026-08-28T09:54:46.9981740Z         "unit"
2026-08-28T09:54:46.9982012Z       ],
2026-08-28T09:54:46.9982298Z       "stages": {
2026-08-28T09:54:46.9982565Z         "doc": {
2026-08-28T09:54:46.9982870Z           "complete": false,
2026-08-28T09:54:46.9983161Z           "evidence": []
2026-08-28T09:54:46.9983439Z         },
2026-08-28T09:54:46.9983709Z         "impl": {
2026-08-28T09:54:46.9984009Z           "complete": true,
2026-08-28T09:54:46.9984300Z           "evidence": [
2026-08-28T09:54:46.9984575Z             {
2026-08-28T09:54:46.9984953Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9985229Z               "line": 538
2026-08-28T09:54:46.9985497Z             },
2026-08-28T09:54:46.9985777Z             {
2026-08-28T09:54:46.9986151Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9986447Z               "line": 583
2026-08-28T09:54:46.9986705Z             },
2026-08-28T09:54:46.9986977Z             {
2026-08-28T09:54:46.9987368Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9987648Z               "line": 595
2026-08-28T09:54:46.9987921Z             }
2026-08-28T09:54:46.9988188Z           ]
2026-08-28T09:54:46.9988455Z         },
2026-08-28T09:54:46.9988725Z         "int": {
2026-08-28T09:54:46.9989114Z           "complete": false,
2026-08-28T09:54:46.9989404Z           "evidence": []
2026-08-28T09:54:46.9989705Z         },
2026-08-28T09:54:46.9989981Z         "unit": {
2026-08-28T09:54:46.9990392Z           "complete": true,
2026-08-28T09:54:46.9990682Z           "evidence": [
2026-08-28T09:54:46.9990949Z             {
2026-08-28T09:54:46.9991315Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9991594Z               "line": 969
2026-08-28T09:54:46.9991866Z             },
2026-08-28T09:54:46.9992129Z             {
2026-08-28T09:54:46.9992501Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:46.9992791Z               "line": 1013
2026-08-28T09:54:46.9993054Z             },
2026-08-28T09:54:46.9993322Z             {
2026-08-28T09:54:46.9993656Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:46.9993947Z               "line": 307
2026-08-28T09:54:46.9994211Z             }
2026-08-28T09:54:46.9994483Z           ]
2026-08-28T09:54:46.9994750Z         }
2026-08-28T09:54:46.9995018Z       }
2026-08-28T09:54:46.9995275Z     },
2026-08-28T09:54:46.9995567Z     {
2026-08-28T09:54:46.9995943Z       "id": "REQ-HEAVY-UNIT-CLASSIFICATION",
2026-08-28T09:54:47.0007609Z       "title": "A unit test that stands up a REAL broker inside a lib/bin `#[cfg(test)]` block must sit in the `heavy-broker-pty` nextest group, and the classification must be ENFORCED rather than remembered. FLAKE-LEDGER: `attach_viewport_reconnects_across_a_broker_bounce` diagnosed this class in the `spt` binary, wrote the CLASS in prose, then shipped an ENUMERATION of four `rc::tests::` names — so the identical shape in `spt-daemon`'s lib (`applyhost`: a real `Broker::bind` + `serve()` in 10 of its 13 units) stayed in the full-parallel Phase-A pool and TIMED OUT at 240s twice, at v0.32.0 and again under the v0.39.0 W5 gate, the v0.32.0 remedy never having landed. The defect is provable from `.config/nextest.toml` ALONE (two overrides, neither matching `kind(lib)`); timing evidence only ever estimated the rate. Gate: impl — heavy-group overrides for `applyhost`/`livehost`/`pump` (spt-daemon lib) and `wansend` (spt bin, found BY the check rather than by a person), plus `xtask check`'s `check_heavy_unit_classification` keyed on the SHAPE (a `Broker::bind` after the `mod tests` marker) instead of a name list; unit — the two pure seams, including the regression for this check's OWN first draft, which substring-matched `<module>::tests` and so missed every module written inside an alternation group. Kin FLAKE-LEDGER: `attach_viewport_reconnects_across_a_broker_bounce` + the HEAVY-AT-BIRTH ruling (.config/nextest.toml), REQ-CI-DOCS-ONLY-THIN.",
2026-08-28T09:54:47.0008121Z       "requiredStages": [
2026-08-28T09:54:47.0008402Z         "impl",
2026-08-28T09:54:47.0008684Z         "unit"
2026-08-28T09:54:47.0009037Z       ],
2026-08-28T09:54:47.0009318Z       "stages": {
2026-08-28T09:54:47.0009599Z         "doc": {
2026-08-28T09:54:47.0009897Z           "complete": false,
2026-08-28T09:54:47.0010191Z           "evidence": []
2026-08-28T09:54:47.0010462Z         },
2026-08-28T09:54:47.0010744Z         "impl": {
2026-08-28T09:54:47.0011055Z           "complete": true,
2026-08-28T09:54:47.0011374Z           "evidence": [
2026-08-28T09:54:47.0011650Z             {
2026-08-28T09:54:47.0011993Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.0012280Z               "line": 904
2026-08-28T09:54:47.0012545Z             },
2026-08-28T09:54:47.0012820Z             {
2026-08-28T09:54:47.0013159Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.0013450Z               "line": 924
2026-08-28T09:54:47.0013716Z             }
2026-08-28T09:54:47.0013983Z           ]
2026-08-28T09:54:47.0014260Z         },
2026-08-28T09:54:47.0014531Z         "int": {
2026-08-28T09:54:47.0014828Z           "complete": false,
2026-08-28T09:54:47.0015124Z           "evidence": []
2026-08-28T09:54:47.0015394Z         },
2026-08-28T09:54:47.0015665Z         "unit": {
2026-08-28T09:54:47.0015960Z           "complete": true,
2026-08-28T09:54:47.0016252Z           "evidence": [
2026-08-28T09:54:47.0016523Z             {
2026-08-28T09:54:47.0016872Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.0017273Z               "line": 2349
2026-08-28T09:54:47.0017552Z             },
2026-08-28T09:54:47.0017832Z             {
2026-08-28T09:54:47.0018174Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.0018461Z               "line": 2365
2026-08-28T09:54:47.0018737Z             },
2026-08-28T09:54:47.0019100Z             {
2026-08-28T09:54:47.0019439Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.0019734Z               "line": 2386
2026-08-28T09:54:47.0019996Z             }
2026-08-28T09:54:47.0020259Z           ]
2026-08-28T09:54:47.0020525Z         }
2026-08-28T09:54:47.0020794Z       }
2026-08-28T09:54:47.0021051Z     },
2026-08-28T09:54:47.0021347Z     {
2026-08-28T09:54:47.0021643Z       "id": "REQ-HOST-RUN-1",
2026-08-28T09:54:47.0028458Z       "title": "spt-hosted harness bringup: `spt endpoint run` spawns an adapter's `[session.self]` command template into a broker-held PTY (the spawn-session seam, brain.rs spawn_session_pid — same broker path shellhost.rs launch_shell_brokered_in uses for shells, now for kind=\"harness\" self-role), registers the perch under the given endpoint id, returns the id. Reverses today's harness-hosted-only launch (external launcher → `api bind`). Non-interactive flag set (--adapter <a[:profile]> --id <id> --create --resume <session> --attach|--start|--view) covers every terminal action of the W2 interactive picker so shortcuts (cc-<id>) bake fully non-interactive launches; composite adapter:profile resolves via registry::resolve_option leaf-replace overlay.",
2026-08-28T09:54:47.0028788Z       "requiredStages": [
2026-08-28T09:54:47.0029156Z         "impl",
2026-08-28T09:54:47.0029427Z         "unit",
2026-08-28T09:54:47.0029736Z         "int"
2026-08-28T09:54:47.0030003Z       ],
2026-08-28T09:54:47.0030285Z       "stages": {
2026-08-28T09:54:47.0030556Z         "doc": {
2026-08-28T09:54:47.0030852Z           "complete": false,
2026-08-28T09:54:47.0031306Z           "evidence": []
2026-08-28T09:54:47.0031573Z         },
2026-08-28T09:54:47.0031883Z         "impl": {
2026-08-28T09:54:47.0032184Z           "complete": true,
2026-08-28T09:54:47.0032470Z           "evidence": [
2026-08-28T09:54:47.0032733Z             {
2026-08-28T09:54:47.0033151Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0033433Z               "line": 30
2026-08-28T09:54:47.0033703Z             },
2026-08-28T09:54:47.0033973Z             {
2026-08-28T09:54:47.0034384Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0034684Z               "line": 90
2026-08-28T09:54:47.0034952Z             },
2026-08-28T09:54:47.0035238Z             {
2026-08-28T09:54:47.0035633Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0035906Z               "line": 257
2026-08-28T09:54:47.0036163Z             },
2026-08-28T09:54:47.0036433Z             {
2026-08-28T09:54:47.0036780Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0037067Z               "line": 2852
2026-08-28T09:54:47.0037329Z             }
2026-08-28T09:54:47.0037591Z           ]
2026-08-28T09:54:47.0037869Z         },
2026-08-28T09:54:47.0038131Z         "int": {
2026-08-28T09:54:47.0038427Z           "complete": true,
2026-08-28T09:54:47.0038706Z           "evidence": [
2026-08-28T09:54:47.0039057Z             {
2026-08-28T09:54:47.0039448Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.0039735Z               "line": 299
2026-08-28T09:54:47.0039997Z             }
2026-08-28T09:54:47.0040248Z           ]
2026-08-28T09:54:47.0040573Z         },
2026-08-28T09:54:47.0040845Z         "unit": {
2026-08-28T09:54:47.0041145Z           "complete": true,
2026-08-28T09:54:47.0041421Z           "evidence": [
2026-08-28T09:54:47.0041697Z             {
2026-08-28T09:54:47.0042100Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0042387Z               "line": 468
2026-08-28T09:54:47.0042663Z             },
2026-08-28T09:54:47.0043054Z             {
2026-08-28T09:54:47.0043459Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0043741Z               "line": 652
2026-08-28T09:54:47.0044012Z             },
2026-08-28T09:54:47.0044282Z             {
2026-08-28T09:54:47.0044682Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0044977Z               "line": 775
2026-08-28T09:54:47.0045240Z             },
2026-08-28T09:54:47.0045516Z             {
2026-08-28T09:54:47.0045850Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0046136Z               "line": 3304
2026-08-28T09:54:47.0046404Z             },
2026-08-28T09:54:47.0046675Z             {
2026-08-28T09:54:47.0047002Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0047293Z               "line": 3423
2026-08-28T09:54:47.0047570Z             }
2026-08-28T09:54:47.0047833Z           ]
2026-08-28T09:54:47.0048100Z         }
2026-08-28T09:54:47.0048367Z       }
2026-08-28T09:54:47.0048644Z     },
2026-08-28T09:54:47.0048910Z     {
2026-08-28T09:54:47.0049319Z       "id": "REQ-HOST-RUN-2",
2026-08-28T09:54:47.0054983Z       "title": "Project-scoped working directory for spt-hosted bringup: an spt-hosted bringup lands the broker-spawned harness PTY in the user's PROJECT cwd, not the daemon's, via an additive `SpawnReq.cwd` field carried through the broker PTY spawn (portable-pty CommandBuilder cwd). N-1-safe wire change (additive, defaulted). Required because the consumer (Claude Code) is project-scoped: broker-inherited cwd = the daemon's cwd = the wrong `.claude`, wrong session history, wrong digest source; `cc <id>` at a project root MUST land the harness in that project. W1 ships broker-inherited cwd as a bringup-proof shortcut only; this REQ must land before the M12 gate (doyle, 2026-06-14).",
2026-08-28T09:54:47.0055284Z       "requiredStages": [
2026-08-28T09:54:47.0055565Z         "impl",
2026-08-28T09:54:47.0055829Z         "unit",
2026-08-28T09:54:47.0056281Z         "int"
2026-08-28T09:54:47.0056595Z       ],
2026-08-28T09:54:47.0056858Z       "stages": {
2026-08-28T09:54:47.0057134Z         "doc": {
2026-08-28T09:54:47.0057444Z           "complete": false,
2026-08-28T09:54:47.0057735Z           "evidence": []
2026-08-28T09:54:47.0058002Z         },
2026-08-28T09:54:47.0058298Z         "impl": {
2026-08-28T09:54:47.0058594Z           "complete": true,
2026-08-28T09:54:47.0058889Z           "evidence": [
2026-08-28T09:54:47.0059251Z             {
2026-08-28T09:54:47.0059680Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0059969Z               "line": 258
2026-08-28T09:54:47.0060240Z             },
2026-08-28T09:54:47.0060507Z             {
2026-08-28T09:54:47.0060855Z               "path": "crates/spt-term/src/pty.rs",
2026-08-28T09:54:47.0061146Z               "line": 113
2026-08-28T09:54:47.0061403Z             }
2026-08-28T09:54:47.0061674Z           ]
2026-08-28T09:54:47.0061946Z         },
2026-08-28T09:54:47.0062237Z         "int": {
2026-08-28T09:54:47.0062538Z           "complete": true,
2026-08-28T09:54:47.0062822Z           "evidence": [
2026-08-28T09:54:47.0063087Z             {
2026-08-28T09:54:47.0063464Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.0063756Z               "line": 770
2026-08-28T09:54:47.0064022Z             }
2026-08-28T09:54:47.0064289Z           ]
2026-08-28T09:54:47.0064560Z         },
2026-08-28T09:54:47.0064832Z         "unit": {
2026-08-28T09:54:47.0065122Z           "complete": true,
2026-08-28T09:54:47.0065534Z           "evidence": [
2026-08-28T09:54:47.0065802Z             {
2026-08-28T09:54:47.0066202Z               "path": "crates/spt-term/tests/surface.rs",
2026-08-28T09:54:47.0066478Z               "line": 86
2026-08-28T09:54:47.0066746Z             }
2026-08-28T09:54:47.0067022Z           ]
2026-08-28T09:54:47.0067308Z         }
2026-08-28T09:54:47.0067577Z       }
2026-08-28T09:54:47.0067839Z     },
2026-08-28T09:54:47.0068127Z     {
2026-08-28T09:54:47.0068519Z       "id": "REQ-HOSTING-AUTHORITY-CONTROLLABLE",
2026-08-28T09:54:47.0090525Z       "title": "RC-RENDER-TRUTH v0.38.1 fast-follow leg 3 (hertz todlando immortal-hybrid trace, doyle fork ruling 2026-07-18 = controllable-authority): ONE hosting authority — persisted `state` stays the durable endpoint TYPE (REQ-EP-6 open type system; establish_perch's prior-type preserve at startup.rs:346-350 is INTENTIONAL and stays), `controllable==Some(true)` is the source-definitive broker-PTY authority. FIELD ROOT (C1 coverage gap, not new family): an spt-hosted bind over a prior ready_agent perch preserves state=ready_agent while stamping controllable=true + online -> livehost restart_resume_gate (508-534) Skip's state!=live_agent so the orphan never resumes, and reconcile's C1 dead-pid hybrid heal predicate was scoped controllable=false so controllable=true escapes -> immortal dead-PID ready_agent hybrid, latch-driven Active projection (todlando field state; rc's no-session refusal was TRUTHFUL). FIX (hertz refinement, ratified): remove the state rejection from restart_resume_gate; reconcile routes only non-live_agent && controllable!=Some(true) through the PID-model hybrid heal, while controllable==Some(true) rows fall through BROKER-SESSION truth (orphan with ledger/adapter material => Resume; no session + dead pid => terminal offline via the W2 atomic normalize). Psyche hosting stays separately state-gated (live_agent only). endpoint_survival tables BOTH live_agent and ready_agent broker-owned rows -- both resume their PTY at daemon start, ready stays no-Psyche (hertz definitive-trace addendum). restart_resume_gate keys on online+controllable+session/relay/custody belts, no state arg. cmd_bind's online gate reads/verifies the PERSISTED state it just wrote, never only the requested arg (parity with cmd_listen's W2 creator gate). Gate: impl -- gate/reconcile routing + bind online-gate persisted-read; unit -- routing table (non-live+controllable!=true -> PID-model; ready+true -> session-truth; live_agent unchanged); int -- hertz matrix verbatim: (i) ready_agent+controllable=true+online ORPHAN (dead harness, ledger+material) => restart RESUMES; (ii) ready+true+online with dead pid/NO session => reconcile terminally offlines + Active projection removed; (iii) legitimate ready listener (controllable!=true, live pid) => stays messaging-online on the PID model, never treated as PTY-attachable; (iv) spt-hosted bind over prior ready_agent => controllable=true+online+restart-resume works with preserved type; doc -- ADR-0041 amendment note (authority split: type vs hosting).",
2026-08-28T09:54:47.0091146Z       "requiredStages": [
2026-08-28T09:54:47.0091422Z         "doc",
2026-08-28T09:54:47.0091691Z         "impl",
2026-08-28T09:54:47.0091959Z         "unit",
2026-08-28T09:54:47.0092230Z         "int"
2026-08-28T09:54:47.0092497Z       ],
2026-08-28T09:54:47.0092768Z       "stages": {
2026-08-28T09:54:47.0093040Z         "doc": {
2026-08-28T09:54:47.0093331Z           "complete": true,
2026-08-28T09:54:47.0093631Z           "evidence": [
2026-08-28T09:54:47.0093907Z             {
2026-08-28T09:54:47.0094340Z               "path": "docs/adr/0041-endpoint-lifecycle-truth.md",
2026-08-28T09:54:47.0094629Z               "line": 103
2026-08-28T09:54:47.0094896Z             }
2026-08-28T09:54:47.0095169Z           ]
2026-08-28T09:54:47.0095436Z         },
2026-08-28T09:54:47.0095713Z         "impl": {
2026-08-28T09:54:47.0096023Z           "complete": true,
2026-08-28T09:54:47.0096304Z           "evidence": [
2026-08-28T09:54:47.0096574Z             {
2026-08-28T09:54:47.0096965Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0097248Z               "line": 520
2026-08-28T09:54:47.0097520Z             },
2026-08-28T09:54:47.0097797Z             {
2026-08-28T09:54:47.0098178Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0098469Z               "line": 528
2026-08-28T09:54:47.0098746Z             },
2026-08-28T09:54:47.0099103Z             {
2026-08-28T09:54:47.0099505Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0099909Z               "line": 853
2026-08-28T09:54:47.0100185Z             },
2026-08-28T09:54:47.0100447Z             {
2026-08-28T09:54:47.0100820Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.0101115Z               "line": 1164
2026-08-28T09:54:47.0101381Z             }
2026-08-28T09:54:47.0101658Z           ]
2026-08-28T09:54:47.0101924Z         },
2026-08-28T09:54:47.0102200Z         "int": {
2026-08-28T09:54:47.0102504Z           "complete": true,
2026-08-28T09:54:47.0102795Z           "evidence": [
2026-08-28T09:54:47.0103062Z             {
2026-08-28T09:54:47.0103524Z               "path": "crates/spt-daemon/tests/endpoint_survival.rs",
2026-08-28T09:54:47.0103815Z               "line": 177
2026-08-28T09:54:47.0104073Z             },
2026-08-28T09:54:47.0104340Z             {
2026-08-28T09:54:47.0104787Z               "path": "crates/spt-daemon/tests/endpoint_survival.rs",
2026-08-28T09:54:47.0105081Z               "line": 237
2026-08-28T09:54:47.0105352Z             },
2026-08-28T09:54:47.0105624Z             {
2026-08-28T09:54:47.0106067Z               "path": "crates/spt-daemon/tests/endpoint_survival.rs",
2026-08-28T09:54:47.0106353Z               "line": 270
2026-08-28T09:54:47.0106625Z             },
2026-08-28T09:54:47.0106888Z             {
2026-08-28T09:54:47.0107255Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.0107544Z               "line": 2475
2026-08-28T09:54:47.0107818Z             }
2026-08-28T09:54:47.0108084Z           ]
2026-08-28T09:54:47.0108352Z         },
2026-08-28T09:54:47.0108619Z         "unit": {
2026-08-28T09:54:47.0108920Z           "complete": true,
2026-08-28T09:54:47.0109301Z           "evidence": [
2026-08-28T09:54:47.0109568Z             {
2026-08-28T09:54:47.0109954Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0110240Z               "line": 2652
2026-08-28T09:54:47.0110635Z             },
2026-08-28T09:54:47.0110898Z             {
2026-08-28T09:54:47.0111288Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0111575Z               "line": 2715
2026-08-28T09:54:47.0111841Z             },
2026-08-28T09:54:47.0112114Z             {
2026-08-28T09:54:47.0112480Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.0112770Z               "line": 2519
2026-08-28T09:54:47.0113031Z             }
2026-08-28T09:54:47.0113307Z           ]
2026-08-28T09:54:47.0113569Z         }
2026-08-28T09:54:47.0113836Z       }
2026-08-28T09:54:47.0114104Z     },
2026-08-28T09:54:47.0114370Z     {
2026-08-28T09:54:47.0114704Z       "id": "REQ-IDLE-PARKED-DELIVERY",
2026-08-28T09:54:47.0121029Z       "title": "W5 (LIFECYCLE-TRUTH): a message QUEUED to an ALREADY-idle spt-hosted endpoint is delivered without an operator poke. ROOT (live during the milestone dispatch 2026-07-07): the idle-edge drain (F-023 leg 2) fires only on the ACTIVE->IDLE transition; no new edge ever comes for a parked session, and the send-time inject didn't carry it — both doyle->todlando dispatches sat delivered=0 in the spool while the endpoint showed ONLINE. FIX: send-time inject fires for an already-idle spt-hosted target (activity sense says idle => inject now, not spool), and/or a bounded spool sweep re-offers pending rows to idle endpoints (piggyback the pulse tick, no new loop). Int: send to a session idle for N minutes -> delivered without any operator poke.",
2026-08-28T09:54:47.0121368Z       "requiredStages": [
2026-08-28T09:54:47.0121644Z         "impl",
2026-08-28T09:54:47.0121910Z         "unit",
2026-08-28T09:54:47.0122177Z         "int"
2026-08-28T09:54:47.0122436Z       ],
2026-08-28T09:54:47.0122716Z       "stages": {
2026-08-28T09:54:47.0122984Z         "doc": {
2026-08-28T09:54:47.0123283Z           "complete": false,
2026-08-28T09:54:47.0123567Z           "evidence": []
2026-08-28T09:54:47.0123833Z         },
2026-08-28T09:54:47.0124105Z         "impl": {
2026-08-28T09:54:47.0124429Z           "complete": true,
2026-08-28T09:54:47.0124884Z           "evidence": [
2026-08-28T09:54:47.0125151Z             {
2026-08-28T09:54:47.0125532Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:47.0125819Z               "line": 108
2026-08-28T09:54:47.0126093Z             },
2026-08-28T09:54:47.0126386Z             {
2026-08-28T09:54:47.0126792Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:47.0127107Z               "line": 129
2026-08-28T09:54:47.0127398Z             },
2026-08-28T09:54:47.0127698Z             {
2026-08-28T09:54:47.0128094Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:47.0128409Z               "line": 213
2026-08-28T09:54:47.0128698Z             },
2026-08-28T09:54:47.0129078Z             {
2026-08-28T09:54:47.0129491Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0129801Z               "line": 263
2026-08-28T09:54:47.0130107Z             },
2026-08-28T09:54:47.0130403Z             {
2026-08-28T09:54:47.0130765Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0131079Z               "line": 11405
2026-08-28T09:54:47.0131374Z             }
2026-08-28T09:54:47.0131661Z           ]
2026-08-28T09:54:47.0131961Z         },
2026-08-28T09:54:47.0132261Z         "int": {
2026-08-28T09:54:47.0132586Z           "complete": true,
2026-08-28T09:54:47.0132901Z           "evidence": [
2026-08-28T09:54:47.0133187Z             {
2026-08-28T09:54:47.0133690Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.0133998Z               "line": 3150
2026-08-28T09:54:47.0134298Z             }
2026-08-28T09:54:47.0134585Z           ]
2026-08-28T09:54:47.0134876Z         },
2026-08-28T09:54:47.0135167Z         "unit": {
2026-08-28T09:54:47.0135495Z           "complete": true,
2026-08-28T09:54:47.0135810Z           "evidence": [
2026-08-28T09:54:47.0136106Z             {
2026-08-28T09:54:47.0136510Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:47.0136936Z               "line": 306
2026-08-28T09:54:47.0137242Z             }
2026-08-28T09:54:47.0137537Z           ]
2026-08-28T09:54:47.0137837Z         }
2026-08-28T09:54:47.0138138Z       }
2026-08-28T09:54:47.0138424Z     },
2026-08-28T09:54:47.0138719Z     {
2026-08-28T09:54:47.0142997Z       "id": "REQ-INBOUND-LINUX-HOST-FIREWALL-VERIFY",
2026-08-28T09:54:47.0153434Z       "title": "Linux inbound reachability is VERIFIED and rendered, never repaired: the daemon detects the active host firewall (ufw, nftables, firewalld), decides whether inbound UDP to the port it ACTUALLY bound is permitted, and renders the exact command an operator would run. Zero writes to the host firewall. The Linux sibling of REQ-INBOUND-WINDOWS-RULE-BINDER-PATH-MATCH, split on the platform axis and stopping short of repair for a stated reason: a durable rule needs a stable port and production binds ephemeral (BindScope::Port is test-scope only), so an auto-written rule would be stale at the next restart while reading repaired. Auto-repair is relocated to releases#54 behind the pinned-port decision, not dropped — see REQ-NET-PINNED-UDP-PORT. No detected firewall is not a pass: it is UNKNOWN unless the probe positively determined the port is reachable. Gate: doc — the install docs state the Linux posture (verify + tell, no writes) and name the command; impl — the bounded ufw/nft/firewalld probes and the decide seam over (firewall kind, ruleset, bound port); unit — an allowing ruleset passes, a blocking one fails carrying the rendered command, an absent/failed probe reads UNKNOWN.",
2026-08-28T09:54:47.0153805Z       "requiredStages": [
2026-08-28T09:54:47.0154077Z         "doc",
2026-08-28T09:54:47.0154350Z         "impl",
2026-08-28T09:54:47.0154632Z         "unit"
2026-08-28T09:54:47.0154901Z       ],
2026-08-28T09:54:47.0155165Z       "stages": {
2026-08-28T09:54:47.0155438Z         "doc": {
2026-08-28T09:54:47.0155724Z           "complete": true,
2026-08-28T09:54:47.0156038Z           "evidence": [
2026-08-28T09:54:47.0156311Z             {
2026-08-28T09:54:47.0156987Z               "path": "docs-site/src/networking/inbound-reachability.md",
2026-08-28T09:54:47.0157278Z               "line": 49
2026-08-28T09:54:47.0157532Z             }
2026-08-28T09:54:47.0157807Z           ]
2026-08-28T09:54:47.0158177Z         },
2026-08-28T09:54:47.0158453Z         "impl": {
2026-08-28T09:54:47.0158749Z           "complete": true,
2026-08-28T09:54:47.0159107Z           "evidence": [
2026-08-28T09:54:47.0159379Z             {
2026-08-28T09:54:47.0159760Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0160042Z               "line": 24
2026-08-28T09:54:47.0160301Z             },
2026-08-28T09:54:47.0160566Z             {
2026-08-28T09:54:47.0160943Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0161234Z               "line": 437
2026-08-28T09:54:47.0161501Z             },
2026-08-28T09:54:47.0161768Z             {
2026-08-28T09:54:47.0162154Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.0162436Z               "line": 1419
2026-08-28T09:54:47.0162703Z             },
2026-08-28T09:54:47.0162962Z             {
2026-08-28T09:54:47.0163351Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.0163632Z               "line": 458
2026-08-28T09:54:47.0163904Z             },
2026-08-28T09:54:47.0164171Z             {
2026-08-28T09:54:47.0164500Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0164791Z               "line": 13569
2026-08-28T09:54:47.0165057Z             }
2026-08-28T09:54:47.0165328Z           ]
2026-08-28T09:54:47.0165584Z         },
2026-08-28T09:54:47.0165856Z         "int": {
2026-08-28T09:54:47.0166151Z           "complete": false,
2026-08-28T09:54:47.0166438Z           "evidence": []
2026-08-28T09:54:47.0166704Z         },
2026-08-28T09:54:47.0166970Z         "unit": {
2026-08-28T09:54:47.0167266Z           "complete": true,
2026-08-28T09:54:47.0167687Z           "evidence": [
2026-08-28T09:54:47.0167953Z             {
2026-08-28T09:54:47.0168343Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0168631Z               "line": 861
2026-08-28T09:54:47.0168898Z             },
2026-08-28T09:54:47.0169256Z             {
2026-08-28T09:54:47.0169653Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0169939Z               "line": 882
2026-08-28T09:54:47.0170210Z             },
2026-08-28T09:54:47.0170463Z             {
2026-08-28T09:54:47.0170843Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0171126Z               "line": 893
2026-08-28T09:54:47.0171399Z             },
2026-08-28T09:54:47.0171661Z             {
2026-08-28T09:54:47.0172052Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0172333Z               "line": 907
2026-08-28T09:54:47.0172605Z             },
2026-08-28T09:54:47.0172873Z             {
2026-08-28T09:54:47.0173258Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0173554Z               "line": 942
2026-08-28T09:54:47.0173820Z             },
2026-08-28T09:54:47.0174087Z             {
2026-08-28T09:54:47.0174469Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0174755Z               "line": 962
2026-08-28T09:54:47.0175026Z             }
2026-08-28T09:54:47.0175288Z           ]
2026-08-28T09:54:47.0175550Z         }
2026-08-28T09:54:47.0175813Z       }
2026-08-28T09:54:47.0176079Z     },
2026-08-28T09:54:47.0176329Z     {
2026-08-28T09:54:47.0176712Z       "id": "REQ-INBOUND-PROVIDER-FIREWALL-DOCS",
2026-08-28T09:54:47.0183165Z       "title": "Provider-level firewalls (cloud vendor security groups — the DigitalOcean droplet case) are unreachable by any installer BY DESIGN, so inbound UDP for QUIC is a stated hosting REQUIREMENT in the public docs rather than something code pretends to fix. The docs leg exists because the failure is otherwise indistinguishable to the operator from the host-firewall classes REQ-INBOUND-WINDOWS-RULE-BINDER-PATH-MATCH and REQ-INBOUND-LINUX-HOST-FIREWALL-VERIFY cover: same silent NO_SEED_HOLDER symptom, a cause no local probe can see. Gate: doc — a public-docs section naming the inbound-UDP requirement, that it is the operator's to satisfy at the provider, and the symptom it produces when unsatisfied.",
2026-08-28T09:54:47.0183627Z       "requiredStages": [
2026-08-28T09:54:47.0183904Z         "doc"
2026-08-28T09:54:47.0184170Z       ],
2026-08-28T09:54:47.0184453Z       "stages": {
2026-08-28T09:54:47.0184729Z         "doc": {
2026-08-28T09:54:47.0185024Z           "complete": true,
2026-08-28T09:54:47.0185310Z           "evidence": [
2026-08-28T09:54:47.0185581Z             {
2026-08-28T09:54:47.0186072Z               "path": "docs-site/src/networking/inbound-reachability.md",
2026-08-28T09:54:47.0186355Z               "line": 80
2026-08-28T09:54:47.0186629Z             }
2026-08-28T09:54:47.0186904Z           ]
2026-08-28T09:54:47.0187194Z         },
2026-08-28T09:54:47.0187476Z         "impl": {
2026-08-28T09:54:47.0187795Z           "complete": false,
2026-08-28T09:54:47.0188086Z           "evidence": []
2026-08-28T09:54:47.0188349Z         },
2026-08-28T09:54:47.0188615Z         "int": {
2026-08-28T09:54:47.0188912Z           "complete": false,
2026-08-28T09:54:47.0189287Z           "evidence": []
2026-08-28T09:54:47.0189553Z         },
2026-08-28T09:54:47.0189829Z         "unit": {
2026-08-28T09:54:47.0190130Z           "complete": false,
2026-08-28T09:54:47.0190420Z           "evidence": []
2026-08-28T09:54:47.0190681Z         }
2026-08-28T09:54:47.0190944Z       }
2026-08-28T09:54:47.0191201Z     },
2026-08-28T09:54:47.0191459Z     {
2026-08-28T09:54:47.0191844Z       "id": "REQ-INBOUND-RECORD-WIRE-FIDELITY",
2026-08-28T09:54:47.0219814Z       "title": "THE INBOUND RECORD ROUND-TRIPS EVERY VERDICT VARIANT, AND THE PIN IS EXHAUSTIVE BY CONSTRUCTION RATHER THAN BY A LIST SOMEONE REMEMBERED TO EXTEND. `InboundRecord` carries `binder_pid` and `binder_path` and FLATTENS `InboundVerdict` beside them; the `PathMismatch` variant carried a `binder_path` of its OWN, so serializing it emitted a LITERAL DUPLICATE KEY, `read_current` failed the parse, and the reader fell closed to `Unknown` (releases#172; the duplicate confirmed in the on-disk record on HFENDULEAM 2026-08-06). The one verdict class the record exists to surface was STRUCTURALLY UNRENDERABLE: the file plainly said `path_mismatch` while `spt subnet status` said unknown, and the operator learned of the real mismatch only from a manual probe. IT STACKED WITH A SECOND DEFECT — the firewall rule genuinely WAS wrong — which is the shape that makes a self-erasing diagnostic expensive rather than merely untidy: the instrument went quiet in exactly the condition it was built to announce. THE COLLIDING FIELD IS RENAMED ON THE WIRE (`running_path`), NOT UN-FLATTENED: un-flattening would move every OTHER variant's shape too, for a defect that lives in one variant, and the flattened form is what every existing record on every node already carries. The variant keeps a path of its own rather than borrowing the envelope's, because `InboundVerdict::warning()` renders from the verdict ALONE and has no envelope in hand — a renderer that reached for one would be a second source for a field the record already owns. MIGRATION IS NOTHING, AND THAT IS DERIVED RATHER THAN HOPED: an old duplicate-key record already reads `Unknown`, which is the safe reading, and the next binder write replaces the file wholesale. The reader stays FAIL-CLOSED — an unparseable record is still `Unknown`, never a guess. WHY THE COVERAGE THAT EXISTED WAS GREEN THROUGHOUT: `REQ-INBOUND-VERDICT-RECORD-BINDER-PINNED`'s unit sentence says a live binder round-trips its verdict, and it was satisfied — by round-tripping the VARIANT, never the variant THROUGH THE ENVELOPE. The collision cannot exist until the two are composed, so every test that touched one half passed. The pin this requirement adds is therefore not another round-trip; it is a WILDCARD-FREE MATCH over the enum that stops the crate compiling until a newly added variant is placed in the table, plus one specimen per variant with EVERY field a distinct value (identical fillers would hide a field that round-trips to a sibling's value). Gate: doc — the published status-JSON field table and example in the inbound-reachability page, carrying the rename and the reason the old name was never emitted; impl — the renamed variant field and its producers and renderers moved with it, one name on the wire and one in the code; unit — every variant written through `write_to` and read back through `read_current_from` under a live-binder oracle, the variant tags asserted against WRITTEN-OUT LITERALS rather than counted, the failing set reported with the on-disk body so a red names which variant and what the record actually held, and the exhaustiveness carried by a match the compiler enforces.",
2026-08-28T09:54:47.0220564Z       "requiredStages": [
2026-08-28T09:54:47.0220846Z         "doc",
2026-08-28T09:54:47.0221134Z         "impl",
2026-08-28T09:54:47.0221422Z         "unit"
2026-08-28T09:54:47.0221699Z       ],
2026-08-28T09:54:47.0221976Z       "stages": {
2026-08-28T09:54:47.0222248Z         "doc": {
2026-08-28T09:54:47.0222543Z           "complete": true,
2026-08-28T09:54:47.0222830Z           "evidence": [
2026-08-28T09:54:47.0223102Z             {
2026-08-28T09:54:47.0223596Z               "path": "docs-site/src/networking/inbound-reachability.md",
2026-08-28T09:54:47.0223879Z               "line": 122
2026-08-28T09:54:47.0224157Z             }
2026-08-28T09:54:47.0224428Z           ]
2026-08-28T09:54:47.0224691Z         },
2026-08-28T09:54:47.0224973Z         "impl": {
2026-08-28T09:54:47.0225267Z           "complete": true,
2026-08-28T09:54:47.0225558Z           "evidence": [
2026-08-28T09:54:47.0225825Z             {
2026-08-28T09:54:47.0226265Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0226592Z               "line": 67
2026-08-28T09:54:47.0226950Z             }
2026-08-28T09:54:47.0227222Z           ]
2026-08-28T09:54:47.0227493Z         },
2026-08-28T09:54:47.0227764Z         "int": {
2026-08-28T09:54:47.0228060Z           "complete": false,
2026-08-28T09:54:47.0228356Z           "evidence": []
2026-08-28T09:54:47.0228618Z         },
2026-08-28T09:54:47.0228893Z         "unit": {
2026-08-28T09:54:47.0229287Z           "complete": true,
2026-08-28T09:54:47.0229574Z           "evidence": [
2026-08-28T09:54:47.0229836Z             {
2026-08-28T09:54:47.0230208Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0230494Z               "line": 343
2026-08-28T09:54:47.0230762Z             },
2026-08-28T09:54:47.0231029Z             {
2026-08-28T09:54:47.0231406Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0231699Z               "line": 358
2026-08-28T09:54:47.0231958Z             },
2026-08-28T09:54:47.0232226Z             {
2026-08-28T09:54:47.0232602Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0232893Z               "line": 382
2026-08-28T09:54:47.0233165Z             }
2026-08-28T09:54:47.0233428Z           ]
2026-08-28T09:54:47.0233696Z         }
2026-08-28T09:54:47.0233949Z       }
2026-08-28T09:54:47.0234218Z     },
2026-08-28T09:54:47.0234477Z     {
2026-08-28T09:54:47.0234898Z       "id": "REQ-INBOUND-VERDICT-RECORD-BINDER-PINNED",
2026-08-28T09:54:47.0250207Z       "title": "The inbound-reachability verdict is written by the process that BINDS the UDP socket (the daemon, at endpoint bringup) into a record every renderer reads, and that record is PINNED to the binder's identity — pid AND image path — with validity RE-DERIVED from the process table at read time: the recorded pid must still resolve to an image and that image must be the recorded one, or the record is discarded as UNKNOWN. The pin is the whole point — a daemon that restarted onto a new ephemeral port, or died before re-verifying, must not leave behind a verdict that still reads reachable, because a stale green is producible by exactly the fault the verdict exists to detect (KNOWN-HAZARDS 7.61). Image path is part of the identity because a pid alone is recyclable. The pin explicitly does NOT key on <spt_home>/daemon.pid: that breadcrumb is best-effort by contract and is written BEFORE the socket bind that arbitrates single-daemon-per-home, so a losing starter overwrites the winner's value on its way out (measured on HFENDULEAM 2026-07-31 — the file named a pid dead since startup while the real daemon served on another), and a verdict keyed to it would be discarded for the daemon that actually wrote it. Absent, corrupt, dead-binder and recycled-pid are the SAME answer: unknown, never fine. Only the binder writes; the CLI renders and never probes on its own, because only the binder knows both its own image path and the port it actually got. Gate: impl — the record type, the binder-side write at daemon bringup, the process-table-validated read; unit — a dead binder reads UNKNOWN not its recorded verdict, a live pid running a different image reads UNKNOWN, absent and corrupt read UNKNOWN, a live binder round-trips its verdict.",
2026-08-28T09:54:47.0250760Z       "requiredStages": [
2026-08-28T09:54:47.0251033Z         "impl",
2026-08-28T09:54:47.0251300Z         "unit"
2026-08-28T09:54:47.0251572Z       ],
2026-08-28T09:54:47.0251849Z       "stages": {
2026-08-28T09:54:47.0252120Z         "doc": {
2026-08-28T09:54:47.0252425Z           "complete": false,
2026-08-28T09:54:47.0252719Z           "evidence": []
2026-08-28T09:54:47.0252984Z         },
2026-08-28T09:54:47.0253261Z         "impl": {
2026-08-28T09:54:47.0253556Z           "complete": true,
2026-08-28T09:54:47.0253833Z           "evidence": [
2026-08-28T09:54:47.0254100Z             {
2026-08-28T09:54:47.0254486Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0254773Z               "line": 596
2026-08-28T09:54:47.0255035Z             },
2026-08-28T09:54:47.0255300Z             {
2026-08-28T09:54:47.0255665Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0256085Z               "line": 31
2026-08-28T09:54:47.0256367Z             }
2026-08-28T09:54:47.0256629Z           ]
2026-08-28T09:54:47.0256900Z         },
2026-08-28T09:54:47.0257167Z         "int": {
2026-08-28T09:54:47.0257462Z           "complete": false,
2026-08-28T09:54:47.0257748Z           "evidence": []
2026-08-28T09:54:47.0258017Z         },
2026-08-28T09:54:47.0258287Z         "unit": {
2026-08-28T09:54:47.0258588Z           "complete": true,
2026-08-28T09:54:47.0258873Z           "evidence": [
2026-08-28T09:54:47.0259255Z             {
2026-08-28T09:54:47.0259637Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0259918Z               "line": 228
2026-08-28T09:54:47.0260186Z             },
2026-08-28T09:54:47.0260450Z             {
2026-08-28T09:54:47.0260830Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0261111Z               "line": 248
2026-08-28T09:54:47.0261382Z             },
2026-08-28T09:54:47.0261659Z             {
2026-08-28T09:54:47.0262026Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0262312Z               "line": 262
2026-08-28T09:54:47.0262579Z             },
2026-08-28T09:54:47.0262847Z             {
2026-08-28T09:54:47.0263213Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0263502Z               "line": 285
2026-08-28T09:54:47.0263769Z             },
2026-08-28T09:54:47.0264041Z             {
2026-08-28T09:54:47.0264412Z               "path": "crates/spt-store/src/inbound.rs",
2026-08-28T09:54:47.0264694Z               "line": 306
2026-08-28T09:54:47.0264961Z             }
2026-08-28T09:54:47.0265223Z           ]
2026-08-28T09:54:47.0265489Z         }
2026-08-28T09:54:47.0265756Z       }
2026-08-28T09:54:47.0266017Z     },
2026-08-28T09:54:47.0266278Z     {
2026-08-28T09:54:47.0266631Z       "id": "REQ-INBOUND-VERDICT-SURFACED",
2026-08-28T09:54:47.0299394Z       "title": "The inbound-reachability verdict is carried on the MACHINE surface — `spt subnet status --json` — in EVERY state, present always and omitted never. THE SCOPE IS `--json` ONLY, and the HUMAN/MACHINE ASYMMETRY IS THE DESIGN RATHER THAN A GAP LEFT OPEN: the human surfaces (the coming-online banner, `spt subnet status`, its `--nodes` view) stay WARNING-ONLY by ratification — they render `InboundVerdict::warning()`, which is `None` for `Ok` AND for `Unknown`, so a verified-healthy node and an unsayable one both say nothing there, and that silence is deliberate. A reading view earns its lines: M8 decision 12 narrowed HINT_FOOTER out of `subnet status` on exactly that argument, and a line that says 'inbound is fine' on every healthy run is the noise that teaches an operator to stop reading the one run where it is not. A MACHINE READER HAS THE OPPOSITE NEED and it is not a matter of taste: a consumer that must distinguish verified-ok from cannot-say from blocked cannot do it by ABSENCE, because absence already means 'this reader is old' or 'this field was skipped', so a field that appears only when something is wrong makes the healthy state and the unimplemented state the same bytes. THREE CONSTRAINTS, ALL REQUIRED AT MINT AND ALL LOAD-BEARING. (a) THE FIELD RIDES BESIDE `peer_health_verdict` IN THE SAME PAYLOAD AND IS POPULATED IN EVERY ARM INCLUDING `Ok` AND `Unknown`, NEVER OMITTED — no `Option`, no `skip_serializing_if`. The `Ok` arm is the row a warning-only mindset forgets, and it is the row the whole requirement exists for. THE PAYLOAD HAS TWO EMIT SITES, not one — the membership view and the `--nodes` view both construct it — and BOTH carry the field, because a field that appears and disappears with an unrelated flag is a field no consumer can depend on. (b) THE STATES MIRROR THE STORE'S VERDICT VOCABULARY 1:1 AND NO NEW VOCABULARY IS INVENTED AT THE RENDER SITE. This is satisfied STRUCTURALLY rather than by a mapping function: `InboundVerdict` already derives `Serialize` with `serde(tag = \"verdict\", rename_all = \"snake_case\")`, so the store already publishes the wire spelling of its own states and the render site EMBEDS THE VERDICT rather than translating it. A token table in the CLI would be a second vocabulary that agrees with the first only until someone adds a variant — the drift class the surface table's single-source discipline exists to prevent — and it would also drop the `fix` command each non-`Ok` variant carries, which the store builds ONCE in the process that knows the real path and port and which a machine consumer would otherwise have to re-derive wrongly. (c) THE UNITS ASSERT, BY NAME: each state serializes to its documented value; the field is PRESENT IN THE `Ok` ARM; and the HUMAN PROSE IS UNCHANGED IN `Ok` AND `Unknown` — that last one is a characterization test guarding the docs-only half of this ruling, so a later change that starts printing an all-clear line on the reading view fails here rather than in the field. STATED CONSEQUENCE OF 'NEVER OMITTED', named so it is not later read as a leak: the human path computes its hint only when the daemon is running, while the `--json` arms read the verdict unconditionally. With the daemon down the binder pin resolves no live process and the read returns `Unknown` on its own, so daemon-down serializes as `unknown` with no special-casing and no vocabulary outside (b) — the machine surface says 'cannot say' in a state where the human surface deliberately says nothing at all. Gate: impl — the verdict field on the `subnet status --json` payload, populated unconditionally at BOTH emit sites; unit — every state serializes to its store-defined spelling, the field is present in the `Ok` arm and in the daemon-down `Unknown` arm, both emit sites agree, and the human render stays byte-identical under `Ok` and `Unknown`.",
2026-08-28T09:54:47.0300346Z       "requiredStages": [
2026-08-28T09:54:47.0300619Z         "doc",
2026-08-28T09:54:47.0300895Z         "impl",
2026-08-28T09:54:47.0301167Z         "unit"
2026-08-28T09:54:47.0301433Z       ],
2026-08-28T09:54:47.0301715Z       "stages": {
2026-08-28T09:54:47.0302005Z         "doc": {
2026-08-28T09:54:47.0302416Z           "complete": true,
2026-08-28T09:54:47.0302705Z           "evidence": [
2026-08-28T09:54:47.0302974Z             {
2026-08-28T09:54:47.0303476Z               "path": "docs-site/src/networking/inbound-reachability.md",
2026-08-28T09:54:47.0303757Z               "line": 96
2026-08-28T09:54:47.0304025Z             }
2026-08-28T09:54:47.0304281Z           ]
2026-08-28T09:54:47.0304548Z         },
2026-08-28T09:54:47.0304810Z         "impl": {
2026-08-28T09:54:47.0305130Z           "complete": true,
2026-08-28T09:54:47.0305411Z           "evidence": [
2026-08-28T09:54:47.0305677Z             {
2026-08-28T09:54:47.0306010Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0306295Z               "line": 13975
2026-08-28T09:54:47.0306562Z             },
2026-08-28T09:54:47.0306823Z             {
2026-08-28T09:54:47.0307158Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0307430Z               "line": 14166
2026-08-28T09:54:47.0307692Z             },
2026-08-28T09:54:47.0307955Z             {
2026-08-28T09:54:47.0308281Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0308562Z               "line": 14330
2026-08-28T09:54:47.0308829Z             }
2026-08-28T09:54:47.0309177Z           ]
2026-08-28T09:54:47.0309444Z         },
2026-08-28T09:54:47.0309715Z         "int": {
2026-08-28T09:54:47.0310010Z           "complete": false,
2026-08-28T09:54:47.0310302Z           "evidence": []
2026-08-28T09:54:47.0310568Z         },
2026-08-28T09:54:47.0310841Z         "unit": {
2026-08-28T09:54:47.0311131Z           "complete": true,
2026-08-28T09:54:47.0311427Z           "evidence": [
2026-08-28T09:54:47.0311694Z             {
2026-08-28T09:54:47.0312027Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0312313Z               "line": 35007
2026-08-28T09:54:47.0312580Z             },
2026-08-28T09:54:47.0312847Z             {
2026-08-28T09:54:47.0313170Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0313582Z               "line": 35068
2026-08-28T09:54:47.0313854Z             }
2026-08-28T09:54:47.0314116Z           ]
2026-08-28T09:54:47.0314394Z         }
2026-08-28T09:54:47.0314656Z       }
2026-08-28T09:54:47.0314928Z     },
2026-08-28T09:54:47.0315190Z     {
2026-08-28T09:54:47.0315628Z       "id": "REQ-INBOUND-WINDOWS-RULE-BINDER-PATH-MATCH",
2026-08-28T09:54:47.0329697Z       "title": "Windows inbound reachability is verified by PATH MATCH against the binder, not by rule name: the check passes only when the installer's program-scoped firewall rule names the executable of the resident daemon — the process that binds the QUIC/mDNS UDP socket — and the elevated repair rewrites the rule to THAT path. Supersedes the name-presence probe REQ-INSTALL-7 shipped, which a rule pointing at a moved or dev-build binary satisfies while inbound is blocked in fact (gap class 2). Measured on HFENDULEAM 2026-07-31: the rule names %LOCALAPPDATA%\\spt-core\\bin\\spt.exe and the resident daemon runs that same installed binary, so this host is a MATCH, not a live mismatch — the class is proven by construction (a program-scoped rule admits exactly one path) and by unit fixture, not by a field specimen. An earlier version of this title claimed the mismatch was live here; direct measurement refuted it. The authoritative binary is never the invoking CLI's argv[0]: a repair keyed to the caller would rewrite the rule onto whichever build happened to run the command. With no resident daemon the verdict is UNKNOWN — the check reports that it cannot say rather than guessing a path. Unelevated: report loudly with the exact command, write nothing. Gate: doc — KNOWN-HAZARDS/install docs state that the rule is verified against the binder's path; impl — the netsh verbose probe, the Program-line parse, the decide seam, the elevated repair; unit — path match passes, path mismatch fails with the rule's path in the verdict, a missing Program line and a failed probe both read UNKNOWN rather than either pass or fail.",
2026-08-28T09:54:47.0330097Z       "requiredStages": [
2026-08-28T09:54:47.0330506Z         "doc",
2026-08-28T09:54:47.0330783Z         "impl",
2026-08-28T09:54:47.0331045Z         "unit"
2026-08-28T09:54:47.0331322Z       ],
2026-08-28T09:54:47.0331599Z       "stages": {
2026-08-28T09:54:47.0331877Z         "doc": {
2026-08-28T09:54:47.0332169Z           "complete": true,
2026-08-28T09:54:47.0332456Z           "evidence": [
2026-08-28T09:54:47.0332731Z             {
2026-08-28T09:54:47.0333219Z               "path": "docs-site/src/networking/inbound-reachability.md",
2026-08-28T09:54:47.0333501Z               "line": 37
2026-08-28T09:54:47.0333763Z             }
2026-08-28T09:54:47.0334034Z           ]
2026-08-28T09:54:47.0334300Z         },
2026-08-28T09:54:47.0334575Z         "impl": {
2026-08-28T09:54:47.0334871Z           "complete": true,
2026-08-28T09:54:47.0335147Z           "evidence": [
2026-08-28T09:54:47.0335424Z             {
2026-08-28T09:54:47.0335814Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0336205Z               "line": 23
2026-08-28T09:54:47.0336481Z             },
2026-08-28T09:54:47.0336749Z             {
2026-08-28T09:54:47.0337139Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0337414Z               "line": 122
2026-08-28T09:54:47.0337685Z             },
2026-08-28T09:54:47.0337952Z             {
2026-08-28T09:54:47.0338286Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0338572Z               "line": 13568
2026-08-28T09:54:47.0338843Z             }
2026-08-28T09:54:47.0339197Z           ]
2026-08-28T09:54:47.0339468Z         },
2026-08-28T09:54:47.0339734Z         "int": {
2026-08-28T09:54:47.0340032Z           "complete": false,
2026-08-28T09:54:47.0340323Z           "evidence": []
2026-08-28T09:54:47.0340633Z         },
2026-08-28T09:54:47.0340905Z         "unit": {
2026-08-28T09:54:47.0341196Z           "complete": true,
2026-08-28T09:54:47.0341492Z           "evidence": [
2026-08-28T09:54:47.0341759Z             {
2026-08-28T09:54:47.0342146Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0342432Z               "line": 655
2026-08-28T09:54:47.0342706Z             },
2026-08-28T09:54:47.0342968Z             {
2026-08-28T09:54:47.0343354Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0343635Z               "line": 676
2026-08-28T09:54:47.0343912Z             },
2026-08-28T09:54:47.0344174Z             {
2026-08-28T09:54:47.0344561Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0344869Z               "line": 829
2026-08-28T09:54:47.0345130Z             },
2026-08-28T09:54:47.0345392Z             {
2026-08-28T09:54:47.0345778Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.0346069Z               "line": 850
2026-08-28T09:54:47.0346336Z             }
2026-08-28T09:54:47.0346613Z           ]
2026-08-28T09:54:47.0346870Z         }
2026-08-28T09:54:47.0347141Z       }
2026-08-28T09:54:47.0347419Z     },
2026-08-28T09:54:47.0347680Z     {
2026-08-28T09:54:47.0348120Z       "id": "REQ-INFRA-1",
2026-08-28T09:54:47.0348688Z       "title": "GitHub issue tracking for v1; tangled.org as migration target",
2026-08-28T09:54:47.0349089Z       "requiredStages": [],
2026-08-28T09:54:47.0349365Z       "stages": {
2026-08-28T09:54:47.0349632Z         "doc": {
2026-08-28T09:54:47.0349927Z           "complete": false,
2026-08-28T09:54:47.0350219Z           "evidence": []
2026-08-28T09:54:47.0350485Z         },
2026-08-28T09:54:47.0350749Z         "impl": {
2026-08-28T09:54:47.0351055Z           "complete": false,
2026-08-28T09:54:47.0351335Z           "evidence": []
2026-08-28T09:54:47.0351602Z         },
2026-08-28T09:54:47.0351865Z         "int": {
2026-08-28T09:54:47.0352171Z           "complete": false,
2026-08-28T09:54:47.0352456Z           "evidence": []
2026-08-28T09:54:47.0352725Z         },
2026-08-28T09:54:47.0353006Z         "unit": {
2026-08-28T09:54:47.0353294Z           "complete": false,
2026-08-28T09:54:47.0353580Z           "evidence": []
2026-08-28T09:54:47.0353848Z         }
2026-08-28T09:54:47.0354115Z       }
2026-08-28T09:54:47.0354368Z     },
2026-08-28T09:54:47.0354635Z     {
2026-08-28T09:54:47.0354988Z       "id": "REQ-INJECT-MULTILINE-INTEGRITY",
2026-08-28T09:54:47.0362530Z       "title": "W5 (LIFECYCLE-TRUTH): the idle-inject TYPED delivery leg delivers multi-line bodies byte-complete. ROOT (4 field instances + spool diff): the typed leg eats HEAD bytes nondeterministically — spool rows complete (1669B) vs ~322B received suffix; mid-turn poll envelopes always intact; a 1854B body later rode the same leg intact => timing race (terminal-readiness / enter-coalescing settle class), NOT a size cap. FIX DIRECTION (todlando proposes on the broker/translate typed-inject seam): settle-before-head, bracketed-paste where the harness supports it, or chunked write with echo-verify. STAKES: live-SENT injects leave NO spool copy — truncation there is unrecoverable. Int: repeated large multi-line injects into a real PTY session arrive byte-complete (loop N times — the race is timing-dependent, single-shot green is not proof).",
2026-08-28T09:54:47.0363002Z       "requiredStages": [
2026-08-28T09:54:47.0363276Z         "impl",
2026-08-28T09:54:47.0363542Z         "unit",
2026-08-28T09:54:47.0363811Z         "int"
2026-08-28T09:54:47.0364074Z       ],
2026-08-28T09:54:47.0364350Z       "stages": {
2026-08-28T09:54:47.0364613Z         "doc": {
2026-08-28T09:54:47.0364918Z           "complete": false,
2026-08-28T09:54:47.0365219Z           "evidence": []
2026-08-28T09:54:47.0365482Z         },
2026-08-28T09:54:47.0365758Z         "impl": {
2026-08-28T09:54:47.0366061Z           "complete": true,
2026-08-28T09:54:47.0366354Z           "evidence": [
2026-08-28T09:54:47.0366617Z             {
2026-08-28T09:54:47.0367002Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0367289Z               "line": 4544
2026-08-28T09:54:47.0367547Z             },
2026-08-28T09:54:47.0367833Z             {
2026-08-28T09:54:47.0368210Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0368514Z               "line": 4599
2026-08-28T09:54:47.0368777Z             },
2026-08-28T09:54:47.0369122Z             {
2026-08-28T09:54:47.0369494Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0369785Z               "line": 4630
2026-08-28T09:54:47.0370047Z             },
2026-08-28T09:54:47.0370314Z             {
2026-08-28T09:54:47.0370686Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0370973Z               "line": 4670
2026-08-28T09:54:47.0371245Z             },
2026-08-28T09:54:47.0371504Z             {
2026-08-28T09:54:47.0371884Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0372165Z               "line": 4738
2026-08-28T09:54:47.0372437Z             }
2026-08-28T09:54:47.0372704Z           ]
2026-08-28T09:54:47.0372976Z         },
2026-08-28T09:54:47.0373243Z         "int": {
2026-08-28T09:54:47.0373544Z           "complete": true,
2026-08-28T09:54:47.0373958Z           "evidence": [
2026-08-28T09:54:47.0374230Z             {
2026-08-28T09:54:47.0374700Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.0374982Z               "line": 3258
2026-08-28T09:54:47.0375282Z             },
2026-08-28T09:54:47.0375545Z             {
2026-08-28T09:54:47.0376004Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.0376289Z               "line": 3342
2026-08-28T09:54:47.0376560Z             }
2026-08-28T09:54:47.0376819Z           ]
2026-08-28T09:54:47.0377083Z         },
2026-08-28T09:54:47.0377359Z         "unit": {
2026-08-28T09:54:47.0377655Z           "complete": true,
2026-08-28T09:54:47.0377936Z           "evidence": [
2026-08-28T09:54:47.0378207Z             {
2026-08-28T09:54:47.0378580Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0378861Z               "line": 11382
2026-08-28T09:54:47.0379219Z             },
2026-08-28T09:54:47.0379488Z             {
2026-08-28T09:54:47.0379863Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0380154Z               "line": 11408
2026-08-28T09:54:47.0380416Z             },
2026-08-28T09:54:47.0380678Z             {
2026-08-28T09:54:47.0381046Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0381341Z               "line": 11430
2026-08-28T09:54:47.0381603Z             },
2026-08-28T09:54:47.0381867Z             {
2026-08-28T09:54:47.0382240Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0382521Z               "line": 11443
2026-08-28T09:54:47.0382788Z             },
2026-08-28T09:54:47.0383050Z             {
2026-08-28T09:54:47.0383427Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0383704Z               "line": 11468
2026-08-28T09:54:47.0383975Z             }
2026-08-28T09:54:47.0384242Z           ]
2026-08-28T09:54:47.0384614Z         }
2026-08-28T09:54:47.0384884Z       }
2026-08-28T09:54:47.0385189Z     },
2026-08-28T09:54:47.0385504Z     {
2026-08-28T09:54:47.0385886Z       "id": "REQ-INPUT-CONTROLLER-FENCE",
2026-08-28T09:54:47.0399332Z       "title": "RC-RENDER-TRUTH W2 (ADR-0044 decision 3, hertz same-machine --take split-brain RCA P0-C + scope clarification, doyle seam-verified broker.rs dispatch_input 3920-3935 session-addressed unfenced): broker-enforced input fencing SCOPED TO RC-ORIGIN INPUT — RC Input/Resize bind to the ACTIVE controller lease (or originating broker connection as the N-1 surrogate); commands from a displaced/stale lease are rejected/dropped after replacement. Do NOT globally gate generic KIND_INPUT: shell/system injection legitimately sends InputReq from non-controller connections (Minter::Shell, shellchan seam) — fence keys on an additive controller-ownership token validated only for token-bearing/Minter::Rc requests, or a dedicated guarded RC-input verb; token optional/default-none preserves generic injection exactly. REQUIRED DEFENSE, not optional hardening: this is what makes the at-most-one-input-capable-controller invariant TRUE even when the Displaced notification is delayed or lost (today the displaced window keeps typing into the PTY indefinitely — the field split-brain). Gate: impl — token/verb + lease-bound validation on the RC input path; unit — stale-lease RC input rejected post-replacement, active-lease applies, tokenless generic injection (shell) UNCHANGED, absent-lease N-1 falls back to connection fencing; int — hertz regression steps 5-6 (post-takeover Input+Resize from A mutate NOTHING, from B both apply) + shell injection still lands mid-controlled-session; doc — ADR-0044.",
2026-08-28T09:54:47.0399724Z       "requiredStages": [
2026-08-28T09:54:47.0400001Z         "doc",
2026-08-28T09:54:47.0400282Z         "impl",
2026-08-28T09:54:47.0400547Z         "unit",
2026-08-28T09:54:47.0400807Z         "int"
2026-08-28T09:54:47.0401070Z       ],
2026-08-28T09:54:47.0401347Z       "stages": {
2026-08-28T09:54:47.0401638Z         "doc": {
2026-08-28T09:54:47.0402095Z           "complete": true,
2026-08-28T09:54:47.0402380Z           "evidence": [
2026-08-28T09:54:47.0402658Z             {
2026-08-28T09:54:47.0403090Z               "path": "docs/adr/0044-controller-lease-truth.md",
2026-08-28T09:54:47.0403364Z               "line": 83
2026-08-28T09:54:47.0403632Z             }
2026-08-28T09:54:47.0403904Z           ]
2026-08-28T09:54:47.0404175Z         },
2026-08-28T09:54:47.0404446Z         "impl": {
2026-08-28T09:54:47.0404742Z           "complete": true,
2026-08-28T09:54:47.0405023Z           "evidence": [
2026-08-28T09:54:47.0405290Z             {
2026-08-28T09:54:47.0405672Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0405953Z               "line": 384
2026-08-28T09:54:47.0406225Z             },
2026-08-28T09:54:47.0406487Z             {
2026-08-28T09:54:47.0406863Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0407154Z               "line": 8363
2026-08-28T09:54:47.0407427Z             }
2026-08-28T09:54:47.0407694Z           ]
2026-08-28T09:54:47.0407955Z         },
2026-08-28T09:54:47.0408226Z         "int": {
2026-08-28T09:54:47.0408519Z           "complete": true,
2026-08-28T09:54:47.0408805Z           "evidence": [
2026-08-28T09:54:47.0409158Z             {
2026-08-28T09:54:47.0409607Z               "path": "crates/spt-daemon/tests/controller_lease.rs",
2026-08-28T09:54:47.0409888Z               "line": 452
2026-08-28T09:54:47.0410159Z             }
2026-08-28T09:54:47.0410426Z           ]
2026-08-28T09:54:47.0410694Z         },
2026-08-28T09:54:47.0410971Z         "unit": {
2026-08-28T09:54:47.0411260Z           "complete": true,
2026-08-28T09:54:47.0411544Z           "evidence": [
2026-08-28T09:54:47.0411810Z             {
2026-08-28T09:54:47.0412188Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0412503Z               "line": 10271
2026-08-28T09:54:47.0412769Z             },
2026-08-28T09:54:47.0413255Z             {
2026-08-28T09:54:47.0413631Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.0413924Z               "line": 10307
2026-08-28T09:54:47.0414187Z             }
2026-08-28T09:54:47.0414459Z           ]
2026-08-28T09:54:47.0414730Z         }
2026-08-28T09:54:47.0415001Z       }
2026-08-28T09:54:47.0415259Z     },
2026-08-28T09:54:47.0415527Z     {
2026-08-28T09:54:47.0415822Z       "id": "REQ-INST-1",
2026-08-28T09:54:47.0416310Z       "title": "endpoint ID vs instance split (adapter-agnostic ID)",
2026-08-28T09:54:47.0416622Z       "requiredStages": [],
2026-08-28T09:54:47.0416990Z       "stages": {
2026-08-28T09:54:47.0417276Z         "doc": {
2026-08-28T09:54:47.0417576Z           "complete": false,
2026-08-28T09:54:47.0417857Z           "evidence": []
2026-08-28T09:54:47.0418120Z         },
2026-08-28T09:54:47.0418396Z         "impl": {
2026-08-28T09:54:47.0418683Z           "complete": false,
2026-08-28T09:54:47.0419060Z           "evidence": []
2026-08-28T09:54:47.0419338Z         },
2026-08-28T09:54:47.0419600Z         "int": {
2026-08-28T09:54:47.0419905Z           "complete": false,
2026-08-28T09:54:47.0420187Z           "evidence": []
2026-08-28T09:54:47.0420457Z         },
2026-08-28T09:54:47.0420724Z         "unit": {
2026-08-28T09:54:47.0421016Z           "complete": false,
2026-08-28T09:54:47.0421296Z           "evidence": []
2026-08-28T09:54:47.0421564Z         }
2026-08-28T09:54:47.0421829Z       }
2026-08-28T09:54:47.0422090Z     },
2026-08-28T09:54:47.0422356Z     {
2026-08-28T09:54:47.0422647Z       "id": "REQ-INST-10",
2026-08-28T09:54:47.0423295Z       "title": "Qualified addressing [subnet:]id[@node] + ambiguity forces qualification",
2026-08-28T09:54:47.0423596Z       "requiredStages": [
2026-08-28T09:54:47.0423872Z         "impl",
2026-08-28T09:54:47.0424135Z         "unit"
2026-08-28T09:54:47.0424401Z       ],
2026-08-28T09:54:47.0424675Z       "stages": {
2026-08-28T09:54:47.0424937Z         "doc": {
2026-08-28T09:54:47.0425286Z           "complete": false,
2026-08-28T09:54:47.0425567Z           "evidence": []
2026-08-28T09:54:47.0425964Z         },
2026-08-28T09:54:47.0426240Z         "impl": {
2026-08-28T09:54:47.0426540Z           "complete": true,
2026-08-28T09:54:47.0426826Z           "evidence": [
2026-08-28T09:54:47.0427092Z             {
2026-08-28T09:54:47.0427492Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0427778Z               "line": 915
2026-08-28T09:54:47.0428050Z             },
2026-08-28T09:54:47.0428312Z             {
2026-08-28T09:54:47.0428694Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0429061Z               "line": 956
2026-08-28T09:54:47.0429327Z             },
2026-08-28T09:54:47.0429597Z             {
2026-08-28T09:54:47.0429978Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0430259Z               "line": 1005
2026-08-28T09:54:47.0430522Z             },
2026-08-28T09:54:47.0430794Z             {
2026-08-28T09:54:47.0431160Z               "path": "crates/spt-proto/src/addr.rs",
2026-08-28T09:54:47.0431443Z               "line": 13
2026-08-28T09:54:47.0431705Z             },
2026-08-28T09:54:47.0431972Z             {
2026-08-28T09:54:47.0432327Z               "path": "crates/spt-proto/src/addr.rs",
2026-08-28T09:54:47.0432606Z               "line": 67
2026-08-28T09:54:47.0432878Z             },
2026-08-28T09:54:47.0433136Z             {
2026-08-28T09:54:47.0433475Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0433751Z               "line": 18
2026-08-28T09:54:47.0434019Z             },
2026-08-28T09:54:47.0434281Z             {
2026-08-28T09:54:47.0434620Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0434909Z               "line": 1280
2026-08-28T09:54:47.0435168Z             }
2026-08-28T09:54:47.0435435Z           ]
2026-08-28T09:54:47.0435694Z         },
2026-08-28T09:54:47.0435965Z         "int": {
2026-08-28T09:54:47.0436261Z           "complete": false,
2026-08-28T09:54:47.0436666Z           "evidence": []
2026-08-28T09:54:47.0436938Z         },
2026-08-28T09:54:47.0437206Z         "unit": {
2026-08-28T09:54:47.0437506Z           "complete": true,
2026-08-28T09:54:47.0437790Z           "evidence": [
2026-08-28T09:54:47.0438057Z             {
2026-08-28T09:54:47.0438430Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0438715Z               "line": 1612
2026-08-28T09:54:47.0439074Z             },
2026-08-28T09:54:47.0439345Z             {
2026-08-28T09:54:47.0439723Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0440006Z               "line": 2084
2026-08-28T09:54:47.0440275Z             },
2026-08-28T09:54:47.0440538Z             {
2026-08-28T09:54:47.0440987Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0441263Z               "line": 2095
2026-08-28T09:54:47.0441544Z             },
2026-08-28T09:54:47.0441806Z             {
2026-08-28T09:54:47.0442192Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0442474Z               "line": 2111
2026-08-28T09:54:47.0442750Z             },
2026-08-28T09:54:47.0443015Z             {
2026-08-28T09:54:47.0443386Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0443668Z               "line": 2127
2026-08-28T09:54:47.0443930Z             },
2026-08-28T09:54:47.0444198Z             {
2026-08-28T09:54:47.0444569Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0444860Z               "line": 2149
2026-08-28T09:54:47.0445128Z             },
2026-08-28T09:54:47.0445383Z             {
2026-08-28T09:54:47.0445757Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0446038Z               "line": 2171
2026-08-28T09:54:47.0446310Z             },
2026-08-28T09:54:47.0446573Z             {
2026-08-28T09:54:47.0446958Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0447236Z               "line": 2194
2026-08-28T09:54:47.0447517Z             },
2026-08-28T09:54:47.0447927Z             {
2026-08-28T09:54:47.0448312Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0448593Z               "line": 2215
2026-08-28T09:54:47.0448860Z             },
2026-08-28T09:54:47.0449232Z             {
2026-08-28T09:54:47.0449605Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0449890Z               "line": 2572
2026-08-28T09:54:47.0450157Z             },
2026-08-28T09:54:47.0450419Z             {
2026-08-28T09:54:47.0450779Z               "path": "crates/spt-proto/src/addr.rs",
2026-08-28T09:54:47.0451055Z               "line": 130
2026-08-28T09:54:47.0451323Z             },
2026-08-28T09:54:47.0451581Z             {
2026-08-28T09:54:47.0451933Z               "path": "crates/spt-proto/src/addr.rs",
2026-08-28T09:54:47.0452215Z               "line": 167
2026-08-28T09:54:47.0452482Z             },
2026-08-28T09:54:47.0452738Z             {
2026-08-28T09:54:47.0453102Z               "path": "crates/spt-proto/src/addr.rs",
2026-08-28T09:54:47.0453390Z               "line": 175
2026-08-28T09:54:47.0453651Z             },
2026-08-28T09:54:47.0453913Z             {
2026-08-28T09:54:47.0454266Z               "path": "crates/spt-proto/src/addr.rs",
2026-08-28T09:54:47.0454548Z               "line": 183
2026-08-28T09:54:47.0454805Z             },
2026-08-28T09:54:47.0455078Z             {
2026-08-28T09:54:47.0455444Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0455731Z               "line": 2661
2026-08-28T09:54:47.0455995Z             }
2026-08-28T09:54:47.0456255Z           ]
2026-08-28T09:54:47.0456518Z         }
2026-08-28T09:54:47.0456776Z       }
2026-08-28T09:54:47.0457038Z     },
2026-08-28T09:54:47.0457296Z     {
2026-08-28T09:54:47.0457586Z       "id": "REQ-INST-11",
2026-08-28T09:54:47.0458245Z       "title": "spt rename <id> rippled to all instances (collision-checked, 6.5-reconciled)",
2026-08-28T09:54:47.0458540Z       "requiredStages": [
2026-08-28T09:54:47.0458929Z         "impl",
2026-08-28T09:54:47.0459283Z         "unit"
2026-08-28T09:54:47.0459550Z       ],
2026-08-28T09:54:47.0459821Z       "stages": {
2026-08-28T09:54:47.0460087Z         "doc": {
2026-08-28T09:54:47.0460384Z           "complete": false,
2026-08-28T09:54:47.0460708Z           "evidence": []
2026-08-28T09:54:47.0460979Z         },
2026-08-28T09:54:47.0461245Z         "impl": {
2026-08-28T09:54:47.0461544Z           "complete": true,
2026-08-28T09:54:47.0461831Z           "evidence": [
2026-08-28T09:54:47.0462093Z             {
2026-08-28T09:54:47.0462489Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0462770Z               "line": 761
2026-08-28T09:54:47.0463032Z             },
2026-08-28T09:54:47.0463303Z             {
2026-08-28T09:54:47.0463715Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.0463999Z               "line": 323
2026-08-28T09:54:47.0464268Z             },
2026-08-28T09:54:47.0464539Z             {
2026-08-28T09:54:47.0468834Z               "path": "crates/spt-store/src/rename.rs",
2026-08-28T09:54:47.0469257Z               "line": 59
2026-08-28T09:54:47.0469529Z             },
2026-08-28T09:54:47.0469848Z             {
2026-08-28T09:54:47.0470229Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0470525Z               "line": 15513
2026-08-28T09:54:47.0470872Z             },
2026-08-28T09:54:47.0471140Z             {
2026-08-28T09:54:47.0471474Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0471753Z               "line": 23575
2026-08-28T09:54:47.0472014Z             }
2026-08-28T09:54:47.0472275Z           ]
2026-08-28T09:54:47.0472538Z         },
2026-08-28T09:54:47.0472806Z         "int": {
2026-08-28T09:54:47.0473096Z           "complete": false,
2026-08-28T09:54:47.0473392Z           "evidence": []
2026-08-28T09:54:47.0473650Z         },
2026-08-28T09:54:47.0473922Z         "unit": {
2026-08-28T09:54:47.0474207Z           "complete": true,
2026-08-28T09:54:47.0474501Z           "evidence": [
2026-08-28T09:54:47.0474914Z             {
2026-08-28T09:54:47.0475305Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0475587Z               "line": 2323
2026-08-28T09:54:47.0475873Z             },
2026-08-28T09:54:47.0476139Z             {
2026-08-28T09:54:47.0476522Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0476799Z               "line": 2405
2026-08-28T09:54:47.0477067Z             },
2026-08-28T09:54:47.0477347Z             {
2026-08-28T09:54:47.0477738Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.0478024Z               "line": 653
2026-08-28T09:54:47.0478286Z             },
2026-08-28T09:54:47.0478573Z             {
2026-08-28T09:54:47.0479031Z               "path": "crates/spt-store/src/rename.rs",
2026-08-28T09:54:47.0479316Z               "line": 160
2026-08-28T09:54:47.0479598Z             },
2026-08-28T09:54:47.0479859Z             {
2026-08-28T09:54:47.0480217Z               "path": "crates/spt-store/src/rename.rs",
2026-08-28T09:54:47.0480503Z               "line": 190
2026-08-28T09:54:47.0480766Z             },
2026-08-28T09:54:47.0481028Z             {
2026-08-28T09:54:47.0481400Z               "path": "crates/spt-store/src/rename.rs",
2026-08-28T09:54:47.0481677Z               "line": 225
2026-08-28T09:54:47.0481934Z             },
2026-08-28T09:54:47.0482199Z             {
2026-08-28T09:54:47.0482521Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0482807Z               "line": 28994
2026-08-28T09:54:47.0483075Z             }
2026-08-28T09:54:47.0483341Z           ]
2026-08-28T09:54:47.0483609Z         }
2026-08-28T09:54:47.0483872Z       }
2026-08-28T09:54:47.0484138Z     },
2026-08-28T09:54:47.0484400Z     {
2026-08-28T09:54:47.0484696Z       "id": "REQ-INST-12",
2026-08-28T09:54:47.0485608Z       "title": "Endpoint visibility per-(endpoint,subnet): excluded semantics, OR-of-defaults + override, gates sync",
2026-08-28T09:54:47.0486022Z       "requiredStages": [
2026-08-28T09:54:47.0486294Z         "impl",
2026-08-28T09:54:47.0486566Z         "unit"
2026-08-28T09:54:47.0486834Z       ],
2026-08-28T09:54:47.0487223Z       "stages": {
2026-08-28T09:54:47.0487609Z         "doc": {
2026-08-28T09:54:47.0487907Z           "complete": false,
2026-08-28T09:54:47.0488198Z           "evidence": []
2026-08-28T09:54:47.0488456Z         },
2026-08-28T09:54:47.0488728Z         "impl": {
2026-08-28T09:54:47.0489194Z           "complete": true,
2026-08-28T09:54:47.0489481Z           "evidence": [
2026-08-28T09:54:47.0489748Z             {
2026-08-28T09:54:47.0490139Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0490419Z               "line": 825
2026-08-28T09:54:47.0490683Z             },
2026-08-28T09:54:47.0490963Z             {
2026-08-28T09:54:47.0491345Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0491626Z               "line": 926
2026-08-28T09:54:47.0491903Z             },
2026-08-28T09:54:47.0492170Z             {
2026-08-28T09:54:47.0492556Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0492836Z               "line": 1019
2026-08-28T09:54:47.0493105Z             },
2026-08-28T09:54:47.0493367Z             {
2026-08-28T09:54:47.0493729Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.0494001Z               "line": 164
2026-08-28T09:54:47.0494273Z             },
2026-08-28T09:54:47.0494531Z             {
2026-08-28T09:54:47.0494898Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.0495175Z               "line": 551
2026-08-28T09:54:47.0495433Z             },
2026-08-28T09:54:47.0495703Z             {
2026-08-28T09:54:47.0496078Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0496364Z               "line": 148
2026-08-28T09:54:47.0496625Z             },
2026-08-28T09:54:47.0496887Z             {
2026-08-28T09:54:47.0497231Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0497642Z               "line": 169
2026-08-28T09:54:47.0497904Z             }
2026-08-28T09:54:47.0498165Z           ]
2026-08-28T09:54:47.0498425Z         },
2026-08-28T09:54:47.0498683Z         "int": {
2026-08-28T09:54:47.0499078Z           "complete": false,
2026-08-28T09:54:47.0499360Z           "evidence": []
2026-08-28T09:54:47.0499636Z         },
2026-08-28T09:54:47.0499899Z         "unit": {
2026-08-28T09:54:47.0500190Z           "complete": true,
2026-08-28T09:54:47.0500481Z           "evidence": [
2026-08-28T09:54:47.0500742Z             {
2026-08-28T09:54:47.0501127Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0501408Z               "line": 2447
2026-08-28T09:54:47.0501675Z             },
2026-08-28T09:54:47.0501938Z             {
2026-08-28T09:54:47.0502319Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0502601Z               "line": 2470
2026-08-28T09:54:47.0502872Z             },
2026-08-28T09:54:47.0503140Z             {
2026-08-28T09:54:47.0503518Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0503805Z               "line": 2507
2026-08-28T09:54:47.0504071Z             },
2026-08-28T09:54:47.0504338Z             {
2026-08-28T09:54:47.0504696Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.0504987Z               "line": 984
2026-08-28T09:54:47.0505263Z             },
2026-08-28T09:54:47.0505525Z             {
2026-08-28T09:54:47.0505912Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0506196Z               "line": 185
2026-08-28T09:54:47.0506466Z             },
2026-08-28T09:54:47.0506728Z             {
2026-08-28T09:54:47.0507119Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0507400Z               "line": 206
2026-08-28T09:54:47.0507667Z             },
2026-08-28T09:54:47.0507935Z             {
2026-08-28T09:54:47.0508311Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0508715Z               "line": 232
2026-08-28T09:54:47.0509046Z             }
2026-08-28T09:54:47.0509319Z           ]
2026-08-28T09:54:47.0509581Z         }
2026-08-28T09:54:47.0509848Z       }
2026-08-28T09:54:47.0510106Z     },
2026-08-28T09:54:47.0510372Z     {
2026-08-28T09:54:47.0510668Z       "id": "REQ-INST-13",
2026-08-28T09:54:47.0511245Z       "title": "Subnet-exclusive sync + per-endpoint subnet-membership list",
2026-08-28T09:54:47.0511549Z       "requiredStages": [
2026-08-28T09:54:47.0511822Z         "impl",
2026-08-28T09:54:47.0512098Z         "unit"
2026-08-28T09:54:47.0512361Z       ],
2026-08-28T09:54:47.0512627Z       "stages": {
2026-08-28T09:54:47.0512893Z         "doc": {
2026-08-28T09:54:47.0513203Z           "complete": false,
2026-08-28T09:54:47.0513494Z           "evidence": []
2026-08-28T09:54:47.0513756Z         },
2026-08-28T09:54:47.0514032Z         "impl": {
2026-08-28T09:54:47.0514316Z           "complete": true,
2026-08-28T09:54:47.0514607Z           "evidence": [
2026-08-28T09:54:47.0514874Z             {
2026-08-28T09:54:47.0515233Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0515513Z               "line": 101
2026-08-28T09:54:47.0515785Z             },
2026-08-28T09:54:47.0516047Z             {
2026-08-28T09:54:47.0516433Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0516718Z               "line": 171
2026-08-28T09:54:47.0516978Z             }
2026-08-28T09:54:47.0517241Z           ]
2026-08-28T09:54:47.0517503Z         },
2026-08-28T09:54:47.0517765Z         "int": {
2026-08-28T09:54:47.0518056Z           "complete": false,
2026-08-28T09:54:47.0518341Z           "evidence": []
2026-08-28T09:54:47.0518609Z         },
2026-08-28T09:54:47.0518876Z         "unit": {
2026-08-28T09:54:47.0519252Z           "complete": true,
2026-08-28T09:54:47.0519531Z           "evidence": [
2026-08-28T09:54:47.0519794Z             {
2026-08-28T09:54:47.0520180Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0520588Z               "line": 261
2026-08-28T09:54:47.0520856Z             },
2026-08-28T09:54:47.0521118Z             {
2026-08-28T09:54:47.0521505Z               "path": "crates/spt-store/src/visibility.rs",
2026-08-28T09:54:47.0521785Z               "line": 279
2026-08-28T09:54:47.0522049Z             }
2026-08-28T09:54:47.0522310Z           ]
2026-08-28T09:54:47.0522572Z         }
2026-08-28T09:54:47.0522834Z       }
2026-08-28T09:54:47.0523096Z     },
2026-08-28T09:54:47.0523358Z     {
2026-08-28T09:54:47.0523654Z       "id": "REQ-INST-14",
2026-08-28T09:54:47.0524886Z       "title": "Resource advertisement (subnet resource registry): free-text blurb, both-authored, registry projection, visibility/whitelist-gated",
2026-08-28T09:54:47.0525182Z       "requiredStages": [
2026-08-28T09:54:47.0525449Z         "doc",
2026-08-28T09:54:47.0525715Z         "impl",
2026-08-28T09:54:47.0525982Z         "unit"
2026-08-28T09:54:47.0526255Z       ],
2026-08-28T09:54:47.0526530Z       "stages": {
2026-08-28T09:54:47.0526794Z         "doc": {
2026-08-28T09:54:47.0527085Z           "complete": true,
2026-08-28T09:54:47.0527369Z           "evidence": [
2026-08-28T09:54:47.0527628Z             {
2026-08-28T09:54:47.0527934Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.0528215Z               "line": 793
2026-08-28T09:54:47.0528478Z             },
2026-08-28T09:54:47.0528736Z             {
2026-08-28T09:54:47.0529126Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.0529403Z               "line": 89
2026-08-28T09:54:47.0529666Z             }
2026-08-28T09:54:47.0529935Z           ]
2026-08-28T09:54:47.0530195Z         },
2026-08-28T09:54:47.0530467Z         "impl": {
2026-08-28T09:54:47.0530749Z           "complete": true,
2026-08-28T09:54:47.0531040Z           "evidence": [
2026-08-28T09:54:47.0531302Z             {
2026-08-28T09:54:47.0531707Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0532117Z               "line": 548
2026-08-28T09:54:47.0532385Z             },
2026-08-28T09:54:47.0532655Z             {
2026-08-28T09:54:47.0533031Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0533318Z               "line": 589
2026-08-28T09:54:47.0533575Z             },
2026-08-28T09:54:47.0533848Z             {
2026-08-28T09:54:47.0534191Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.0534473Z               "line": 657
2026-08-28T09:54:47.0534740Z             },
2026-08-28T09:54:47.0535004Z             {
2026-08-28T09:54:47.0535331Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0535608Z               "line": 5285
2026-08-28T09:54:47.0535889Z             }
2026-08-28T09:54:47.0536152Z           ]
2026-08-28T09:54:47.0536419Z         },
2026-08-28T09:54:47.0536677Z         "int": {
2026-08-28T09:54:47.0536968Z           "complete": false,
2026-08-28T09:54:47.0537253Z           "evidence": []
2026-08-28T09:54:47.0537520Z         },
2026-08-28T09:54:47.0537786Z         "unit": {
2026-08-28T09:54:47.0538080Z           "complete": true,
2026-08-28T09:54:47.0538366Z           "evidence": [
2026-08-28T09:54:47.0538624Z             {
2026-08-28T09:54:47.0539123Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0539405Z               "line": 1732
2026-08-28T09:54:47.0539677Z             },
2026-08-28T09:54:47.0539949Z             {
2026-08-28T09:54:47.0540325Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0540614Z               "line": 1624
2026-08-28T09:54:47.0540938Z             },
2026-08-28T09:54:47.0541209Z             {
2026-08-28T09:54:47.0541576Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0541862Z               "line": 1903
2026-08-28T09:54:47.0542135Z             },
2026-08-28T09:54:47.0542401Z             {
2026-08-28T09:54:47.0542755Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.0543031Z               "line": 1538
2026-08-28T09:54:47.0543305Z             },
2026-08-28T09:54:47.0543687Z             {
2026-08-28T09:54:47.0544017Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0544298Z               "line": 29067
2026-08-28T09:54:47.0544564Z             }
2026-08-28T09:54:47.0544832Z           ]
2026-08-28T09:54:47.0545099Z         }
2026-08-28T09:54:47.0545381Z       }
2026-08-28T09:54:47.0545641Z     },
2026-08-28T09:54:47.0545910Z     {
2026-08-28T09:54:47.0546196Z       "id": "REQ-INST-15",
2026-08-28T09:54:47.0548450Z       "title": "Immutable home subnet (assigned at creation: auto-if-one/ask-if-many) + spt fork (cross-subnet clone to a new identity, copy-then-diverge, not re-home); adapter chosen at creation from registered hostable adapters, changed only via launch/resume-under-new (ADR-0010)",
2026-08-28T09:54:47.0548772Z       "requiredStages": [
2026-08-28T09:54:47.0549136Z         "doc",
2026-08-28T09:54:47.0549416Z         "impl",
2026-08-28T09:54:47.0549702Z         "unit"
2026-08-28T09:54:47.0549974Z       ],
2026-08-28T09:54:47.0550246Z       "stages": {
2026-08-28T09:54:47.0550514Z         "doc": {
2026-08-28T09:54:47.0550806Z           "complete": true,
2026-08-28T09:54:47.0551070Z           "evidence": [
2026-08-28T09:54:47.0551320Z             {
2026-08-28T09:54:47.0551846Z               "path": "docs/adr/0010-immutable-home-subnet-fork-not-rehome.md",
2026-08-28T09:54:47.0552146Z               "line": 11
2026-08-28T09:54:47.0552408Z             }
2026-08-28T09:54:47.0552676Z           ]
2026-08-28T09:54:47.0552932Z         },
2026-08-28T09:54:47.0553204Z         "impl": {
2026-08-28T09:54:47.0553495Z           "complete": true,
2026-08-28T09:54:47.0553780Z           "evidence": [
2026-08-28T09:54:47.0554039Z             {
2026-08-28T09:54:47.0554438Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0554725Z               "line": 474
2026-08-28T09:54:47.0554992Z             },
2026-08-28T09:54:47.0555259Z             {
2026-08-28T09:54:47.0555711Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.0555997Z               "line": 60
2026-08-28T09:54:47.0556263Z             },
2026-08-28T09:54:47.0556533Z             {
2026-08-28T09:54:47.0556924Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.0557220Z               "line": 469
2026-08-28T09:54:47.0557492Z             },
2026-08-28T09:54:47.0557753Z             {
2026-08-28T09:54:47.0558145Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.0558427Z               "line": 536
2026-08-28T09:54:47.0558694Z             },
2026-08-28T09:54:47.0559049Z             {
2026-08-28T09:54:47.0559409Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0559696Z               "line": 19
2026-08-28T09:54:47.0559962Z             },
2026-08-28T09:54:47.0560229Z             {
2026-08-28T09:54:47.0560573Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0560854Z               "line": 70
2026-08-28T09:54:47.0561125Z             },
2026-08-28T09:54:47.0561399Z             {
2026-08-28T09:54:47.0561748Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0562034Z               "line": 135
2026-08-28T09:54:47.0562302Z             },
2026-08-28T09:54:47.0562563Z             {
2026-08-28T09:54:47.0562921Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0563197Z               "line": 175
2026-08-28T09:54:47.0563469Z             },
2026-08-28T09:54:47.0563731Z             {
2026-08-28T09:54:47.0564084Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0564364Z               "line": 240
2026-08-28T09:54:47.0564632Z             },
2026-08-28T09:54:47.0564894Z             {
2026-08-28T09:54:47.0565256Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.0565533Z               "line": 529
2026-08-28T09:54:47.0565800Z             },
2026-08-28T09:54:47.0566072Z             {
2026-08-28T09:54:47.0566386Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0566790Z               "line": 5162
2026-08-28T09:54:47.0567055Z             }
2026-08-28T09:54:47.0567351Z           ]
2026-08-28T09:54:47.0567612Z         },
2026-08-28T09:54:47.0567884Z         "int": {
2026-08-28T09:54:47.0568176Z           "complete": false,
2026-08-28T09:54:47.0568471Z           "evidence": []
2026-08-28T09:54:47.0568734Z         },
2026-08-28T09:54:47.0569068Z         "unit": {
2026-08-28T09:54:47.0569354Z           "complete": true,
2026-08-28T09:54:47.0569634Z           "evidence": [
2026-08-28T09:54:47.0569898Z             {
2026-08-28T09:54:47.0570290Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.0570561Z               "line": 703
2026-08-28T09:54:47.0570832Z             },
2026-08-28T09:54:47.0571128Z             {
2026-08-28T09:54:47.0571520Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.0571801Z               "line": 899
2026-08-28T09:54:47.0572071Z             },
2026-08-28T09:54:47.0572337Z             {
2026-08-28T09:54:47.0572689Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0572971Z               "line": 299
2026-08-28T09:54:47.0573238Z             },
2026-08-28T09:54:47.0573496Z             {
2026-08-28T09:54:47.0573849Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0574125Z               "line": 335
2026-08-28T09:54:47.0574392Z             },
2026-08-28T09:54:47.0574658Z             {
2026-08-28T09:54:47.0575005Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0575286Z               "line": 348
2026-08-28T09:54:47.0575549Z             },
2026-08-28T09:54:47.0575811Z             {
2026-08-28T09:54:47.0576154Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.0576436Z               "line": 490
2026-08-28T09:54:47.0576699Z             },
2026-08-28T09:54:47.0576966Z             {
2026-08-28T09:54:47.0577322Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.0577716Z               "line": 1911
2026-08-28T09:54:47.0577987Z             },
2026-08-28T09:54:47.0578249Z             {
2026-08-28T09:54:47.0578579Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0578869Z               "line": 29007
2026-08-28T09:54:47.0579218Z             },
2026-08-28T09:54:47.0579479Z             {
2026-08-28T09:54:47.0579809Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0580098Z               "line": 33401
2026-08-28T09:54:47.0580358Z             }
2026-08-28T09:54:47.0580626Z           ]
2026-08-28T09:54:47.0580888Z         }
2026-08-28T09:54:47.0581151Z       }
2026-08-28T09:54:47.0581412Z     },
2026-08-28T09:54:47.0581674Z     {
2026-08-28T09:54:47.0581960Z       "id": "REQ-INST-2",
2026-08-28T09:54:47.0582332Z       "title": "Per-node files, synced Psyche mind",
2026-08-28T09:54:47.0582641Z       "requiredStages": [
2026-08-28T09:54:47.0582906Z         "impl",
2026-08-28T09:54:47.0583179Z         "unit"
2026-08-28T09:54:47.0583441Z       ],
2026-08-28T09:54:47.0583722Z       "stages": {
2026-08-28T09:54:47.0583983Z         "doc": {
2026-08-28T09:54:47.0584289Z           "complete": false,
2026-08-28T09:54:47.0584579Z           "evidence": []
2026-08-28T09:54:47.0584847Z         },
2026-08-28T09:54:47.0585123Z         "impl": {
2026-08-28T09:54:47.0585410Z           "complete": true,
2026-08-28T09:54:47.0585695Z           "evidence": [
2026-08-28T09:54:47.0585961Z             {
2026-08-28T09:54:47.0586315Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.0586586Z               "line": 28
2026-08-28T09:54:47.0586862Z             },
2026-08-28T09:54:47.0587120Z             {
2026-08-28T09:54:47.0587478Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.0587767Z               "line": 160
2026-08-28T09:54:47.0588027Z             },
2026-08-28T09:54:47.0588291Z             {
2026-08-28T09:54:47.0588643Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.0588929Z               "line": 182
2026-08-28T09:54:47.0589391Z             },
2026-08-28T09:54:47.0589663Z             {
2026-08-28T09:54:47.0590020Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.0590307Z               "line": 158
2026-08-28T09:54:47.0590568Z             },
2026-08-28T09:54:47.0590834Z             {
2026-08-28T09:54:47.0591200Z               "path": "crates/spt-live/src/signoff.rs",
2026-08-28T09:54:47.0591477Z               "line": 118
2026-08-28T09:54:47.0591749Z             }
2026-08-28T09:54:47.0592015Z           ]
2026-08-28T09:54:47.0592287Z         },
2026-08-28T09:54:47.0592559Z         "int": {
2026-08-28T09:54:47.0592864Z           "complete": false,
2026-08-28T09:54:47.0593154Z           "evidence": []
2026-08-28T09:54:47.0593415Z         },
2026-08-28T09:54:47.0593686Z         "unit": {
2026-08-28T09:54:47.0593977Z           "complete": true,
2026-08-28T09:54:47.0594258Z           "evidence": [
2026-08-28T09:54:47.0594534Z             {
2026-08-28T09:54:47.0594907Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.0595192Z               "line": 575
2026-08-28T09:54:47.0595468Z             },
2026-08-28T09:54:47.0595741Z             {
2026-08-28T09:54:47.0596092Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.0596369Z               "line": 302
2026-08-28T09:54:47.0596627Z             }
2026-08-28T09:54:47.0596890Z           ]
2026-08-28T09:54:47.0597147Z         }
2026-08-28T09:54:47.0597422Z       }
2026-08-28T09:54:47.0597680Z     },
2026-08-28T09:54:47.0597942Z     {
2026-08-28T09:54:47.0598238Z       "id": "REQ-INST-3",
2026-08-28T09:54:47.0598682Z       "title": "Dormant (warm) / suspended (cold) resting states",
2026-08-28T09:54:47.0599074Z       "requiredStages": [
2026-08-28T09:54:47.0599340Z         "doc",
2026-08-28T09:54:47.0599607Z         "impl",
2026-08-28T09:54:47.0599870Z         "unit"
2026-08-28T09:54:47.0600142Z       ],
2026-08-28T09:54:47.0600519Z       "stages": {
2026-08-28T09:54:47.0600794Z         "doc": {
2026-08-28T09:54:47.0601095Z           "complete": true,
2026-08-28T09:54:47.0601376Z           "evidence": [
2026-08-28T09:54:47.0601641Z             {
2026-08-28T09:54:47.0601985Z               "path": "docs/DORMANCY-BUDGET.md",
2026-08-28T09:54:47.0602261Z               "line": 3
2026-08-28T09:54:47.0602522Z             }
2026-08-28T09:54:47.0602794Z           ]
2026-08-28T09:54:47.0603056Z         },
2026-08-28T09:54:47.0603333Z         "impl": {
2026-08-28T09:54:47.0603625Z           "complete": true,
2026-08-28T09:54:47.0603900Z           "evidence": [
2026-08-28T09:54:47.0604164Z             {
2026-08-28T09:54:47.0604532Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.0604813Z               "line": 124
2026-08-28T09:54:47.0605074Z             },
2026-08-28T09:54:47.0605342Z             {
2026-08-28T09:54:47.0605757Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.0606043Z               "line": 1335
2026-08-28T09:54:47.0606315Z             },
2026-08-28T09:54:47.0606586Z             {
2026-08-28T09:54:47.0606952Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0607230Z               "line": 877
2026-08-28T09:54:47.0607492Z             },
2026-08-28T09:54:47.0607750Z             {
2026-08-28T09:54:47.0608145Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0608432Z               "line": 1164
2026-08-28T09:54:47.0608709Z             },
2026-08-28T09:54:47.0609050Z             {
2026-08-28T09:54:47.0609430Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0609715Z               "line": 1200
2026-08-28T09:54:47.0609983Z             },
2026-08-28T09:54:47.0610245Z             {
2026-08-28T09:54:47.0610622Z               "path": "crates/spt-daemon/src/pump/sync.rs",
2026-08-28T09:54:47.0610903Z               "line": 75
2026-08-28T09:54:47.0611179Z             },
2026-08-28T09:54:47.0611436Z             {
2026-08-28T09:54:47.0611850Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0612244Z               "line": 255
2026-08-28T09:54:47.0612511Z             },
2026-08-28T09:54:47.0612777Z             {
2026-08-28T09:54:47.0613179Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0613465Z               "line": 542
2026-08-28T09:54:47.0613731Z             },
2026-08-28T09:54:47.0614003Z             {
2026-08-28T09:54:47.0614436Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0614725Z               "line": 998
2026-08-28T09:54:47.0614986Z             },
2026-08-28T09:54:47.0615253Z             {
2026-08-28T09:54:47.0615635Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0615916Z               "line": 45
2026-08-28T09:54:47.0616179Z             },
2026-08-28T09:54:47.0616446Z             {
2026-08-28T09:54:47.0617015Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0617337Z               "line": 132
2026-08-28T09:54:47.0617618Z             },
2026-08-28T09:54:47.0617875Z             {
2026-08-28T09:54:47.0618262Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0618543Z               "line": 170
2026-08-28T09:54:47.0618824Z             },
2026-08-28T09:54:47.0619173Z             {
2026-08-28T09:54:47.0619534Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0619817Z               "line": 186
2026-08-28T09:54:47.0620074Z             },
2026-08-28T09:54:47.0620342Z             {
2026-08-28T09:54:47.0620723Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0621005Z               "line": 196
2026-08-28T09:54:47.0621267Z             },
2026-08-28T09:54:47.0621530Z             {
2026-08-28T09:54:47.0621906Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0622179Z               "line": 257
2026-08-28T09:54:47.0622448Z             },
2026-08-28T09:54:47.0622847Z             {
2026-08-28T09:54:47.0623229Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0623515Z               "line": 377
2026-08-28T09:54:47.0623782Z             },
2026-08-28T09:54:47.0624040Z             {
2026-08-28T09:54:47.0624426Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0624717Z               "line": 401
2026-08-28T09:54:47.0624986Z             },
2026-08-28T09:54:47.0625250Z             {
2026-08-28T09:54:47.0625628Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0625914Z               "line": 495
2026-08-28T09:54:47.0626176Z             },
2026-08-28T09:54:47.0626439Z             {
2026-08-28T09:54:47.0626801Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0627082Z               "line": 544
2026-08-28T09:54:47.0627349Z             },
2026-08-28T09:54:47.0627613Z             {
2026-08-28T09:54:47.0627988Z               "path": "crates/spt-daemon/tests/budget.rs",
2026-08-28T09:54:47.0628274Z               "line": 37
2026-08-28T09:54:47.0628550Z             },
2026-08-28T09:54:47.0628808Z             {
2026-08-28T09:54:47.0629393Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0629680Z               "line": 62
2026-08-28T09:54:47.0629942Z             },
2026-08-28T09:54:47.0630221Z             {
2026-08-28T09:54:47.0630564Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.0630841Z               "line": 495
2026-08-28T09:54:47.0631098Z             },
2026-08-28T09:54:47.0631375Z             {
2026-08-28T09:54:47.0631723Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0632004Z               "line": 7501
2026-08-28T09:54:47.0632275Z             }
2026-08-28T09:54:47.0632533Z           ]
2026-08-28T09:54:47.0632800Z         },
2026-08-28T09:54:47.0633056Z         "int": {
2026-08-28T09:54:47.0633355Z           "complete": false,
2026-08-28T09:54:47.0633636Z           "evidence": []
2026-08-28T09:54:47.0633903Z         },
2026-08-28T09:54:47.0634169Z         "unit": {
2026-08-28T09:54:47.0634586Z           "complete": true,
2026-08-28T09:54:47.0634871Z           "evidence": [
2026-08-28T09:54:47.0635133Z             {
2026-08-28T09:54:47.0635683Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:47.0635950Z               "line": 466
2026-08-28T09:54:47.0636223Z             },
2026-08-28T09:54:47.0636494Z             {
2026-08-28T09:54:47.0636909Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0637191Z               "line": 3659
2026-08-28T09:54:47.0637462Z             },
2026-08-28T09:54:47.0637728Z             {
2026-08-28T09:54:47.0638111Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0638405Z               "line": 3716
2026-08-28T09:54:47.0638671Z             },
2026-08-28T09:54:47.0638938Z             {
2026-08-28T09:54:47.0639402Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.0639697Z               "line": 1737
2026-08-28T09:54:47.0639968Z             },
2026-08-28T09:54:47.0640235Z             {
2026-08-28T09:54:47.0640615Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.0640990Z               "line": 1862
2026-08-28T09:54:47.0641257Z             },
2026-08-28T09:54:47.0641543Z             {
2026-08-28T09:54:47.0641950Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0642230Z               "line": 1906
2026-08-28T09:54:47.0642515Z             },
2026-08-28T09:54:47.0642783Z             {
2026-08-28T09:54:47.0643185Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0643473Z               "line": 2149
2026-08-28T09:54:47.0643734Z             },
2026-08-28T09:54:47.0644001Z             {
2026-08-28T09:54:47.0644372Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0644659Z               "line": 722
2026-08-28T09:54:47.0644921Z             },
2026-08-28T09:54:47.0645321Z             {
2026-08-28T09:54:47.0645727Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0646012Z               "line": 758
2026-08-28T09:54:47.0646281Z             },
2026-08-28T09:54:47.0646545Z             {
2026-08-28T09:54:47.0646929Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0647207Z               "line": 813
2026-08-28T09:54:47.0647474Z             },
2026-08-28T09:54:47.0647741Z             {
2026-08-28T09:54:47.0648113Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0648400Z               "line": 1147
2026-08-28T09:54:47.0648662Z             },
2026-08-28T09:54:47.0648935Z             {
2026-08-28T09:54:47.0649451Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0649737Z               "line": 1394
2026-08-28T09:54:47.0650005Z             },
2026-08-28T09:54:47.0650272Z             {
2026-08-28T09:54:47.0650649Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0650940Z               "line": 1408
2026-08-28T09:54:47.0651214Z             },
2026-08-28T09:54:47.0651473Z             {
2026-08-28T09:54:47.0651841Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0652131Z               "line": 2065
2026-08-28T09:54:47.0652399Z             },
2026-08-28T09:54:47.0652666Z             {
2026-08-28T09:54:47.0653019Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.0653305Z               "line": 1306
2026-08-28T09:54:47.0653567Z             },
2026-08-28T09:54:47.0653831Z             {
2026-08-28T09:54:47.0654157Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0654442Z               "line": 29031
2026-08-28T09:54:47.0654703Z             }
2026-08-28T09:54:47.0654970Z           ]
2026-08-28T09:54:47.0655266Z         }
2026-08-28T09:54:47.0655533Z       }
2026-08-28T09:54:47.0655810Z     },
2026-08-28T09:54:47.0656063Z     {
2026-08-28T09:54:47.0656360Z       "id": "REQ-INST-4",
2026-08-28T09:54:47.0656922Z       "title": "active to dormant/suspended fires a transition echo commune",
2026-08-28T09:54:47.0657338Z       "requiredStages": [
2026-08-28T09:54:47.0657609Z         "impl",
2026-08-28T09:54:47.0657880Z         "unit"
2026-08-28T09:54:47.0658134Z       ],
2026-08-28T09:54:47.0658405Z       "stages": {
2026-08-28T09:54:47.0658677Z         "doc": {
2026-08-28T09:54:47.0659062Z           "complete": false,
2026-08-28T09:54:47.0659377Z           "evidence": []
2026-08-28T09:54:47.0659635Z         },
2026-08-28T09:54:47.0659907Z         "impl": {
2026-08-28T09:54:47.0660198Z           "complete": true,
2026-08-28T09:54:47.0660483Z           "evidence": [
2026-08-28T09:54:47.0660745Z             {
2026-08-28T09:54:47.0661133Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0661418Z               "line": 1165
2026-08-28T09:54:47.0661684Z             },
2026-08-28T09:54:47.0661948Z             {
2026-08-28T09:54:47.0662330Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0662620Z               "line": 249
2026-08-28T09:54:47.0662884Z             },
2026-08-28T09:54:47.0663155Z             {
2026-08-28T09:54:47.0663532Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0663812Z               "line": 324
2026-08-28T09:54:47.0664086Z             },
2026-08-28T09:54:47.0664353Z             {
2026-08-28T09:54:47.0664727Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0665002Z               "line": 364
2026-08-28T09:54:47.0665273Z             }
2026-08-28T09:54:47.0665540Z           ]
2026-08-28T09:54:47.0665812Z         },
2026-08-28T09:54:47.0666074Z         "int": {
2026-08-28T09:54:47.0666375Z           "complete": false,
2026-08-28T09:54:47.0666666Z           "evidence": []
2026-08-28T09:54:47.0666930Z         },
2026-08-28T09:54:47.0667203Z         "unit": {
2026-08-28T09:54:47.0667496Z           "complete": true,
2026-08-28T09:54:47.0667777Z           "evidence": [
2026-08-28T09:54:47.0668155Z             {
2026-08-28T09:54:47.0671974Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0672296Z               "line": 3711
2026-08-28T09:54:47.0672556Z             },
2026-08-28T09:54:47.0672824Z             {
2026-08-28T09:54:47.0673209Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0673491Z               "line": 834
2026-08-28T09:54:47.0673753Z             },
2026-08-28T09:54:47.0674016Z             {
2026-08-28T09:54:47.0674396Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0674674Z               "line": 1113
2026-08-28T09:54:47.0674937Z             },
2026-08-28T09:54:47.0675197Z             {
2026-08-28T09:54:47.0675591Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0675872Z               "line": 1206
2026-08-28T09:54:47.0676138Z             }
2026-08-28T09:54:47.0676400Z           ]
2026-08-28T09:54:47.0676659Z         }
2026-08-28T09:54:47.0676930Z       }
2026-08-28T09:54:47.0677189Z     },
2026-08-28T09:54:47.0677451Z     {
2026-08-28T09:54:47.0677734Z       "id": "REQ-INST-5",
2026-08-28T09:54:47.0678286Z       "title": "Two-tier context sync (live to all, project to same-project)",
2026-08-28T09:54:47.0678586Z       "requiredStages": [
2026-08-28T09:54:47.0678858Z         "impl",
2026-08-28T09:54:47.0679225Z         "unit",
2026-08-28T09:54:47.0679511Z         "int"
2026-08-28T09:54:47.0679765Z       ],
2026-08-28T09:54:47.0680032Z       "stages": {
2026-08-28T09:54:47.0680299Z         "doc": {
2026-08-28T09:54:47.0680592Z           "complete": false,
2026-08-28T09:54:47.0680883Z           "evidence": []
2026-08-28T09:54:47.0681146Z         },
2026-08-28T09:54:47.0681409Z         "impl": {
2026-08-28T09:54:47.0681704Z           "complete": true,
2026-08-28T09:54:47.0681981Z           "evidence": [
2026-08-28T09:54:47.0682253Z             {
2026-08-28T09:54:47.0682639Z               "path": "crates/spt-daemon/src/pump/sync.rs",
2026-08-28T09:54:47.0682919Z               "line": 86
2026-08-28T09:54:47.0683332Z             },
2026-08-28T09:54:47.0683599Z             {
2026-08-28T09:54:47.0683965Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0684243Z               "line": 69
2026-08-28T09:54:47.0684510Z             },
2026-08-28T09:54:47.0684771Z             {
2026-08-28T09:54:47.0685130Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0685406Z               "line": 100
2026-08-28T09:54:47.0685671Z             },
2026-08-28T09:54:47.0685932Z             {
2026-08-28T09:54:47.0686418Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0686856Z               "line": 184
2026-08-28T09:54:47.0687242Z             },
2026-08-28T09:54:47.0687643Z             {
2026-08-28T09:54:47.0688153Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0688636Z               "line": 315
2026-08-28T09:54:47.0689104Z             }
2026-08-28T09:54:47.0689561Z           ]
2026-08-28T09:54:47.0689823Z         },
2026-08-28T09:54:47.0690096Z         "int": {
2026-08-28T09:54:47.0690395Z           "complete": true,
2026-08-28T09:54:47.0690682Z           "evidence": [
2026-08-28T09:54:47.0690950Z             {
2026-08-28T09:54:47.0691344Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.0691630Z               "line": 178
2026-08-28T09:54:47.0691897Z             },
2026-08-28T09:54:47.0692168Z             {
2026-08-28T09:54:47.0692551Z               "path": "crates/spt-daemon/tests/pump.rs",
2026-08-28T09:54:47.0692828Z               "line": 144
2026-08-28T09:54:47.0693103Z             },
2026-08-28T09:54:47.0693369Z             {
2026-08-28T09:54:47.0693757Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0694038Z               "line": 1153
2026-08-28T09:54:47.0694310Z             },
2026-08-28T09:54:47.0694573Z             {
2026-08-28T09:54:47.0694954Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0695390Z               "line": 2102
2026-08-28T09:54:47.0695690Z             }
2026-08-28T09:54:47.0695956Z           ]
2026-08-28T09:54:47.0696217Z         },
2026-08-28T09:54:47.0696492Z         "unit": {
2026-08-28T09:54:47.0696783Z           "complete": true,
2026-08-28T09:54:47.0697073Z           "evidence": [
2026-08-28T09:54:47.0697336Z             {
2026-08-28T09:54:47.0697694Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0697980Z               "line": 603
2026-08-28T09:54:47.0698242Z             },
2026-08-28T09:54:47.0698508Z             {
2026-08-28T09:54:47.0698869Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.0699244Z               "line": 646
2026-08-28T09:54:47.0699520Z             },
2026-08-28T09:54:47.0699787Z             {
2026-08-28T09:54:47.0700155Z               "path": "crates/spt-daemon/tests/sync.rs",
2026-08-28T09:54:47.0700426Z               "line": 217
2026-08-28T09:54:47.0700675Z             }
2026-08-28T09:54:47.0700969Z           ]
2026-08-28T09:54:47.0701237Z         }
2026-08-28T09:54:47.0701496Z       }
2026-08-28T09:54:47.0701756Z     },
2026-08-28T09:54:47.0702013Z     {
2026-08-28T09:54:47.0702313Z       "id": "REQ-INST-6",
2026-08-28T09:54:47.0702886Z       "title": "Deferred messages not delivered to dormant/suspended instances",
2026-08-28T09:54:47.0703191Z       "requiredStages": [
2026-08-28T09:54:47.0703468Z         "impl",
2026-08-28T09:54:47.0703732Z         "unit",
2026-08-28T09:54:47.0704015Z         "int"
2026-08-28T09:54:47.0704274Z       ],
2026-08-28T09:54:47.0704556Z       "stages": {
2026-08-28T09:54:47.0704818Z         "doc": {
2026-08-28T09:54:47.0705124Z           "complete": true,
2026-08-28T09:54:47.0705443Z           "evidence": [
2026-08-28T09:54:47.0705710Z             {
2026-08-28T09:54:47.0706030Z               "path": "docs/DEFERRED.md",
2026-08-28T09:54:47.0706302Z               "line": 13
2026-08-28T09:54:47.0706579Z             }
2026-08-28T09:54:47.0706853Z           ]
2026-08-28T09:54:47.0707122Z         },
2026-08-28T09:54:47.0707528Z         "impl": {
2026-08-28T09:54:47.0707828Z           "complete": true,
2026-08-28T09:54:47.0708114Z           "evidence": [
2026-08-28T09:54:47.0708382Z             {
2026-08-28T09:54:47.0708773Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.0709146Z               "line": 1191
2026-08-28T09:54:47.0709415Z             },
2026-08-28T09:54:47.0709684Z             {
2026-08-28T09:54:47.0710061Z               "path": "crates/spt-daemon/src/resthost.rs",
2026-08-28T09:54:47.0710338Z               "line": 27
2026-08-28T09:54:47.0710610Z             },
2026-08-28T09:54:47.0710867Z             {
2026-08-28T09:54:47.0711249Z               "path": "crates/spt-daemon/src/resthost.rs",
2026-08-28T09:54:47.0711534Z               "line": 89
2026-08-28T09:54:47.0711789Z             },
2026-08-28T09:54:47.0712056Z             {
2026-08-28T09:54:47.0712436Z               "path": "crates/spt-daemon/src/resthost.rs",
2026-08-28T09:54:47.0712722Z               "line": 203
2026-08-28T09:54:47.0712994Z             },
2026-08-28T09:54:47.0713260Z             {
2026-08-28T09:54:47.0713643Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0713919Z               "line": 532
2026-08-28T09:54:47.0714190Z             },
2026-08-28T09:54:47.0714456Z             {
2026-08-28T09:54:47.0714829Z               "path": "crates/spt-net/src/net/rest.rs",
2026-08-28T09:54:47.0715107Z               "line": 31
2026-08-28T09:54:47.0715412Z             },
2026-08-28T09:54:47.0715851Z             {
2026-08-28T09:54:47.0716223Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.0716500Z               "line": 556
2026-08-28T09:54:47.0716761Z             },
2026-08-28T09:54:47.0717024Z             {
2026-08-28T09:54:47.0717375Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:47.0717664Z               "line": 131
2026-08-28T09:54:47.0717931Z             },
2026-08-28T09:54:47.0718317Z             {
2026-08-28T09:54:47.0718651Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0718937Z               "line": 7502
2026-08-28T09:54:47.0719323Z             },
2026-08-28T09:54:47.0719581Z             {
2026-08-28T09:54:47.0719928Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0720202Z               "line": 857
2026-08-28T09:54:47.0720470Z             },
2026-08-28T09:54:47.0720732Z             {
2026-08-28T09:54:47.0721071Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0721352Z               "line": 907
2026-08-28T09:54:47.0721614Z             }
2026-08-28T09:54:47.0721876Z           ]
2026-08-28T09:54:47.0722134Z         },
2026-08-28T09:54:47.0722405Z         "int": {
2026-08-28T09:54:47.0722696Z           "complete": true,
2026-08-28T09:54:47.0722981Z           "evidence": [
2026-08-28T09:54:47.0723243Z             {
2026-08-28T09:54:47.0723634Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0723921Z               "line": 1167
2026-08-28T09:54:47.0724198Z             },
2026-08-28T09:54:47.0724469Z             {
2026-08-28T09:54:47.0724856Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0725140Z               "line": 2147
2026-08-28T09:54:47.0725404Z             },
2026-08-28T09:54:47.0725671Z             {
2026-08-28T09:54:47.0726005Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.0726291Z               "line": 2491
2026-08-28T09:54:47.0726634Z             }
2026-08-28T09:54:47.0726897Z           ]
2026-08-28T09:54:47.0727164Z         },
2026-08-28T09:54:47.0727428Z         "unit": {
2026-08-28T09:54:47.0727738Z           "complete": true,
2026-08-28T09:54:47.0728021Z           "evidence": [
2026-08-28T09:54:47.0728281Z             {
2026-08-28T09:54:47.0728658Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.0729030Z               "line": 2212
2026-08-28T09:54:47.0729297Z             },
2026-08-28T09:54:47.0729569Z             {
2026-08-28T09:54:47.0729947Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.0730356Z               "line": 1362
2026-08-28T09:54:47.0730631Z             },
2026-08-28T09:54:47.0730891Z             {
2026-08-28T09:54:47.0731249Z               "path": "crates/spt-net/src/net/rest.rs",
2026-08-28T09:54:47.0731520Z               "line": 66
2026-08-28T09:54:47.0731782Z             },
2026-08-28T09:54:47.0732055Z             {
2026-08-28T09:54:47.0732412Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.0732699Z               "line": 1160
2026-08-28T09:54:47.0732960Z             },
2026-08-28T09:54:47.0733228Z             {
2026-08-28T09:54:47.0733576Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:47.0733861Z               "line": 309
2026-08-28T09:54:47.0734128Z             }
2026-08-28T09:54:47.0734390Z           ]
2026-08-28T09:54:47.0734656Z         }
2026-08-28T09:54:47.0734915Z       }
2026-08-28T09:54:47.0735181Z     },
2026-08-28T09:54:47.0735440Z     {
2026-08-28T09:54:47.0735743Z       "id": "REQ-INST-7",
2026-08-28T09:54:47.0736166Z       "title": "Subnet registry + bare-id resolution policy",
2026-08-28T09:54:47.0736476Z       "requiredStages": [
2026-08-28T09:54:47.0736747Z         "impl",
2026-08-28T09:54:47.0737015Z         "unit",
2026-08-28T09:54:47.0737281Z         "int"
2026-08-28T09:54:47.0737538Z       ],
2026-08-28T09:54:47.0737820Z       "stages": {
2026-08-28T09:54:47.0738086Z         "doc": {
2026-08-28T09:54:47.0738387Z           "complete": false,
2026-08-28T09:54:47.0738676Z           "evidence": []
2026-08-28T09:54:47.0739033Z         },
2026-08-28T09:54:47.0739300Z         "impl": {
2026-08-28T09:54:47.0739586Z           "complete": true,
2026-08-28T09:54:47.0739867Z           "evidence": [
2026-08-28T09:54:47.0740129Z             {
2026-08-28T09:54:47.0740516Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.0740865Z               "line": 1274
2026-08-28T09:54:47.0741252Z             },
2026-08-28T09:54:47.0741523Z             {
2026-08-28T09:54:47.0741929Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0742205Z               "line": 27
2026-08-28T09:54:47.0742472Z             },
2026-08-28T09:54:47.0742744Z             {
2026-08-28T09:54:47.0743135Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0743426Z               "line": 228
2026-08-28T09:54:47.0743689Z             },
2026-08-28T09:54:47.0743953Z             {
2026-08-28T09:54:47.0744345Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0744626Z               "line": 465
2026-08-28T09:54:47.0744887Z             },
2026-08-28T09:54:47.0745156Z             {
2026-08-28T09:54:47.0745527Z               "path": "crates/spt-net/src/net/ndjson.rs",
2026-08-28T09:54:47.0745808Z               "line": 59
2026-08-28T09:54:47.0746070Z             },
2026-08-28T09:54:47.0746332Z             {
2026-08-28T09:54:47.0746722Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0746997Z               "line": 41
2026-08-28T09:54:47.0747270Z             },
2026-08-28T09:54:47.0747532Z             {
2026-08-28T09:54:47.0747928Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:47.0748214Z               "line": 27
2026-08-28T09:54:47.0748471Z             },
2026-08-28T09:54:47.0748742Z             {
2026-08-28T09:54:47.0749209Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:47.0749497Z               "line": 124
2026-08-28T09:54:47.0749764Z             },
2026-08-28T09:54:47.0750031Z             {
2026-08-28T09:54:47.0750418Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:47.0750698Z               "line": 139
2026-08-28T09:54:47.0750970Z             },
2026-08-28T09:54:47.0751232Z             {
2026-08-28T09:54:47.0751603Z               "path": "crates/spt-store/src/registry.rs",
2026-08-28T09:54:47.0751883Z               "line": 139
2026-08-28T09:54:47.0752150Z             }
2026-08-28T09:54:47.0752531Z           ]
2026-08-28T09:54:47.0752798Z         },
2026-08-28T09:54:47.0753080Z         "int": {
2026-08-28T09:54:47.0753371Z           "complete": true,
2026-08-28T09:54:47.0753653Z           "evidence": [
2026-08-28T09:54:47.0753910Z             {
2026-08-28T09:54:47.0754287Z               "path": "crates/spt-daemon/tests/pump.rs",
2026-08-28T09:54:47.0754566Z               "line": 144
2026-08-28T09:54:47.0754832Z             },
2026-08-28T09:54:47.0755095Z             {
2026-08-28T09:54:47.0755481Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0755767Z               "line": 1009
2026-08-28T09:54:47.0756015Z             },
2026-08-28T09:54:47.0756283Z             {
2026-08-28T09:54:47.0756664Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0756957Z               "line": 1902
2026-08-28T09:54:47.0757220Z             }
2026-08-28T09:54:47.0757495Z           ]
2026-08-28T09:54:47.0757757Z         },
2026-08-28T09:54:47.0758038Z         "unit": {
2026-08-28T09:54:47.0758334Z           "complete": true,
2026-08-28T09:54:47.0758616Z           "evidence": [
2026-08-28T09:54:47.0758882Z             {
2026-08-28T09:54:47.0759356Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0759644Z               "line": 1703
2026-08-28T09:54:47.0759904Z             },
2026-08-28T09:54:47.0760177Z             {
2026-08-28T09:54:47.0760567Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.0760835Z               "line": 2378
2026-08-28T09:54:47.0761130Z             },
2026-08-28T09:54:47.0761421Z             {
2026-08-28T09:54:47.0761817Z               "path": "crates/spt-daemon/tests/replicate.rs",
2026-08-28T09:54:47.0762097Z               "line": 85
2026-08-28T09:54:47.0762368Z             },
2026-08-28T09:54:47.0762629Z             {
2026-08-28T09:54:47.0763010Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0763406Z               "line": 1232
2026-08-28T09:54:47.0763678Z             },
2026-08-28T09:54:47.0763945Z             {
2026-08-28T09:54:47.0764326Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0764612Z               "line": 1335
2026-08-28T09:54:47.0764881Z             },
2026-08-28T09:54:47.0765145Z             {
2026-08-28T09:54:47.0765527Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0765814Z               "line": 1350
2026-08-28T09:54:47.0766094Z             },
2026-08-28T09:54:47.0766361Z             {
2026-08-28T09:54:47.0766749Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:47.0767029Z               "line": 177
2026-08-28T09:54:47.0767299Z             },
2026-08-28T09:54:47.0767555Z             {
2026-08-28T09:54:47.0767955Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:47.0768232Z               "line": 192
2026-08-28T09:54:47.0768513Z             },
2026-08-28T09:54:47.0768776Z             {
2026-08-28T09:54:47.0769257Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:47.0769562Z               "line": 225
2026-08-28T09:54:47.0769830Z             }
2026-08-28T09:54:47.0770086Z           ]
2026-08-28T09:54:47.0770361Z         }
2026-08-28T09:54:47.0770617Z       }
2026-08-28T09:54:47.0770879Z     },
2026-08-28T09:54:47.0771141Z     {
2026-08-28T09:54:47.0771428Z       "id": "REQ-INST-8",
2026-08-28T09:54:47.0771896Z       "title": "Remote-control mode distinct from local operation",
2026-08-28T09:54:47.0772192Z       "requiredStages": [
2026-08-28T09:54:47.0772468Z         "impl",
2026-08-28T09:54:47.0772734Z         "unit",
2026-08-28T09:54:47.0773003Z         "int"
2026-08-28T09:54:47.0773262Z       ],
2026-08-28T09:54:47.0773537Z       "stages": {
2026-08-28T09:54:47.0773810Z         "doc": {
2026-08-28T09:54:47.0774100Z           "complete": false,
2026-08-28T09:54:47.0774390Z           "evidence": []
2026-08-28T09:54:47.0774662Z         },
2026-08-28T09:54:47.0775054Z         "impl": {
2026-08-28T09:54:47.0775350Z           "complete": true,
2026-08-28T09:54:47.0775633Z           "evidence": [
2026-08-28T09:54:47.0775887Z             {
2026-08-28T09:54:47.0776268Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.0776559Z               "line": 443
2026-08-28T09:54:47.0776817Z             },
2026-08-28T09:54:47.0777088Z             {
2026-08-28T09:54:47.0777450Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.0777736Z               "line": 869
2026-08-28T09:54:47.0777998Z             },
2026-08-28T09:54:47.0778267Z             {
2026-08-28T09:54:47.0778635Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.0778917Z               "line": 985
2026-08-28T09:54:47.0779274Z             },
2026-08-28T09:54:47.0779541Z             {
2026-08-28T09:54:47.0779908Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.0780190Z               "line": 75
2026-08-28T09:54:47.0780462Z             }
2026-08-28T09:54:47.0780727Z           ]
2026-08-28T09:54:47.0780992Z         },
2026-08-28T09:54:47.0781254Z         "int": {
2026-08-28T09:54:47.0781555Z           "complete": true,
2026-08-28T09:54:47.0781836Z           "evidence": [
2026-08-28T09:54:47.0782093Z             {
2026-08-28T09:54:47.0782480Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.0782762Z               "line": 458
2026-08-28T09:54:47.0783023Z             },
2026-08-28T09:54:47.0783284Z             {
2026-08-28T09:54:47.0783677Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.0783958Z               "line": 2061
2026-08-28T09:54:47.0784225Z             }
2026-08-28T09:54:47.0784479Z           ]
2026-08-28T09:54:47.0784741Z         },
2026-08-28T09:54:47.0785009Z         "unit": {
2026-08-28T09:54:47.0785295Z           "complete": true,
2026-08-28T09:54:47.0785580Z           "evidence": [
2026-08-28T09:54:47.0786011Z             {
2026-08-28T09:54:47.0786395Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.0786681Z               "line": 401
2026-08-28T09:54:47.0786944Z             },
2026-08-28T09:54:47.0787210Z             {
2026-08-28T09:54:47.0787578Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.0787859Z               "line": 833
2026-08-28T09:54:47.0788125Z             },
2026-08-28T09:54:47.0788396Z             {
2026-08-28T09:54:47.0788765Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.0789128Z               "line": 274
2026-08-28T09:54:47.0789394Z             },
2026-08-28T09:54:47.0789657Z             {
2026-08-28T09:54:47.0790029Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.0790310Z               "line": 419
2026-08-28T09:54:47.0790582Z             }
2026-08-28T09:54:47.0790854Z           ]
2026-08-28T09:54:47.0791117Z         }
2026-08-28T09:54:47.0791382Z       }
2026-08-28T09:54:47.0791646Z     },
2026-08-28T09:54:47.0792014Z     {
2026-08-28T09:54:47.0792310Z       "id": "REQ-INST-9",
2026-08-28T09:54:47.0792882Z       "title": "Multi-subnet membership (same-user N subnets; cross-user seam)",
2026-08-28T09:54:47.0793178Z       "requiredStages": [
2026-08-28T09:54:47.0793454Z         "impl",
2026-08-28T09:54:47.0793722Z         "unit"
2026-08-28T09:54:47.0793992Z       ],
2026-08-28T09:54:47.0794262Z       "stages": {
2026-08-28T09:54:47.0794533Z         "doc": {
2026-08-28T09:54:47.0794833Z           "complete": false,
2026-08-28T09:54:47.0795115Z           "evidence": []
2026-08-28T09:54:47.0795382Z         },
2026-08-28T09:54:47.0795650Z         "impl": {
2026-08-28T09:54:47.0795973Z           "complete": true,
2026-08-28T09:54:47.0796260Z           "evidence": [
2026-08-28T09:54:47.0796532Z             {
2026-08-28T09:54:47.0796922Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0797204Z               "line": 689
2026-08-28T09:54:47.0797480Z             }
2026-08-28T09:54:47.0797889Z           ]
2026-08-28T09:54:47.0798167Z         },
2026-08-28T09:54:47.0798419Z         "int": {
2026-08-28T09:54:47.0798719Z           "complete": false,
2026-08-28T09:54:47.0799080Z           "evidence": []
2026-08-28T09:54:47.0799344Z         },
2026-08-28T09:54:47.0799612Z         "unit": {
2026-08-28T09:54:47.0799907Z           "complete": true,
2026-08-28T09:54:47.0800198Z           "evidence": [
2026-08-28T09:54:47.0800456Z             {
2026-08-28T09:54:47.0800837Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0801114Z               "line": 2240
2026-08-28T09:54:47.0801381Z             },
2026-08-28T09:54:47.0801659Z             {
2026-08-28T09:54:47.0802041Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0802322Z               "line": 2249
2026-08-28T09:54:47.0802589Z             },
2026-08-28T09:54:47.0802855Z             {
2026-08-28T09:54:47.0803248Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0803543Z               "line": 2265
2026-08-28T09:54:47.0803799Z             },
2026-08-28T09:54:47.0804067Z             {
2026-08-28T09:54:47.0804442Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0804730Z               "line": 2277
2026-08-28T09:54:47.0804993Z             },
2026-08-28T09:54:47.0805261Z             {
2026-08-28T09:54:47.0805647Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.0805942Z               "line": 2297
2026-08-28T09:54:47.0806210Z             }
2026-08-28T09:54:47.0806472Z           ]
2026-08-28T09:54:47.0806725Z         }
2026-08-28T09:54:47.0806996Z       }
2026-08-28T09:54:47.0807257Z     },
2026-08-28T09:54:47.0807520Z     {
2026-08-28T09:54:47.0807825Z       "id": "REQ-INSTALL-1",
2026-08-28T09:54:47.0812526Z       "title": "Two install paths (harness-bootstrapped calls into standalone); OS-service registration deferred. HISTORY: originally 'signed one-line script' — the hosted one-liner retired as the PUBLIC install surface at THE-FORKENING W1/W2 (ADR-0036; the canonical bootstrap is gh + the spt install verb, REQ-INSTALL-BOOTSTRAP-VERB); installer/ scripts remain in-repo as the hermetic oneliner_e2e fixture + air-gap/mirror fallback, which is what this REQ's evidence now attests (doyle-ratified 2026-07-14).",
2026-08-28T09:54:47.0812963Z       "requiredStages": [
2026-08-28T09:54:47.0813235Z         "doc",
2026-08-28T09:54:47.0813503Z         "impl",
2026-08-28T09:54:47.0813778Z         "int"
2026-08-28T09:54:47.0814050Z       ],
2026-08-28T09:54:47.0814317Z       "stages": {
2026-08-28T09:54:47.0814588Z         "doc": {
2026-08-28T09:54:47.0814875Z           "complete": true,
2026-08-28T09:54:47.0815164Z           "evidence": [
2026-08-28T09:54:47.0815425Z             {
2026-08-28T09:54:47.0815731Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.0816041Z               "line": 1131
2026-08-28T09:54:47.0816307Z             }
2026-08-28T09:54:47.0816597Z           ]
2026-08-28T09:54:47.0816860Z         },
2026-08-28T09:54:47.0817141Z         "impl": {
2026-08-28T09:54:47.0817432Z           "complete": true,
2026-08-28T09:54:47.0817719Z           "evidence": [
2026-08-28T09:54:47.0817979Z             {
2026-08-28T09:54:47.0818333Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.0818609Z               "line": 59
2026-08-28T09:54:47.0818876Z             },
2026-08-28T09:54:47.0819215Z             {
2026-08-28T09:54:47.0819540Z               "path": "installer/install.sh",
2026-08-28T09:54:47.0819825Z               "line": 54
2026-08-28T09:54:47.0820091Z             }
2026-08-28T09:54:47.0820351Z           ]
2026-08-28T09:54:47.0820614Z         },
2026-08-28T09:54:47.0820881Z         "int": {
2026-08-28T09:54:47.0821167Z           "complete": true,
2026-08-28T09:54:47.0821438Z           "evidence": [
2026-08-28T09:54:47.0821704Z             {
2026-08-28T09:54:47.0822072Z               "path": "crates/spt/tests/oneliner_e2e.rs",
2026-08-28T09:54:47.0822348Z               "line": 21
2026-08-28T09:54:47.0822731Z             }
2026-08-28T09:54:47.0823000Z           ]
2026-08-28T09:54:47.0823265Z         },
2026-08-28T09:54:47.0823533Z         "unit": {
2026-08-28T09:54:47.0823829Z           "complete": false,
2026-08-28T09:54:47.0824119Z           "evidence": []
2026-08-28T09:54:47.0824392Z         }
2026-08-28T09:54:47.0824659Z       }
2026-08-28T09:54:47.0824920Z     },
2026-08-28T09:54:47.0825182Z     {
2026-08-28T09:54:47.0825487Z       "id": "REQ-INSTALL-10",
2026-08-28T09:54:47.0829241Z       "title": "Windows at-logon autostart runs the daemon in the background with no persistent window: the scheduled task launches `spt daemon start` (which spawn_detaches a console-less DETACHED_PROCESS daemon and exits) rather than the foreground `spt daemon run` — Task Scheduler's interactive ONLOGON launch of a long-lived console process otherwise leaves a visible console window for the daemon's whole lifetime (v0.7.4)",
2026-08-28T09:54:47.0829565Z       "requiredStages": [
2026-08-28T09:54:47.0829837Z         "impl",
2026-08-28T09:54:47.0830105Z         "unit"
2026-08-28T09:54:47.0830376Z       ],
2026-08-28T09:54:47.0830632Z       "stages": {
2026-08-28T09:54:47.0830902Z         "doc": {
2026-08-28T09:54:47.0831189Z           "complete": false,
2026-08-28T09:54:47.0831479Z           "evidence": []
2026-08-28T09:54:47.0831741Z         },
2026-08-28T09:54:47.0832003Z         "impl": {
2026-08-28T09:54:47.0832289Z           "complete": true,
2026-08-28T09:54:47.0832560Z           "evidence": [
2026-08-28T09:54:47.0832822Z             {
2026-08-28T09:54:47.0833156Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.0833443Z               "line": 204
2026-08-28T09:54:47.0833694Z             }
2026-08-28T09:54:47.0833955Z           ]
2026-08-28T09:54:47.0834226Z         },
2026-08-28T09:54:47.0834488Z         "int": {
2026-08-28T09:54:47.0834779Z           "complete": false,
2026-08-28T09:54:47.0835061Z           "evidence": []
2026-08-28T09:54:47.0835446Z         },
2026-08-28T09:54:47.0835723Z         "unit": {
2026-08-28T09:54:47.0836009Z           "complete": true,
2026-08-28T09:54:47.0836284Z           "evidence": [
2026-08-28T09:54:47.0836555Z             {
2026-08-28T09:54:47.0836936Z               "path": "crates/spt/tests/oneliner_e2e.rs",
2026-08-28T09:54:47.0837232Z               "line": 211
2026-08-28T09:54:47.0837495Z             }
2026-08-28T09:54:47.0837761Z           ]
2026-08-28T09:54:47.0838028Z         }
2026-08-28T09:54:47.0838290Z       }
2026-08-28T09:54:47.0838556Z     },
2026-08-28T09:54:47.0838816Z     {
2026-08-28T09:54:47.0839205Z       "id": "REQ-INSTALL-11",
2026-08-28T09:54:47.0844438Z       "title": "Adapter command templates resolve their program against the adapter's install dir BEFORE PATH: a `.spt`-shipped binary (dropped to adapters/_github/<safe>/ by --release/--github acquisition, or kept in the source_dir under copy-mode where only manifest+strings/ are copied to adapters/<name>) runs without any PATH placement — a bare-name template token (e.g. `claude-spt-digest ...`) is rewritten to <install_dir>/<program>(.exe on Windows) when that file exists, else left bare for the PATH fallback. Makes a `.spt` self-contained (closes the --release bundled-binary gap perri confirmed) (v0.7.4)",
2026-08-28T09:54:47.0844762Z       "requiredStages": [
2026-08-28T09:54:47.0845029Z         "doc",
2026-08-28T09:54:47.0845307Z         "impl",
2026-08-28T09:54:47.0845573Z         "unit"
2026-08-28T09:54:47.0845836Z       ],
2026-08-28T09:54:47.0846122Z       "stages": {
2026-08-28T09:54:47.0846384Z         "doc": {
2026-08-28T09:54:47.0846683Z           "complete": true,
2026-08-28T09:54:47.0846966Z           "evidence": [
2026-08-28T09:54:47.0847234Z             {
2026-08-28T09:54:47.0847544Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.0847825Z               "line": 171
2026-08-28T09:54:47.0848093Z             },
2026-08-28T09:54:47.0848365Z             {
2026-08-28T09:54:47.0848708Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.0849103Z               "line": 621
2026-08-28T09:54:47.0849493Z             },
2026-08-28T09:54:47.0849765Z             {
2026-08-28T09:54:47.0850080Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.0850366Z               "line": 105
2026-08-28T09:54:47.0850634Z             },
2026-08-28T09:54:47.0850905Z             {
2026-08-28T09:54:47.0851230Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.0851500Z               "line": 391
2026-08-28T09:54:47.0851766Z             }
2026-08-28T09:54:47.0852026Z           ]
2026-08-28T09:54:47.0852290Z         },
2026-08-28T09:54:47.0852556Z         "impl": {
2026-08-28T09:54:47.0852852Z           "complete": true,
2026-08-28T09:54:47.0853128Z           "evidence": [
2026-08-28T09:54:47.0853394Z             {
2026-08-28T09:54:47.0853777Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:47.0854053Z               "line": 287
2026-08-28T09:54:47.0854320Z             },
2026-08-28T09:54:47.0854582Z             {
2026-08-28T09:54:47.0854993Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0855279Z               "line": 311
2026-08-28T09:54:47.0855547Z             },
2026-08-28T09:54:47.0855810Z             {
2026-08-28T09:54:47.0856210Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0856486Z               "line": 403
2026-08-28T09:54:47.0856754Z             },
2026-08-28T09:54:47.0857026Z             {
2026-08-28T09:54:47.0857409Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0857690Z               "line": 627
2026-08-28T09:54:47.0857957Z             },
2026-08-28T09:54:47.0858237Z             {
2026-08-28T09:54:47.0858624Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0858891Z               "line": 696
2026-08-28T09:54:47.0859358Z             },
2026-08-28T09:54:47.0859617Z             {
2026-08-28T09:54:47.0860001Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.0860382Z               "line": 710
2026-08-28T09:54:47.0860655Z             },
2026-08-28T09:54:47.0860902Z             {
2026-08-28T09:54:47.0861298Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:47.0861593Z               "line": 687
2026-08-28T09:54:47.0861857Z             },
2026-08-28T09:54:47.0862124Z             {
2026-08-28T09:54:47.0862507Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.0862792Z               "line": 228
2026-08-28T09:54:47.0863054Z             },
2026-08-28T09:54:47.0863325Z             {
2026-08-28T09:54:47.0863688Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.0863969Z               "line": 559
2026-08-28T09:54:47.0864241Z             },
2026-08-28T09:54:47.0864508Z             {
2026-08-28T09:54:47.0864913Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:47.0865194Z               "line": 487
2026-08-28T09:54:47.0865468Z             },
2026-08-28T09:54:47.0865731Z             {
2026-08-28T09:54:47.0866121Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:47.0866403Z               "line": 127
2026-08-28T09:54:47.0866679Z             },
2026-08-28T09:54:47.0866947Z             {
2026-08-28T09:54:47.0867328Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:47.0867605Z               "line": 220
2026-08-28T09:54:47.0867870Z             },
2026-08-28T09:54:47.0868139Z             {
2026-08-28T09:54:47.0868517Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:47.0868793Z               "line": 238
2026-08-28T09:54:47.0869142Z             },
2026-08-28T09:54:47.0869408Z             {
2026-08-28T09:54:47.0869795Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:47.0870062Z               "line": 960
2026-08-28T09:54:47.0870314Z             },
2026-08-28T09:54:47.0870566Z             {
2026-08-28T09:54:47.0870946Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.0873686Z               "line": 418
2026-08-28T09:54:47.0873953Z             },
2026-08-28T09:54:47.0874224Z             {
2026-08-28T09:54:47.0874602Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.0874888Z               "line": 565
2026-08-28T09:54:47.0875144Z             },
2026-08-28T09:54:47.0875407Z             {
2026-08-28T09:54:47.0875782Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.0876071Z               "line": 577
2026-08-28T09:54:47.0876324Z             },
2026-08-28T09:54:47.0876591Z             {
2026-08-28T09:54:47.0876973Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.0877253Z               "line": 845
2026-08-28T09:54:47.0877517Z             },
2026-08-28T09:54:47.0877784Z             {
2026-08-28T09:54:47.0878142Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:47.0878420Z               "line": 88
2026-08-28T09:54:47.0878680Z             },
2026-08-28T09:54:47.0879034Z             {
2026-08-28T09:54:47.0879392Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:47.0879668Z               "line": 104
2026-08-28T09:54:47.0879920Z             },
2026-08-28T09:54:47.0880183Z             {
2026-08-28T09:54:47.0880550Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:47.0880835Z               "line": 129
2026-08-28T09:54:47.0881098Z             },
2026-08-28T09:54:47.0881375Z             {
2026-08-28T09:54:47.0881751Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0882037Z               "line": 538
2026-08-28T09:54:47.0882295Z             },
2026-08-28T09:54:47.0882561Z             {
2026-08-28T09:54:47.0882943Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0883215Z               "line": 716
2026-08-28T09:54:47.0883480Z             },
2026-08-28T09:54:47.0887322Z             {
2026-08-28T09:54:47.0887909Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0888195Z               "line": 810
2026-08-28T09:54:47.0888467Z             },
2026-08-28T09:54:47.0888735Z             {
2026-08-28T09:54:47.0889203Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0889479Z               "line": 1050
2026-08-28T09:54:47.0889752Z             },
2026-08-28T09:54:47.0890013Z             {
2026-08-28T09:54:47.0890395Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0890676Z               "line": 1073
2026-08-28T09:54:47.0890940Z             },
2026-08-28T09:54:47.0891206Z             {
2026-08-28T09:54:47.0891593Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0891877Z               "line": 1088
2026-08-28T09:54:47.0892134Z             },
2026-08-28T09:54:47.0892396Z             {
2026-08-28T09:54:47.0892730Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:47.0893012Z               "line": 885
2026-08-28T09:54:47.0893274Z             },
2026-08-28T09:54:47.0893546Z             {
2026-08-28T09:54:47.0893927Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.0894211Z               "line": 305
2026-08-28T09:54:47.0894477Z             },
2026-08-28T09:54:47.0894744Z             {
2026-08-28T09:54:47.0895059Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0895330Z               "line": 22584
2026-08-28T09:54:47.0895588Z             }
2026-08-28T09:54:47.0895860Z           ]
2026-08-28T09:54:47.0896122Z         },
2026-08-28T09:54:47.0896390Z         "int": {
2026-08-28T09:54:47.0896681Z           "complete": true,
2026-08-28T09:54:47.0896970Z           "evidence": [
2026-08-28T09:54:47.0897234Z             {
2026-08-28T09:54:47.0897635Z               "path": "crates/spt/tests/resident_service_e2e.rs",
2026-08-28T09:54:47.0897911Z               "line": 513
2026-08-28T09:54:47.0898183Z             },
2026-08-28T09:54:47.0898441Z             {
2026-08-28T09:54:47.0898827Z               "path": "crates/spt/tests/resident_service_e2e.rs",
2026-08-28T09:54:47.0899318Z               "line": 528
2026-08-28T09:54:47.0899584Z             }
2026-08-28T09:54:47.0899849Z           ]
2026-08-28T09:54:47.0900111Z         },
2026-08-28T09:54:47.0900382Z         "unit": {
2026-08-28T09:54:47.0900669Z           "complete": true,
2026-08-28T09:54:47.0900950Z           "evidence": [
2026-08-28T09:54:47.0901208Z             {
2026-08-28T09:54:47.0901617Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.0901894Z               "line": 536
2026-08-28T09:54:47.0902167Z             },
2026-08-28T09:54:47.0902437Z             {
2026-08-28T09:54:47.0902838Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:47.0903129Z               "line": 2298
2026-08-28T09:54:47.0903386Z             },
2026-08-28T09:54:47.0903657Z             {
2026-08-28T09:54:47.0904045Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:47.0904325Z               "line": 1395
2026-08-28T09:54:47.0904601Z             },
2026-08-28T09:54:47.0904865Z             {
2026-08-28T09:54:47.0905251Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:47.0905527Z               "line": 1436
2026-08-28T09:54:47.0905804Z             },
2026-08-28T09:54:47.0906053Z             {
2026-08-28T09:54:47.0906448Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.0906743Z               "line": 1165
2026-08-28T09:54:47.0907011Z             },
2026-08-28T09:54:47.0907279Z             {
2026-08-28T09:54:47.0907662Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.0907948Z               "line": 1193
2026-08-28T09:54:47.0908210Z             },
2026-08-28T09:54:47.0908481Z             {
2026-08-28T09:54:47.0908873Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0909240Z               "line": 1757
2026-08-28T09:54:47.0909512Z             },
2026-08-28T09:54:47.0909884Z             {
2026-08-28T09:54:47.0910270Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0910553Z               "line": 1769
2026-08-28T09:54:47.0910824Z             },
2026-08-28T09:54:47.0911096Z             {
2026-08-28T09:54:47.0911482Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.0911773Z               "line": 1778
2026-08-28T09:54:47.0912031Z             }
2026-08-28T09:54:47.0912307Z           ]
2026-08-28T09:54:47.0912569Z         }
2026-08-28T09:54:47.0912835Z       }
2026-08-28T09:54:47.0913093Z     },
2026-08-28T09:54:47.0913360Z     {
2026-08-28T09:54:47.0913651Z       "id": "REQ-INSTALL-12",
2026-08-28T09:54:47.0921489Z       "title": "Durable active-profile pointer for bind-time profile selection (ADR-0021): adapters/active-profiles.toml at the registry ROOT (sibling to the per-adapter <name>/ dirs, so adapter add/update/remove — which only rewrite a <name>/ subdir — can never clobber it), a flat host_binary → \"adapter[:profile]\" map. Read at bind as the PRIMARY profile selector; unset → the registered_at_ms fallback (REQ-START-5). Written ONLY by `spt adapter use <adapter>[:profile]` (resolves the adapter's host_binaries → sets each binary→adapter[:profile]); `spt adapter use --clear <adapter|binary>` drops. NEVER auto-written by install/update/adapter add (that is precisely what would let an update silently flip the active profile). A stale pointer (uninstalled adapter / deleted profile) self-heals: ignored, fall back, warn once. Pruned on adapter remove. Atomic write (spt_store atomic). (v0.9.0)",
2026-08-28T09:54:47.0921831Z       "requiredStages": [
2026-08-28T09:54:47.0922099Z         "doc",
2026-08-28T09:54:47.0922366Z         "impl",
2026-08-28T09:54:47.0922639Z         "unit",
2026-08-28T09:54:47.0922892Z         "int"
2026-08-28T09:54:47.0923153Z       ],
2026-08-28T09:54:47.0923428Z       "stages": {
2026-08-28T09:54:47.0923686Z         "doc": {
2026-08-28T09:54:47.0923972Z           "complete": true,
2026-08-28T09:54:47.0924287Z           "evidence": [
2026-08-28T09:54:47.0924692Z             {
2026-08-28T09:54:47.0925007Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.0925278Z               "line": 219
2026-08-28T09:54:47.0925537Z             }
2026-08-28T09:54:47.0925792Z           ]
2026-08-28T09:54:47.0926056Z         },
2026-08-28T09:54:47.0926329Z         "impl": {
2026-08-28T09:54:47.0926610Z           "complete": true,
2026-08-28T09:54:47.0926906Z           "evidence": [
2026-08-28T09:54:47.0927168Z             {
2026-08-28T09:54:47.0927554Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.0927831Z               "line": 27
2026-08-28T09:54:47.0928094Z             },
2026-08-28T09:54:47.0928367Z             {
2026-08-28T09:54:47.0928745Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.0929116Z               "line": 229
2026-08-28T09:54:47.0929388Z             },
2026-08-28T09:54:47.0929654Z             {
2026-08-28T09:54:47.0929988Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0930275Z               "line": 20686
2026-08-28T09:54:47.0930541Z             }
2026-08-28T09:54:47.0930803Z           ]
2026-08-28T09:54:47.0931069Z         },
2026-08-28T09:54:47.0931335Z         "int": {
2026-08-28T09:54:47.0931635Z           "complete": true,
2026-08-28T09:54:47.0931916Z           "evidence": [
2026-08-28T09:54:47.0932188Z             {
2026-08-28T09:54:47.0932593Z               "path": "crates/spt/tests/live_resolve_e2e.rs",
2026-08-28T09:54:47.0932875Z               "line": 19
2026-08-28T09:54:47.0933142Z             }
2026-08-28T09:54:47.0933408Z           ]
2026-08-28T09:54:47.0933679Z         },
2026-08-28T09:54:47.0933946Z         "unit": {
2026-08-28T09:54:47.0934247Z           "complete": true,
2026-08-28T09:54:47.0934518Z           "evidence": [
2026-08-28T09:54:47.0934800Z             {
2026-08-28T09:54:47.0935181Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.0935581Z               "line": 401
2026-08-28T09:54:47.0935852Z             },
2026-08-28T09:54:47.0936144Z             {
2026-08-28T09:54:47.0936531Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.0936813Z               "line": 427
2026-08-28T09:54:47.0937085Z             },
2026-08-28T09:54:47.0937353Z             {
2026-08-28T09:54:47.0937743Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.0938033Z               "line": 446
2026-08-28T09:54:47.0938297Z             },
2026-08-28T09:54:47.0938564Z             {
2026-08-28T09:54:47.0939048Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.0939328Z               "line": 481
2026-08-28T09:54:47.0939580Z             },
2026-08-28T09:54:47.0939847Z             {
2026-08-28T09:54:47.0940166Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0940462Z               "line": 31727
2026-08-28T09:54:47.0940729Z             }
2026-08-28T09:54:47.0941048Z           ]
2026-08-28T09:54:47.0941315Z         }
2026-08-28T09:54:47.0941573Z       }
2026-08-28T09:54:47.0941862Z     },
2026-08-28T09:54:47.0942128Z     {
2026-08-28T09:54:47.0942433Z       "id": "REQ-INSTALL-13",
2026-08-28T09:54:47.0950894Z       "title": "Adapter add is non-destructive & idempotent-safe (F-018): `spt adapter add --github|--release` REFUSES when the target `_github/<safe>` home already backs an ACTIVE registered record — emitting an actionable code (ADAPTER_ADD_ALREADY_REGISTERED) that routes to `spt adapter update <name>` (refresh in place) or `spt adapter remove <name>` then re-add (replace) — instead of clobbering the live install (the perri footgun: `add --github` over a `--release` pointer git-cloned a source tree over the extracted built binaries → registered pointer dangled → cryptic `os error 2`). And when it DOES (re)populate the home it STAGES-THEN-SWAPS (clone/extract to a sibling staging dir, swap into place only on success) so a failed fetch/clone never strands the previously-extracted manifest+binaries as a dangling pointer (the os-2 / DeferredManifest class). Mirrors the safe stage-then-swap `adapter update` already uses (REQ-UPD-9, apply_release_crc_swap). (v0.14.1)",
2026-08-28T09:54:47.0951405Z       "requiredStages": [
2026-08-28T09:54:47.0951676Z         "doc",
2026-08-28T09:54:47.0951947Z         "impl",
2026-08-28T09:54:47.0952213Z         "unit"
2026-08-28T09:54:47.0952488Z       ],
2026-08-28T09:54:47.0952765Z       "stages": {
2026-08-28T09:54:47.0953041Z         "doc": {
2026-08-28T09:54:47.0953341Z           "complete": true,
2026-08-28T09:54:47.0953628Z           "evidence": [
2026-08-28T09:54:47.0953894Z             {
2026-08-28T09:54:47.0954208Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.0954495Z               "line": 1148
2026-08-28T09:54:47.0954761Z             }
2026-08-28T09:54:47.0955024Z           ]
2026-08-28T09:54:47.0955291Z         },
2026-08-28T09:54:47.0955562Z         "impl": {
2026-08-28T09:54:47.0955848Z           "complete": true,
2026-08-28T09:54:47.0956144Z           "evidence": [
2026-08-28T09:54:47.0956415Z             {
2026-08-28T09:54:47.0956749Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0957040Z               "line": 10486
2026-08-28T09:54:47.0957306Z             },
2026-08-28T09:54:47.0957577Z             {
2026-08-28T09:54:47.0957901Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0958191Z               "line": 20183
2026-08-28T09:54:47.0958458Z             },
2026-08-28T09:54:47.0958725Z             {
2026-08-28T09:54:47.0959140Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0959431Z               "line": 20321
2026-08-28T09:54:47.0959703Z             },
2026-08-28T09:54:47.0959970Z             {
2026-08-28T09:54:47.0960301Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0960585Z               "line": 20353
2026-08-28T09:54:47.0960852Z             }
2026-08-28T09:54:47.0961116Z           ]
2026-08-28T09:54:47.0961387Z         },
2026-08-28T09:54:47.0961768Z         "int": {
2026-08-28T09:54:47.0962068Z           "complete": false,
2026-08-28T09:54:47.0962364Z           "evidence": []
2026-08-28T09:54:47.0962633Z         },
2026-08-28T09:54:47.0962906Z         "unit": {
2026-08-28T09:54:47.0963205Z           "complete": true,
2026-08-28T09:54:47.0963490Z           "evidence": [
2026-08-28T09:54:47.0963753Z             {
2026-08-28T09:54:47.0964091Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0964378Z               "line": 38875
2026-08-28T09:54:47.0964645Z             },
2026-08-28T09:54:47.0964917Z             {
2026-08-28T09:54:47.0965241Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.0965551Z               "line": 38919
2026-08-28T09:54:47.0965826Z             }
2026-08-28T09:54:47.0966103Z           ]
2026-08-28T09:54:47.0966389Z         }
2026-08-28T09:54:47.0966660Z       }
2026-08-28T09:54:47.0966923Z     },
2026-08-28T09:54:47.0967195Z     {
2026-08-28T09:54:47.0967500Z       "id": "REQ-INSTALL-2",
2026-08-28T09:54:47.0967923Z       "title": "Marketplace-repackaging-friendly install",
2026-08-28T09:54:47.0968231Z       "requiredStages": [
2026-08-28T09:54:47.0968503Z         "doc"
2026-08-28T09:54:47.0968770Z       ],
2026-08-28T09:54:47.0969128Z       "stages": {
2026-08-28T09:54:47.0969390Z         "doc": {
2026-08-28T09:54:47.0969686Z           "complete": true,
2026-08-28T09:54:47.0969977Z           "evidence": [
2026-08-28T09:54:47.0970249Z             {
2026-08-28T09:54:47.0970559Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.0970857Z               "line": 1132
2026-08-28T09:54:47.0971121Z             }
2026-08-28T09:54:47.0971394Z           ]
2026-08-28T09:54:47.0971661Z         },
2026-08-28T09:54:47.0971943Z         "impl": {
2026-08-28T09:54:47.0972243Z           "complete": false,
2026-08-28T09:54:47.0972539Z           "evidence": []
2026-08-28T09:54:47.0972811Z         },
2026-08-28T09:54:47.0973082Z         "int": {
2026-08-28T09:54:47.0973381Z           "complete": false,
2026-08-28T09:54:47.0973679Z           "evidence": []
2026-08-28T09:54:47.0974075Z         },
2026-08-28T09:54:47.0974351Z         "unit": {
2026-08-28T09:54:47.0974656Z           "complete": false,
2026-08-28T09:54:47.0974942Z           "evidence": []
2026-08-28T09:54:47.0975215Z         }
2026-08-28T09:54:47.0975486Z       }
2026-08-28T09:54:47.0975750Z     },
2026-08-28T09:54:47.0976021Z     {
2026-08-28T09:54:47.0976324Z       "id": "REQ-INSTALL-3",
2026-08-28T09:54:47.0976783Z       "title": "Idempotent + interactive-optional first run",
2026-08-28T09:54:47.0977083Z       "requiredStages": [
2026-08-28T09:54:47.0977360Z         "impl",
2026-08-28T09:54:47.0977622Z         "int"
2026-08-28T09:54:47.0977893Z       ],
2026-08-28T09:54:47.0978165Z       "stages": {
2026-08-28T09:54:47.0978437Z         "doc": {
2026-08-28T09:54:47.0978734Z           "complete": false,
2026-08-28T09:54:47.0979167Z           "evidence": []
2026-08-28T09:54:47.0979444Z         },
2026-08-28T09:54:47.0979711Z         "impl": {
2026-08-28T09:54:47.0980022Z           "complete": true,
2026-08-28T09:54:47.0980308Z           "evidence": [
2026-08-28T09:54:47.0980575Z             {
2026-08-28T09:54:47.0980928Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.0981210Z               "line": 102
2026-08-28T09:54:47.0981480Z             },
2026-08-28T09:54:47.0981744Z             {
2026-08-28T09:54:47.0982082Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.0982368Z               "line": 113
2026-08-28T09:54:47.0982635Z             },
2026-08-28T09:54:47.0982898Z             {
2026-08-28T09:54:47.0983236Z               "path": "installer/install.sh",
2026-08-28T09:54:47.0983513Z               "line": 81
2026-08-28T09:54:47.0983781Z             }
2026-08-28T09:54:47.0984046Z           ]
2026-08-28T09:54:47.0984305Z         },
2026-08-28T09:54:47.0984577Z         "int": {
2026-08-28T09:54:47.0984868Z           "complete": true,
2026-08-28T09:54:47.0985150Z           "evidence": [
2026-08-28T09:54:47.0985417Z             {
2026-08-28T09:54:47.0985928Z               "path": "crates/spt/tests/oneliner_e2e.rs",
2026-08-28T09:54:47.0986218Z               "line": 167
2026-08-28T09:54:47.0986480Z             }
2026-08-28T09:54:47.0986751Z           ]
2026-08-28T09:54:47.0987024Z         },
2026-08-28T09:54:47.0987305Z         "unit": {
2026-08-28T09:54:47.0987601Z           "complete": false,
2026-08-28T09:54:47.0987892Z           "evidence": []
2026-08-28T09:54:47.0988163Z         }
2026-08-28T09:54:47.0988434Z       }
2026-08-28T09:54:47.0988701Z     },
2026-08-28T09:54:47.0989043Z     {
2026-08-28T09:54:47.0989342Z       "id": "REQ-INSTALL-4",
2026-08-28T09:54:47.0991345Z       "title": "Adapter registration lifecycle: spt adapter add (--github, manifest-first, install-is-first-update) + soft-deregister remove + optional manifest uninstall template; node-local registered-adapter set self-update ripples over",
2026-08-28T09:54:47.0991684Z       "requiredStages": [
2026-08-28T09:54:47.0991958Z         "impl",
2026-08-28T09:54:47.0992242Z         "unit"
2026-08-28T09:54:47.0992505Z       ],
2026-08-28T09:54:47.0992791Z       "stages": {
2026-08-28T09:54:47.0993068Z         "doc": {
2026-08-28T09:54:47.0993368Z           "complete": false,
2026-08-28T09:54:47.0993659Z           "evidence": []
2026-08-28T09:54:47.0993931Z         },
2026-08-28T09:54:47.0994207Z         "impl": {
2026-08-28T09:54:47.0994520Z           "complete": true,
2026-08-28T09:54:47.0994804Z           "evidence": [
2026-08-28T09:54:47.0995067Z             {
2026-08-28T09:54:47.0995491Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:47.0995776Z               "line": 165
2026-08-28T09:54:47.0996044Z             },
2026-08-28T09:54:47.0996320Z             {
2026-08-28T09:54:47.0996707Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.0996997Z               "line": 29
2026-08-28T09:54:47.0997265Z             },
2026-08-28T09:54:47.0997531Z             {
2026-08-28T09:54:47.0997932Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.0998336Z               "line": 299
2026-08-28T09:54:47.0998613Z             },
2026-08-28T09:54:47.0998880Z             {
2026-08-28T09:54:47.0999352Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.0999642Z               "line": 417
2026-08-28T09:54:47.0999912Z             },
2026-08-28T09:54:47.1000183Z             {
2026-08-28T09:54:47.1000579Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.1000860Z               "line": 447
2026-08-28T09:54:47.1001132Z             },
2026-08-28T09:54:47.1001399Z             {
2026-08-28T09:54:47.1001785Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.1002071Z               "line": 495
2026-08-28T09:54:47.1002339Z             },
2026-08-28T09:54:47.1002605Z             {
2026-08-28T09:54:47.1002932Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1003217Z               "line": 20200
2026-08-28T09:54:47.1003518Z             }
2026-08-28T09:54:47.1003779Z           ]
2026-08-28T09:54:47.1004042Z         },
2026-08-28T09:54:47.1004319Z         "int": {
2026-08-28T09:54:47.1004610Z           "complete": false,
2026-08-28T09:54:47.1004901Z           "evidence": []
2026-08-28T09:54:47.1005162Z         },
2026-08-28T09:54:47.1005431Z         "unit": {
2026-08-28T09:54:47.1005726Z           "complete": true,
2026-08-28T09:54:47.1006007Z           "evidence": [
2026-08-28T09:54:47.1006280Z             {
2026-08-28T09:54:47.1006695Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:47.1006980Z               "line": 381
2026-08-28T09:54:47.1007243Z             },
2026-08-28T09:54:47.1007515Z             {
2026-08-28T09:54:47.1007895Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.1008182Z               "line": 935
2026-08-28T09:54:47.1008453Z             },
2026-08-28T09:54:47.1008712Z             {
2026-08-28T09:54:47.1009173Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.1009632Z               "line": 1058
2026-08-28T09:54:47.1009903Z             },
2026-08-28T09:54:47.1010174Z             {
2026-08-28T09:54:47.1010557Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.1010843Z               "line": 1078
2026-08-28T09:54:47.1011115Z             },
2026-08-28T09:54:47.1011392Z             {
2026-08-28T09:54:47.1011716Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1012007Z               "line": 31296
2026-08-28T09:54:47.1012270Z             }
2026-08-28T09:54:47.1012543Z           ]
2026-08-28T09:54:47.1012809Z         }
2026-08-28T09:54:47.1013083Z       }
2026-08-28T09:54:47.1013344Z     },
2026-08-28T09:54:47.1013611Z     {
2026-08-28T09:54:47.1013916Z       "id": "REQ-INSTALL-5",
2026-08-28T09:54:47.1018455Z       "title": "Non-interactive install path: the install path doubles as every adapter's pack-in on-demand install (no second mechanism); sha256-verified fetch; user-PATH registration. HISTORY: 'the canonical one-liner' — since THE-FORKENING (ADR-0036) the canonical path is gh + the spt install verb (itself non-interactive, REQ-INSTALL-BOOTSTRAP-VERB); the scripts this REQ's evidence attests remain as the hermetic CI fixture + air-gap fallback, still non-interactive by construction (doyle-ratified 2026-07-14).",
2026-08-28T09:54:47.1018780Z       "requiredStages": [
2026-08-28T09:54:47.1019127Z         "impl",
2026-08-28T09:54:47.1019395Z         "int"
2026-08-28T09:54:47.1019653Z       ],
2026-08-28T09:54:47.1019920Z       "stages": {
2026-08-28T09:54:47.1020178Z         "doc": {
2026-08-28T09:54:47.1020468Z           "complete": false,
2026-08-28T09:54:47.1020767Z           "evidence": []
2026-08-28T09:54:47.1021027Z         },
2026-08-28T09:54:47.1021304Z         "impl": {
2026-08-28T09:54:47.1021595Z           "complete": true,
2026-08-28T09:54:47.1021890Z           "evidence": [
2026-08-28T09:54:47.1022163Z             {
2026-08-28T09:54:47.1022501Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.1022948Z               "line": 7
2026-08-28T09:54:47.1023220Z             },
2026-08-28T09:54:47.1023492Z             {
2026-08-28T09:54:47.1023819Z               "path": "installer/install.sh",
2026-08-28T09:54:47.1024100Z               "line": 8
2026-08-28T09:54:47.1024362Z             }
2026-08-28T09:54:47.1024638Z           ]
2026-08-28T09:54:47.1024914Z         },
2026-08-28T09:54:47.1025186Z         "int": {
2026-08-28T09:54:47.1025486Z           "complete": true,
2026-08-28T09:54:47.1025772Z           "evidence": [
2026-08-28T09:54:47.1026050Z             {
2026-08-28T09:54:47.1026466Z               "path": "crates/spt/tests/oneliner_e2e.rs",
2026-08-28T09:54:47.1026752Z               "line": 22
2026-08-28T09:54:47.1027019Z             }
2026-08-28T09:54:47.1027291Z           ]
2026-08-28T09:54:47.1027563Z         },
2026-08-28T09:54:47.1027839Z         "unit": {
2026-08-28T09:54:47.1028144Z           "complete": false,
2026-08-28T09:54:47.1028435Z           "evidence": []
2026-08-28T09:54:47.1028707Z         }
2026-08-28T09:54:47.1029049Z       }
2026-08-28T09:54:47.1029316Z     },
2026-08-28T09:54:47.1029579Z     {
2026-08-28T09:54:47.1029889Z       "id": "REQ-INSTALL-6",
2026-08-28T09:54:47.1033395Z       "title": "Linux elevation install leg: install.sh symlinks the binary into a sudo-reachable path (/usr/local/bin; graceful print-the-one-liner when unelevated) so sudo spt resolves; first sudo spt detects elevation and prompts ONCE for the default user account — thereafter any elevated daemon launch runs daemon + state under that account, never root (KH 5.7 interplay verified) (M8 decision 8)",
2026-08-28T09:54:47.1033701Z       "requiredStages": [
2026-08-28T09:54:47.1033977Z         "impl",
2026-08-28T09:54:47.1034261Z         "unit"
2026-08-28T09:54:47.1034530Z       ],
2026-08-28T09:54:47.1034807Z       "stages": {
2026-08-28T09:54:47.1035070Z         "doc": {
2026-08-28T09:54:47.1035371Z           "complete": false,
2026-08-28T09:54:47.1035780Z           "evidence": []
2026-08-28T09:54:47.1036047Z         },
2026-08-28T09:54:47.1036332Z         "impl": {
2026-08-28T09:54:47.1036628Z           "complete": true,
2026-08-28T09:54:47.1036913Z           "evidence": [
2026-08-28T09:54:47.1037188Z             {
2026-08-28T09:54:47.1037565Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:47.1037837Z               "line": 73
2026-08-28T09:54:47.1038114Z             },
2026-08-28T09:54:47.1038380Z             {
2026-08-28T09:54:47.1038758Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:47.1039120Z               "line": 880
2026-08-28T09:54:47.1039392Z             },
2026-08-28T09:54:47.1039656Z             {
2026-08-28T09:54:47.1040039Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:47.1040329Z               "line": 191
2026-08-28T09:54:47.1040595Z             },
2026-08-28T09:54:47.1040868Z             {
2026-08-28T09:54:47.1041332Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:47.1041622Z               "line": 276
2026-08-28T09:54:47.1041892Z             },
2026-08-28T09:54:47.1042161Z             {
2026-08-28T09:54:47.1042495Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:47.1042791Z               "line": 176
2026-08-28T09:54:47.1043063Z             },
2026-08-28T09:54:47.1043330Z             {
2026-08-28T09:54:47.1043659Z               "path": "installer/install.sh",
2026-08-28T09:54:47.1043941Z               "line": 106
2026-08-28T09:54:47.1044208Z             }
2026-08-28T09:54:47.1044475Z           ]
2026-08-28T09:54:47.1044745Z         },
2026-08-28T09:54:47.1045009Z         "int": {
2026-08-28T09:54:47.1045306Z           "complete": false,
2026-08-28T09:54:47.1045597Z           "evidence": []
2026-08-28T09:54:47.1045859Z         },
2026-08-28T09:54:47.1046136Z         "unit": {
2026-08-28T09:54:47.1046427Z           "complete": true,
2026-08-28T09:54:47.1046707Z           "evidence": [
2026-08-28T09:54:47.1046964Z             {
2026-08-28T09:54:47.1047359Z               "path": "crates/spt-daemon/src/deelevate.rs",
2026-08-28T09:54:47.1047758Z               "line": 894
2026-08-28T09:54:47.1048025Z             }
2026-08-28T09:54:47.1048296Z           ]
2026-08-28T09:54:47.1048558Z         }
2026-08-28T09:54:47.1048826Z       }
2026-08-28T09:54:47.1049174Z     },
2026-08-28T09:54:47.1049454Z     {
2026-08-28T09:54:47.1049755Z       "id": "REQ-INSTALL-7",
2026-08-28T09:54:47.1070419Z       "title": "Windows inbound reachability: the install path RECONCILES the product inbound-UDP firewall rule onto the binder it places — create when missing, REPOINT when the rule names a different image, and report which it did — and the daemon self-detects blocked inbound and renders it as the no-connection state in subnet status + the coming-online banner (covers user-scope installs that skip the elevated leg — never a silent NO_SEED_HOLDER dead-end) (M8 root cause 3). AMENDED BY REPLACEMENT (releases#173, doyle ruling 2026-08-21): the previous title said the elevated leg REGISTERS the rule, which is create-only and describes half the behaviour. A program-scoped rule admits exactly one path, so the moment the binder can move is the moment the rule can go stale — and a stale rule reads GREEN BY NAME while inbound is dead on the Public profile (KNOWN-HAZARDS 7.61; field specimen 2026-08-06, a rule naming an actions-runner debug exe on a node whose installed binder serves, still reproducing at c62904e7). REPOINT-IF-DIFFERENT IS THE LOAD-BEARING ARM and create belongs to first install: an update swaps the binary in place at the same canonical path, so the program scope does not change and the reconcile is a no-op in the common case. SCOPED TO THE PRODUCT-NAMED RULE ALWAYS — the probe queries by name and the repair deletes by name, so dev and CI rules naming spt images on the same box are never read and never touched; they can be load-bearing for runner jobs, and a delete-by-image sweep would read as tidying while eating one. Elevation unavailable degrades LOUD and NEVER FATAL: the rule is left exactly as it was and the operator is handed the exact command, because a placed binder with a stated reachability problem beats a refused installation. The durable verdict is NOT written by the installer — the inbound record is pinned to the binder pid AND image (REQ-INBOUND-VERDICT-RECORD-BINDER-PINNED), so a record authored by a short-lived installer re-derives as Unknown for every reader, which is the self-erase class releases#172 closed; the verdict stays the daemon's to write at bind. Gate: doc — the CONTEXT.md install entry stating that placement reconciles the rule and what happens unelevated; impl — the pure reconcile decision seam, its thin netsh effector, and the call at binder placement; unit — the four decision cases (missing, correct, stale path, cannot-elevate) decided with no netsh and no privilege, plus a named cell proving a reconcile never reaches a rule it was not asked about.",
2026-08-28T09:54:47.1071019Z       "requiredStages": [
2026-08-28T09:54:47.1071313Z         "doc",
2026-08-28T09:54:47.1071594Z         "impl",
2026-08-28T09:54:47.1071876Z         "unit"
2026-08-28T09:54:47.1072148Z       ],
2026-08-28T09:54:47.1072420Z       "stages": {
2026-08-28T09:54:47.1072697Z         "doc": {
2026-08-28T09:54:47.1073002Z           "complete": true,
2026-08-28T09:54:47.1073273Z           "evidence": [
2026-08-28T09:54:47.1073567Z             {
2026-08-28T09:54:47.1073981Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.1074266Z               "line": 1139
2026-08-28T09:54:47.1074523Z             }
2026-08-28T09:54:47.1074795Z           ]
2026-08-28T09:54:47.1075072Z         },
2026-08-28T09:54:47.1075353Z         "impl": {
2026-08-28T09:54:47.1075649Z           "complete": true,
2026-08-28T09:54:47.1075931Z           "evidence": [
2026-08-28T09:54:47.1076204Z             {
2026-08-28T09:54:47.1076587Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.1076872Z               "line": 193
2026-08-28T09:54:47.1077148Z             },
2026-08-28T09:54:47.1077419Z             {
2026-08-28T09:54:47.1077963Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.1078254Z               "line": 266
2026-08-28T09:54:47.1078526Z             },
2026-08-28T09:54:47.1078799Z             {
2026-08-28T09:54:47.1079233Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1079548Z               "line": 10090
2026-08-28T09:54:47.1079829Z             },
2026-08-28T09:54:47.1080096Z             {
2026-08-28T09:54:47.1080430Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1080712Z               "line": 10154
2026-08-28T09:54:47.1080984Z             },
2026-08-28T09:54:47.1081255Z             {
2026-08-28T09:54:47.1081580Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1081864Z               "line": 13567
2026-08-28T09:54:47.1082131Z             },
2026-08-28T09:54:47.1082394Z             {
2026-08-28T09:54:47.1082728Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.1083013Z               "line": 159
2026-08-28T09:54:47.1083277Z             }
2026-08-28T09:54:47.1083548Z           ]
2026-08-28T09:54:47.1083819Z         },
2026-08-28T09:54:47.1084085Z         "int": {
2026-08-28T09:54:47.1084378Z           "complete": true,
2026-08-28T09:54:47.1084660Z           "evidence": [
2026-08-28T09:54:47.1084927Z             {
2026-08-28T09:54:47.1085398Z               "path": "crates/spt/tests/install_firewall_wiring_e2e.rs",
2026-08-28T09:54:47.1085684Z               "line": 79
2026-08-28T09:54:47.1085948Z             }
2026-08-28T09:54:47.1086214Z           ]
2026-08-28T09:54:47.1086487Z         },
2026-08-28T09:54:47.1086754Z         "unit": {
2026-08-28T09:54:47.1087057Z           "complete": true,
2026-08-28T09:54:47.1087340Z           "evidence": [
2026-08-28T09:54:47.1087608Z             {
2026-08-28T09:54:47.1087994Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.1088280Z               "line": 693
2026-08-28T09:54:47.1088662Z             },
2026-08-28T09:54:47.1088928Z             {
2026-08-28T09:54:47.1089434Z               "path": "crates/spt-daemon/src/firewall.rs",
2026-08-28T09:54:47.1089718Z               "line": 768
2026-08-28T09:54:47.1089993Z             }
2026-08-28T09:54:47.1090255Z           ]
2026-08-28T09:54:47.1090527Z         }
2026-08-28T09:54:47.1090789Z       }
2026-08-28T09:54:47.1091061Z     },
2026-08-28T09:54:47.1091319Z     {
2026-08-28T09:54:47.1091625Z       "id": "REQ-INSTALL-8",
2026-08-28T09:54:47.1095019Z       "title": "OS-service registration (REQ-INSTALL-1's deferred third leg): Linux systemd USER service + loginctl enable-linger (linger rides the elevated install leg; daemon starts at boot pre-login, user universe per KH 5.7, systemctl --user managed); Windows scheduled task at-logon (interactive session, no stored credentials); a node is reachable after reboot without any manual spt invocation (M8 decision 17)",
2026-08-28T09:54:47.1095315Z       "requiredStages": [
2026-08-28T09:54:47.1095601Z         "impl"
2026-08-28T09:54:47.1095864Z       ],
2026-08-28T09:54:47.1096145Z       "stages": {
2026-08-28T09:54:47.1096418Z         "doc": {
2026-08-28T09:54:47.1096713Z           "complete": false,
2026-08-28T09:54:47.1097019Z           "evidence": []
2026-08-28T09:54:47.1097305Z         },
2026-08-28T09:54:47.1097578Z         "impl": {
2026-08-28T09:54:47.1097872Z           "complete": true,
2026-08-28T09:54:47.1098153Z           "evidence": [
2026-08-28T09:54:47.1098421Z             {
2026-08-28T09:54:47.1098768Z               "path": "installer/install.ps1",
2026-08-28T09:54:47.1099136Z               "line": 197
2026-08-28T09:54:47.1099412Z             },
2026-08-28T09:54:47.1099679Z             {
2026-08-28T09:54:47.1100008Z               "path": "installer/install.sh",
2026-08-28T09:54:47.1100297Z               "line": 123
2026-08-28T09:54:47.1100563Z             }
2026-08-28T09:54:47.1100830Z           ]
2026-08-28T09:54:47.1101087Z         },
2026-08-28T09:54:47.1101364Z         "int": {
2026-08-28T09:54:47.1101669Z           "complete": false,
2026-08-28T09:54:47.1102194Z           "evidence": []
2026-08-28T09:54:47.1102472Z         },
2026-08-28T09:54:47.1102743Z         "unit": {
2026-08-28T09:54:47.1103041Z           "complete": false,
2026-08-28T09:54:47.1103327Z           "evidence": []
2026-08-28T09:54:47.1103604Z         }
2026-08-28T09:54:47.1103872Z       }
2026-08-28T09:54:47.1104139Z     },
2026-08-28T09:54:47.1104406Z     {
2026-08-28T09:54:47.1104706Z       "id": "REQ-INSTALL-9",
2026-08-28T09:54:47.1108230Z       "title": "Adapter add from a GitHub release archive: `spt adapter add --release <user/repo> [--tag <tag>] [--asset <name>]` fetches a `.spt` tar asset over HTTPS+GitHub trust, extracts it to the durable adapters/_github home, and registers the root — ships built binaries source-free and versioned (the distribution path for an adapter whose dev repo is a monorepo subdir, where --github root-only clone does not fit)",
2026-08-28T09:54:47.1108547Z       "requiredStages": [
2026-08-28T09:54:47.1108833Z         "doc",
2026-08-28T09:54:47.1109206Z         "impl",
2026-08-28T09:54:47.1109477Z         "unit"
2026-08-28T09:54:47.1109743Z       ],
2026-08-28T09:54:47.1110020Z       "stages": {
2026-08-28T09:54:47.1110297Z         "doc": {
2026-08-28T09:54:47.1110582Z           "complete": true,
2026-08-28T09:54:47.1110871Z           "evidence": [
2026-08-28T09:54:47.1111133Z             {
2026-08-28T09:54:47.1111448Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.1111725Z               "line": 1148
2026-08-28T09:54:47.1112001Z             }
2026-08-28T09:54:47.1112268Z           ]
2026-08-28T09:54:47.1112525Z         },
2026-08-28T09:54:47.1112801Z         "impl": {
2026-08-28T09:54:47.1113092Z           "complete": true,
2026-08-28T09:54:47.1113375Z           "evidence": [
2026-08-28T09:54:47.1113635Z             {
2026-08-28T09:54:47.1113969Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1114246Z               "line": 10321
2026-08-28T09:54:47.1114646Z             },
2026-08-28T09:54:47.1114914Z             {
2026-08-28T09:54:47.1115243Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1115524Z               "line": 10390
2026-08-28T09:54:47.1115789Z             },
2026-08-28T09:54:47.1116059Z             {
2026-08-28T09:54:47.1116388Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1116669Z               "line": 10457
2026-08-28T09:54:47.1116937Z             },
2026-08-28T09:54:47.1117204Z             {
2026-08-28T09:54:47.1117533Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1117814Z               "line": 20467
2026-08-28T09:54:47.1118076Z             },
2026-08-28T09:54:47.1118342Z             {
2026-08-28T09:54:47.1118670Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1119026Z               "line": 20479
2026-08-28T09:54:47.1119302Z             }
2026-08-28T09:54:47.1119570Z           ]
2026-08-28T09:54:47.1119832Z         },
2026-08-28T09:54:47.1120100Z         "int": {
2026-08-28T09:54:47.1120391Z           "complete": false,
2026-08-28T09:54:47.1120686Z           "evidence": []
2026-08-28T09:54:47.1120943Z         },
2026-08-28T09:54:47.1121209Z         "unit": {
2026-08-28T09:54:47.1121502Z           "complete": true,
2026-08-28T09:54:47.1121788Z           "evidence": [
2026-08-28T09:54:47.1122055Z             {
2026-08-28T09:54:47.1122389Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1122671Z               "line": 27802
2026-08-28T09:54:47.1122934Z             },
2026-08-28T09:54:47.1123205Z             {
2026-08-28T09:54:47.1123525Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1123806Z               "line": 31326
2026-08-28T09:54:47.1124067Z             }
2026-08-28T09:54:47.1124334Z           ]
2026-08-28T09:54:47.1124596Z         }
2026-08-28T09:54:47.1124859Z       }
2026-08-28T09:54:47.1125125Z     },
2026-08-28T09:54:47.1125382Z     {
2026-08-28T09:54:47.1125716Z       "id": "REQ-INSTALL-BOOTSTRAP-VERB",
2026-08-28T09:54:47.1136867Z       "title": "THE-FORKENING W1 (ADR-0036 §3, bootstrap shape b operator-ruled): virgin-box install = `gh release download` the platform binary + ONE self-install verb in the binary itself — the verb places the binary at the canonical install path (the path self-update already respawns from, v0.4.2 lesson), registers user PATH, and leaves first-run identity/daemon-start to the existing idempotent first-run; hosted one-liner install scripts (curl|sh / irm|iex at the dead Pages URL) are RETIRED. Non-interactive (CONTEXT.md Installation: the install path doubles as every adapter's pack-in on-demand install). Windows UAC-740 gotcha binding: the downloaded exe keeps the `spt-*` asset name and the verb lives INSIDE spt — no installer-detection trigger words in exe names. README (bs-core) documents: install gh -> gh auth login -> gh release download -> the verb. Gate: unit — verb places/registers idempotently, refuses cross-platform binaries (platform-stamp check exists, v0.3.2); int — from a clean SPT_HOME+PATH sim, downloaded-binary self-install yields a working `spt` on PATH whose `spt update fetch` then speaks the gh channel; doc — README install section rewritten. Kin REQ-UPDATE-GH-TRANSPORT, REQ-INSTALL-1/2 (the two-paths model this reshapes), ADR-0036.",
2026-08-28T09:54:47.1137385Z       "requiredStages": [
2026-08-28T09:54:47.1137661Z         "doc",
2026-08-28T09:54:47.1137933Z         "impl",
2026-08-28T09:54:47.1138199Z         "unit",
2026-08-28T09:54:47.1138466Z         "int"
2026-08-28T09:54:47.1138734Z       ],
2026-08-28T09:54:47.1139086Z       "stages": {
2026-08-28T09:54:47.1139348Z         "doc": {
2026-08-28T09:54:47.1139645Z           "complete": true,
2026-08-28T09:54:47.1139924Z           "evidence": [
2026-08-28T09:54:47.1140199Z             {
2026-08-28T09:54:47.1140519Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.1140795Z               "line": 1139
2026-08-28T09:54:47.1141129Z             },
2026-08-28T09:54:47.1141395Z             {
2026-08-28T09:54:47.1141915Z               "path": "docs-site/src/harness-contract/install-on-demand.md",
2026-08-28T09:54:47.1142348Z               "line": 3
2026-08-28T09:54:47.1142618Z             },
2026-08-28T09:54:47.1142886Z             {
2026-08-28T09:54:47.1143229Z               "path": "docs-site/src/index.md",
2026-08-28T09:54:47.1143509Z               "line": 23
2026-08-28T09:54:47.1148154Z             },
2026-08-28T09:54:47.1148458Z             {
2026-08-28T09:54:47.1148875Z               "path": "docs-site/src/quickstart/messaging.md",
2026-08-28T09:54:47.1149241Z               "line": 16
2026-08-28T09:54:47.1149505Z             },
2026-08-28T09:54:47.1149771Z             {
2026-08-28T09:54:47.1150167Z               "path": "docs-site/src/reference/install.md",
2026-08-28T09:54:47.1150437Z               "line": 3
2026-08-28T09:54:47.1150706Z             }
2026-08-28T09:54:47.1150969Z           ]
2026-08-28T09:54:47.1151222Z         },
2026-08-28T09:54:47.1151494Z         "impl": {
2026-08-28T09:54:47.1151789Z           "complete": true,
2026-08-28T09:54:47.1152085Z           "evidence": [
2026-08-28T09:54:47.1152358Z             {
2026-08-28T09:54:47.1152687Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1152970Z               "line": 2443
2026-08-28T09:54:47.1153239Z             },
2026-08-28T09:54:47.1153507Z             {
2026-08-28T09:54:47.1153831Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1154113Z               "line": 9897
2026-08-28T09:54:47.1154380Z             },
2026-08-28T09:54:47.1154647Z             {
2026-08-28T09:54:47.1154972Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1155253Z               "line": 9907
2026-08-28T09:54:47.1155520Z             },
2026-08-28T09:54:47.1155785Z             {
2026-08-28T09:54:47.1156109Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1156395Z               "line": 9957
2026-08-28T09:54:47.1156677Z             },
2026-08-28T09:54:47.1156939Z             {
2026-08-28T09:54:47.1157268Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1157550Z               "line": 9972
2026-08-28T09:54:47.1157973Z             },
2026-08-28T09:54:47.1158243Z             {
2026-08-28T09:54:47.1158572Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1158857Z               "line": 10037
2026-08-28T09:54:47.1159211Z             },
2026-08-28T09:54:47.1159477Z             {
2026-08-28T09:54:47.1159802Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1160084Z               "line": 10072
2026-08-28T09:54:47.1160346Z             }
2026-08-28T09:54:47.1160612Z           ]
2026-08-28T09:54:47.1160878Z         },
2026-08-28T09:54:47.1161147Z         "int": {
2026-08-28T09:54:47.1161444Z           "complete": true,
2026-08-28T09:54:47.1161725Z           "evidence": [
2026-08-28T09:54:47.1161992Z             {
2026-08-28T09:54:47.1162397Z               "path": "crates/spt/tests/bootstrap_verb_e2e.rs",
2026-08-28T09:54:47.1162688Z               "line": 18
2026-08-28T09:54:47.1162951Z             }
2026-08-28T09:54:47.1163223Z           ]
2026-08-28T09:54:47.1163497Z         },
2026-08-28T09:54:47.1163762Z         "unit": {
2026-08-28T09:54:47.1164058Z           "complete": true,
2026-08-28T09:54:47.1164335Z           "evidence": [
2026-08-28T09:54:47.1164606Z             {
2026-08-28T09:54:47.1164921Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1165203Z               "line": 34521
2026-08-28T09:54:47.1165465Z             },
2026-08-28T09:54:47.1165736Z             {
2026-08-28T09:54:47.1166061Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1166340Z               "line": 34539
2026-08-28T09:54:47.1166613Z             }
2026-08-28T09:54:47.1166875Z           ]
2026-08-28T09:54:47.1167138Z         }
2026-08-28T09:54:47.1167400Z       }
2026-08-28T09:54:47.1167671Z     },
2026-08-28T09:54:47.1167928Z     {
2026-08-28T09:54:47.1168252Z       "id": "REQ-IO-COMMUNE-EVENT",
2026-08-28T09:54:47.1180674Z       "title": "A COMMUNE IS ACCOUNTED AT THE DELETION CORE ALREADY PERFORMS, CARRYING THE DROP FILE CONTENT VERBATIM (operator ruling 5). The event fires where `ingest_drops` consumes a commune drop and unlinks it — the seam core already owns — and its payload is the bytes of that file, never Psyche output, never echo-commune output, never the composed brief a resume renders from it. Wake markers (`!!wake!!`) are the harness adapter's construct and get ZERO special treatment here: core carries the text through untouched and does not parse, strip, or act on them. TWO DELETIONS EXIST AT THIS SEAM AND ONLY ONE IS A CONSUMPTION: the F-032 commit-before-delete branch (REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE) deliberately PRESERVES a commune drop whose project slice could not be committed, rewriting it in place for a later resolvable ingest, and deletes only a SIGNOFF source there — a drop on that branch has not been consumed, it is coming back, and emitting for it would double-fire when the real consumption later deletes the same content. Emission is therefore keyed on the CONSUMPTION OUTCOME the ingest already reports (`preserved` false) rather than on reaching a call to remove_file, so the preserved path is excluded structurally instead of by a condition a later edit can drift past. A DELETED SIGNOFF DROP EMITS NOTHING: the vocabulary has no SIGNOFF token and one is not borrowed. Emission never alters ingest: a drop is consumed, preserved, or left to retry exactly as it is today regardless of the funnel.",
2026-08-28T09:54:47.1194429Z       "requiredStages": [
2026-08-28T09:54:47.1195111Z         "doc",
2026-08-28T09:54:47.1195710Z         "impl",
2026-08-28T09:54:47.1196330Z         "unit",
2026-08-28T09:54:47.1196930Z         "int"
2026-08-28T09:54:47.1197513Z       ],
2026-08-28T09:54:47.1198068Z       "stages": {
2026-08-28T09:54:47.1198664Z         "doc": {
2026-08-28T09:54:47.1199361Z           "complete": true,
2026-08-28T09:54:47.1200054Z           "evidence": [
2026-08-28T09:54:47.1200698Z             {
2026-08-28T09:54:47.1201375Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1202238Z               "line": 398
2026-08-28T09:54:47.1203052Z             }
2026-08-28T09:54:47.1203632Z           ]
2026-08-28T09:54:47.1204190Z         },
2026-08-28T09:54:47.1204761Z         "impl": {
2026-08-28T09:54:47.1205381Z           "complete": true,
2026-08-28T09:54:47.1206078Z           "evidence": [
2026-08-28T09:54:47.1206712Z             {
2026-08-28T09:54:47.1207405Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1208277Z               "line": 424
2026-08-28T09:54:47.1208933Z             },
2026-08-28T09:54:47.1209602Z             {
2026-08-28T09:54:47.1210294Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1211171Z               "line": 438
2026-08-28T09:54:47.1211829Z             },
2026-08-28T09:54:47.1212435Z             {
2026-08-28T09:54:47.1213142Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1214010Z               "line": 936
2026-08-28T09:54:47.1214658Z             },
2026-08-28T09:54:47.1215241Z             {
2026-08-28T09:54:47.1215913Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.1216816Z               "line": 152
2026-08-28T09:54:47.1217464Z             },
2026-08-28T09:54:47.1218051Z             {
2026-08-28T09:54:47.1218722Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.1219676Z               "line": 354
2026-08-28T09:54:47.1220328Z             }
2026-08-28T09:54:47.1220916Z           ]
2026-08-28T09:54:47.1221486Z         },
2026-08-28T09:54:47.1222055Z         "int": {
2026-08-28T09:54:47.1222671Z           "complete": true,
2026-08-28T09:54:47.1223368Z           "evidence": [
2026-08-28T09:54:47.1223998Z             {
2026-08-28T09:54:47.1224795Z               "path": "crates/spt-daemon/tests/commune_io_events_int.rs",
2026-08-28T09:54:47.1225772Z               "line": 26
2026-08-28T09:54:47.1226406Z             }
2026-08-28T09:54:47.1226991Z           ]
2026-08-28T09:54:47.1227676Z         },
2026-08-28T09:54:47.1228253Z         "unit": {
2026-08-28T09:54:47.1228893Z           "complete": true,
2026-08-28T09:54:47.1229682Z           "evidence": [
2026-08-28T09:54:47.1230321Z             {
2026-08-28T09:54:47.1231022Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1231898Z               "line": 1948
2026-08-28T09:54:47.1232554Z             },
2026-08-28T09:54:47.1233141Z             {
2026-08-28T09:54:47.1233832Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1234700Z               "line": 1976
2026-08-28T09:54:47.1235356Z             },
2026-08-28T09:54:47.1235937Z             {
2026-08-28T09:54:47.1236604Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.1237465Z               "line": 408
2026-08-28T09:54:47.1238117Z             },
2026-08-28T09:54:47.1238708Z             {
2026-08-28T09:54:47.1239443Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.1240290Z               "line": 443
2026-08-28T09:54:47.1240953Z             }
2026-08-28T09:54:47.1241650Z           ]
2026-08-28T09:54:47.1242226Z         }
2026-08-28T09:54:47.1242790Z       }
2026-08-28T09:54:47.1243353Z     },
2026-08-28T09:54:47.1243911Z     {
2026-08-28T09:54:47.1244546Z       "id": "REQ-IO-COMMUNE-FAIL-EVENT",
2026-08-28T09:54:47.1253289Z       "title": "A FAILED COMMUNE INGEST EMITS A NAMED REASON AND LEAVES ITS FILE ON DISK (operator ruling 6). Today a failing ingest is a bare `PSYCHE_INGEST_FAIL` line on the daemon's stderr — the failure is real, the drop survives as the on-disk diagnostic, and NOBODY IS TOLD: the measured instance is six such lines across three agents in one day, produced by a shared-checkout git index.lock collision, none of which reached the agents whose context was not rebuilt. The event is the push signal that silence is missing; the surviving FILE remains the diagnostic and is never deleted by the failure path. The reason is CARRIED, not re-derived: the sweep already composes a named reason and already keeps the FIRST failure across drop dirs, and the event publishes that same string, so the event and the log line can never disagree about why. Emission is best-effort and never alters ingest — a failed ingest retries on the next pass exactly as it does today.",
2026-08-28T09:54:47.1261869Z       "requiredStages": [
2026-08-28T09:54:47.1262546Z         "doc",
2026-08-28T09:54:47.1263151Z         "impl",
2026-08-28T09:54:47.1263746Z         "unit",
2026-08-28T09:54:47.1264349Z         "int"
2026-08-28T09:54:47.1264930Z       ],
2026-08-28T09:54:47.1265503Z       "stages": {
2026-08-28T09:54:47.1266094Z         "doc": {
2026-08-28T09:54:47.1266721Z           "complete": true,
2026-08-28T09:54:47.1267412Z           "evidence": [
2026-08-28T09:54:47.1268042Z             {
2026-08-28T09:54:47.1268723Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1269668Z               "line": 424
2026-08-28T09:54:47.1270312Z             }
2026-08-28T09:54:47.1270914Z           ]
2026-08-28T09:54:47.1271481Z         },
2026-08-28T09:54:47.1272066Z         "impl": {
2026-08-28T09:54:47.1272701Z           "complete": true,
2026-08-28T09:54:47.1273392Z           "evidence": [
2026-08-28T09:54:47.1274031Z             {
2026-08-28T09:54:47.1274737Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1275629Z               "line": 439
2026-08-28T09:54:47.1276287Z             },
2026-08-28T09:54:47.1276866Z             {
2026-08-28T09:54:47.1277553Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.1278435Z               "line": 958
2026-08-28T09:54:47.1279155Z             }
2026-08-28T09:54:47.1279740Z           ]
2026-08-28T09:54:47.1280300Z         },
2026-08-28T09:54:47.1280877Z         "int": {
2026-08-28T09:54:47.1281502Z           "complete": true,
2026-08-28T09:54:47.1282208Z           "evidence": [
2026-08-28T09:54:47.1282840Z             {
2026-08-28T09:54:47.1283614Z               "path": "crates/spt-daemon/tests/commune_io_events_int.rs",
2026-08-28T09:54:47.1284714Z               "line": 27
2026-08-28T09:54:47.1285369Z             }
2026-08-28T09:54:47.1285951Z           ]
2026-08-28T09:54:47.1286542Z         },
2026-08-28T09:54:47.1287116Z         "unit": {
2026-08-28T09:54:47.1287733Z           "complete": true,
2026-08-28T09:54:47.1288471Z           "evidence": [
2026-08-28T09:54:47.1289185Z             {
2026-08-28T09:54:47.1289863Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.1290689Z               "line": 476
2026-08-28T09:54:47.1291347Z             }
2026-08-28T09:54:47.1291934Z           ]
2026-08-28T09:54:47.1292502Z         }
2026-08-28T09:54:47.1293067Z       }
2026-08-28T09:54:47.1293616Z     },
2026-08-28T09:54:47.1294174Z     {
2026-08-28T09:54:47.1294827Z       "id": "REQ-IO-DISPATCH-RESULT-VOCABULARY",
2026-08-28T09:54:47.1303875Z       "title": "THE DISPATCH_RESULTS ROW VOCABULARY IS MINTED WHOLE, INCLUDING THE ARM NOTHING EMITS YET (ruled 2026-08-27, on the TOOL_USE pattern). One closed outcome vocabulary covers every confirmation the funnel carries: DELIVERED, NO_PERCH, NOT_DELIVERED with the refusing exit code, and the seal-mint outcome and refusal arms. NO_PERCH IS NAMED BUT NOT EMITTED until the W5 lane's typed send-path return can distinguish it — today `cmd_send` answers 1 for a missing perch, an ambiguous target and a refused ring alike, so NOT_DELIVERED carries that coarse code as a TRANSITIONAL arm. Naming the unemitted arm now is the point, exactly as the event taxonomy named TOOL_USE without an emitter: a constant nothing produces costs nothing, while a second vocabulary minted later costs every consumer and turns W5 into a migration instead of a one-arm change. A ROW ALSO NEED NOT NAME A TARGET: a seal outcome is about text, not a recipient, so the target is optional and a consumer must not assume one.",
2026-08-28T09:54:47.1312634Z       "requiredStages": [
2026-08-28T09:54:47.1313312Z         "doc",
2026-08-28T09:54:47.1313913Z         "impl",
2026-08-28T09:54:47.1314520Z         "unit"
2026-08-28T09:54:47.1315131Z       ],
2026-08-28T09:54:47.1315957Z       "stages": {
2026-08-28T09:54:47.1316589Z         "doc": {
2026-08-28T09:54:47.1317208Z           "complete": true,
2026-08-28T09:54:47.1317908Z           "evidence": [
2026-08-28T09:54:47.1318547Z             {
2026-08-28T09:54:47.1319318Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1320166Z               "line": 563
2026-08-28T09:54:47.1320813Z             }
2026-08-28T09:54:47.1321387Z           ]
2026-08-28T09:54:47.1321952Z         },
2026-08-28T09:54:47.1322521Z         "impl": {
2026-08-28T09:54:47.1323151Z           "complete": true,
2026-08-28T09:54:47.1323838Z           "evidence": [
2026-08-28T09:54:47.1324478Z             {
2026-08-28T09:54:47.1325138Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:47.1325973Z               "line": 188
2026-08-28T09:54:47.1326631Z             }
2026-08-28T09:54:47.1327215Z           ]
2026-08-28T09:54:47.1327787Z         },
2026-08-28T09:54:47.1328360Z         "int": {
2026-08-28T09:54:47.1329084Z           "complete": false,
2026-08-28T09:54:47.1329798Z           "evidence": []
2026-08-28T09:54:47.1330439Z         },
2026-08-28T09:54:47.1331007Z         "unit": {
2026-08-28T09:54:47.1331627Z           "complete": true,
2026-08-28T09:54:47.1332322Z           "evidence": [
2026-08-28T09:54:47.1332959Z             {
2026-08-28T09:54:47.1333682Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1334608Z               "line": 225
2026-08-28T09:54:47.1335255Z             },
2026-08-28T09:54:47.1335842Z             {
2026-08-28T09:54:47.1336566Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1337477Z               "line": 266
2026-08-28T09:54:47.1338127Z             },
2026-08-28T09:54:47.1338714Z             {
2026-08-28T09:54:47.1339525Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1340457Z               "line": 297
2026-08-28T09:54:47.1341276Z             }
2026-08-28T09:54:47.1341877Z           ]
2026-08-28T09:54:47.1342445Z         }
2026-08-28T09:54:47.1343000Z       }
2026-08-28T09:54:47.1343547Z     },
2026-08-28T09:54:47.1344105Z     {
2026-08-28T09:54:47.1344730Z       "id": "REQ-IO-DISPATCH-RESULTS",
2026-08-28T09:54:47.1352947Z       "title": "A SHORTFORM DISPATCH ACCUMULATES A PER-TARGET RESULT, AND THAT IS ITS ONLY CONFIRMATION CHANNEL (operator ruling 10). Each target of a parsed tag records what actually happened to it — delivered, or no perch — accumulated as the v1 DISPATCH_RESULTS category; the seal-mint outcomes and refusals of the next wave accumulate into the same category. RENDERING IS NOT THIS WAVE: the now-signal verb that surfaces these lands with #233, so this requirement delivers accumulation with no reader yet, deliberately — the same shape as the event bus shipping with one sink, and for the same reason, that the reader must cost a registration rather than a rework. No other confirmation channel may be added: an author learns what their dispatch did through the now-signal and nowhere else, so a dispatch must never grow its own bespoke echo, log line, or reply message as a substitute.",
2026-08-28T09:54:47.1360453Z       "requiredStages": [
2026-08-28T09:54:47.1361135Z         "doc",
2026-08-28T09:54:47.1361734Z         "impl",
2026-08-28T09:54:47.1362325Z         "unit"
2026-08-28T09:54:47.1362911Z       ],
2026-08-28T09:54:47.1363478Z       "stages": {
2026-08-28T09:54:47.1364092Z         "doc": {
2026-08-28T09:54:47.1364710Z           "complete": true,
2026-08-28T09:54:47.1365410Z           "evidence": [
2026-08-28T09:54:47.1366054Z             {
2026-08-28T09:54:47.1366757Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1367607Z               "line": 503
2026-08-28T09:54:47.1368260Z             }
2026-08-28T09:54:47.1368842Z           ]
2026-08-28T09:54:47.1369493Z         },
2026-08-28T09:54:47.1370065Z         "impl": {
2026-08-28T09:54:47.1370704Z           "complete": true,
2026-08-28T09:54:47.1371405Z           "evidence": [
2026-08-28T09:54:47.1372205Z             {
2026-08-28T09:54:47.1372947Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1373863Z               "line": 111
2026-08-28T09:54:47.1374535Z             },
2026-08-28T09:54:47.1375118Z             {
2026-08-28T09:54:47.1375838Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1376753Z               "line": 138
2026-08-28T09:54:47.1377393Z             },
2026-08-28T09:54:47.1377987Z             {
2026-08-28T09:54:47.1378674Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1379614Z               "line": 135
2026-08-28T09:54:47.1380264Z             }
2026-08-28T09:54:47.1380855Z           ]
2026-08-28T09:54:47.1381422Z         },
2026-08-28T09:54:47.1381994Z         "int": {
2026-08-28T09:54:47.1382608Z           "complete": false,
2026-08-28T09:54:47.1383301Z           "evidence": []
2026-08-28T09:54:47.1383969Z         },
2026-08-28T09:54:47.1384541Z         "unit": {
2026-08-28T09:54:47.1385170Z           "complete": true,
2026-08-28T09:54:47.1385849Z           "evidence": [
2026-08-28T09:54:47.1386488Z             {
2026-08-28T09:54:47.1387228Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1388141Z               "line": 162
2026-08-28T09:54:47.1388800Z             },
2026-08-28T09:54:47.1389506Z             {
2026-08-28T09:54:47.1390230Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1391134Z               "line": 189
2026-08-28T09:54:47.1391787Z             },
2026-08-28T09:54:47.1392383Z             {
2026-08-28T09:54:47.1393117Z               "path": "crates/spt-store/src/dispatchresults.rs",
2026-08-28T09:54:47.1394015Z               "line": 211
2026-08-28T09:54:47.1394673Z             }
2026-08-28T09:54:47.1395245Z           ]
2026-08-28T09:54:47.1395815Z         }
2026-08-28T09:54:47.1396376Z       }
2026-08-28T09:54:47.1397077Z     },
2026-08-28T09:54:47.1397635Z     {
2026-08-28T09:54:47.1398240Z       "id": "REQ-IO-EVENT-BUS",
2026-08-28T09:54:47.1407447Z       "title": "THE IO EVENT FUNNEL IS CONSUMER-AGNOSTIC INTERNALLY: emitters publish to ONE bus and the bus fans out to registered sinks (emitters -> bus -> {shell-link, core consumers}), so the adapter-consumption work tracked as releases#234 lands as a NEW READER registering a sink and never as a funnel rework. No emitter names a consumer and no consumer is reachable except through the bus; a sink list with exactly one entry today is the point, because the second entry must cost a registration rather than a refactor. ONE SINK FAILURE NEVER SUPPRESSES ANOTHER: publish returns a per-sink outcome and a failing sink is reported and stepped over, never propagated as a publish failure — an IO event is an OBSERVATION, and an observation that aborts the operation it observes has become a control path, which is the defect class this funnel exists to avoid. Emission is best-effort against the emitting operation: no `api state` call, no send, and no delivery may fail, block, or change its exit because a sink failed.",
2026-08-28T09:54:47.1416850Z       "requiredStages": [
2026-08-28T09:54:47.1417524Z         "doc",
2026-08-28T09:54:47.1418117Z         "impl",
2026-08-28T09:54:47.1418708Z         "unit"
2026-08-28T09:54:47.1419375Z       ],
2026-08-28T09:54:47.1419956Z       "stages": {
2026-08-28T09:54:47.1420553Z         "doc": {
2026-08-28T09:54:47.1421172Z           "complete": true,
2026-08-28T09:54:47.1421855Z           "evidence": [
2026-08-28T09:54:47.1422504Z             {
2026-08-28T09:54:47.1423190Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1424045Z               "line": 267
2026-08-28T09:54:47.1424708Z             }
2026-08-28T09:54:47.1425285Z           ]
2026-08-28T09:54:47.1425847Z         },
2026-08-28T09:54:47.1426415Z         "impl": {
2026-08-28T09:54:47.1427068Z           "complete": true,
2026-08-28T09:54:47.1427774Z           "evidence": [
2026-08-28T09:54:47.1428409Z             {
2026-08-28T09:54:47.1429311Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1430175Z               "line": 134
2026-08-28T09:54:47.1430827Z             },
2026-08-28T09:54:47.1431413Z             {
2026-08-28T09:54:47.1432091Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1432948Z               "line": 171
2026-08-28T09:54:47.1433602Z             },
2026-08-28T09:54:47.1434193Z             {
2026-08-28T09:54:47.1434866Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1435706Z               "line": 263
2026-08-28T09:54:47.1436355Z             }
2026-08-28T09:54:47.1436937Z           ]
2026-08-28T09:54:47.1437543Z         },
2026-08-28T09:54:47.1438108Z         "int": {
2026-08-28T09:54:47.1438726Z           "complete": false,
2026-08-28T09:54:47.1439518Z           "evidence": []
2026-08-28T09:54:47.1440176Z         },
2026-08-28T09:54:47.1440740Z         "unit": {
2026-08-28T09:54:47.1441415Z           "complete": true,
2026-08-28T09:54:47.1442126Z           "evidence": [
2026-08-28T09:54:47.1442758Z             {
2026-08-28T09:54:47.1443447Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1444296Z               "line": 327
2026-08-28T09:54:47.1444968Z             },
2026-08-28T09:54:47.1445551Z             {
2026-08-28T09:54:47.1446230Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1447088Z               "line": 342
2026-08-28T09:54:47.1452238Z             },
2026-08-28T09:54:47.1452900Z             {
2026-08-28T09:54:47.1453596Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1454465Z               "line": 360
2026-08-28T09:54:47.1455114Z             }
2026-08-28T09:54:47.1455691Z           ]
2026-08-28T09:54:47.1456263Z         }
2026-08-28T09:54:47.1456841Z       }
2026-08-28T09:54:47.1457409Z     },
2026-08-28T09:54:47.1457967Z     {
2026-08-28T09:54:47.1458568Z       "id": "REQ-IO-EVENT-TAXONOMY",
2026-08-28T09:54:47.1469094Z       "title": "THE IO EVENT VOCABULARY IS CLOSED AND NAMED IN ONE PLACE: USER_INPUT, AGENT_OUTPUT, MSG_IN, MSG_OUT, COMMUNE, COMMUNE_FAIL, plus TOOL_USE which is NAMED IN THE TAXONOMY AND HAS NO EMITTER (operator ruling 3 — its unlock is a per-harness digest capability, and naming it now is what keeps a later emitter from minting a second spelling). IO FRAMES ARE COMMAND-CLASS under the shell channel taxonomy (operator ruling 7): discrete, durable, spooled — they ride the shellchan spool path and MUST NOT route through drivehub or activity_write, which are the ephemeral latest-wins machinery ADR-0048 decision 2 defines for ACTIVITY frames. Two frame classes share one stream and share NO machinery; a future reader must not be able to reach an IO frame through the drive hub. PAYLOAD IS BOUNDED AT 16KB-CLASS with an explicit `truncated` flag and a digest `seq` pointer, because the digest stays the content surface and the frame is the push signal: a consumer that needs the untruncated body follows the seq. Truncation is UTF-8 SAFE (cut on a character boundary, never mid-codepoint) and a truncated frame is still a valid frame.",
2026-08-28T09:54:47.1478877Z       "requiredStages": [
2026-08-28T09:54:47.1479654Z         "doc",
2026-08-28T09:54:47.1480249Z         "impl",
2026-08-28T09:54:47.1480848Z         "unit"
2026-08-28T09:54:47.1481463Z       ],
2026-08-28T09:54:47.1482026Z       "stages": {
2026-08-28T09:54:47.1482637Z         "doc": {
2026-08-28T09:54:47.1483255Z           "complete": true,
2026-08-28T09:54:47.1483946Z           "evidence": [
2026-08-28T09:54:47.1484590Z             {
2026-08-28T09:54:47.1485276Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1486127Z               "line": 266
2026-08-28T09:54:47.1486781Z             }
2026-08-28T09:54:47.1487352Z           ]
2026-08-28T09:54:47.1487924Z         },
2026-08-28T09:54:47.1488498Z         "impl": {
2026-08-28T09:54:47.1489213Z           "complete": true,
2026-08-28T09:54:47.1489914Z           "evidence": [
2026-08-28T09:54:47.1490549Z             {
2026-08-28T09:54:47.1491366Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1492248Z               "line": 172
2026-08-28T09:54:47.1492911Z             },
2026-08-28T09:54:47.1493507Z             {
2026-08-28T09:54:47.1494201Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:47.1495055Z               "line": 174
2026-08-28T09:54:47.1495738Z             },
2026-08-28T09:54:47.1496334Z             {
2026-08-28T09:54:47.1497002Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.1497850Z               "line": 96
2026-08-28T09:54:47.1498499Z             },
2026-08-28T09:54:47.1499176Z             {
2026-08-28T09:54:47.1499869Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1500732Z               "line": 19
2026-08-28T09:54:47.1501384Z             },
2026-08-28T09:54:47.1501963Z             {
2026-08-28T09:54:47.1502664Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1503523Z               "line": 23
2026-08-28T09:54:47.1504171Z             },
2026-08-28T09:54:47.1504757Z             {
2026-08-28T09:54:47.1505452Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1506303Z               "line": 26
2026-08-28T09:54:47.1506942Z             },
2026-08-28T09:54:47.1507533Z             {
2026-08-28T09:54:47.1508225Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1509184Z               "line": 29
2026-08-28T09:54:47.1509838Z             },
2026-08-28T09:54:47.1510429Z             {
2026-08-28T09:54:47.1511117Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1511977Z               "line": 33
2026-08-28T09:54:47.1512633Z             },
2026-08-28T09:54:47.1513210Z             {
2026-08-28T09:54:47.1513896Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1514759Z               "line": 37
2026-08-28T09:54:47.1515541Z             },
2026-08-28T09:54:47.1516136Z             {
2026-08-28T09:54:47.1516829Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1517687Z               "line": 45
2026-08-28T09:54:47.1518336Z             },
2026-08-28T09:54:47.1518919Z             {
2026-08-28T09:54:47.1519696Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1520540Z               "line": 60
2026-08-28T09:54:47.1521184Z             },
2026-08-28T09:54:47.1521771Z             {
2026-08-28T09:54:47.1522447Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1523303Z               "line": 71
2026-08-28T09:54:47.1523942Z             },
2026-08-28T09:54:47.1524539Z             {
2026-08-28T09:54:47.1525225Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1526077Z               "line": 83
2026-08-28T09:54:47.1526711Z             }
2026-08-28T09:54:47.1527302Z           ]
2026-08-28T09:54:47.1527881Z         },
2026-08-28T09:54:47.1528453Z         "int": {
2026-08-28T09:54:47.1529145Z           "complete": false,
2026-08-28T09:54:47.1529850Z           "evidence": []
2026-08-28T09:54:47.1530507Z         },
2026-08-28T09:54:47.1531077Z         "unit": {
2026-08-28T09:54:47.1531703Z           "complete": true,
2026-08-28T09:54:47.1532397Z           "evidence": [
2026-08-28T09:54:47.1533036Z             {
2026-08-28T09:54:47.1533724Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1534602Z               "line": 371
2026-08-28T09:54:47.1535251Z             },
2026-08-28T09:54:47.1535832Z             {
2026-08-28T09:54:47.1536518Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.1537386Z               "line": 384
2026-08-28T09:54:47.1538054Z             },
2026-08-28T09:54:47.1538632Z             {
2026-08-28T09:54:47.1539399Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1540296Z               "line": 99
2026-08-28T09:54:47.1540954Z             },
2026-08-28T09:54:47.1541605Z             {
2026-08-28T09:54:47.1542414Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1543263Z               "line": 114
2026-08-28T09:54:47.1543927Z             },
2026-08-28T09:54:47.1544514Z             {
2026-08-28T09:54:47.1545204Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1546064Z               "line": 124
2026-08-28T09:54:47.1546707Z             },
2026-08-28T09:54:47.1547298Z             {
2026-08-28T09:54:47.1547989Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1548856Z               "line": 138
2026-08-28T09:54:47.1549602Z             },
2026-08-28T09:54:47.1550179Z             {
2026-08-28T09:54:47.1550865Z               "path": "crates/spt-proto/src/ioevent.rs",
2026-08-28T09:54:47.1551737Z               "line": 147
2026-08-28T09:54:47.1552389Z             }
2026-08-28T09:54:47.1552970Z           ]
2026-08-28T09:54:47.1553537Z         }
2026-08-28T09:54:47.1554104Z       }
2026-08-28T09:54:47.1554660Z     },
2026-08-28T09:54:47.1555217Z     {
2026-08-28T09:54:47.1555846Z       "id": "REQ-IO-INGEST-STATE-PAYLOAD",
2026-08-28T09:54:47.1570718Z       "title": "THE BUSY/IDLE INGEST EDGE CARRIES AN OPTIONAL PAYLOAD, AND EMITTING IT NEVER TOUCHES THE IDLE-EDGE STAMP (doyle W1 rulings 1 and 2). `api state busy` carries the USER_INPUT payload and `api state idle` carries the AGENT_OUTPUT end-of-turn payload; the payload arrives on STDIN or via `--payload-file`, never as an inline argument (payloads are 16KB-class and an inline arg is the Windows command-length trap; `spt send` already reads bodies from stdin, so stdin is house precedent). SUPPLYING BOTH STDIN AND --payload-file IS AN IMMEDIATE NAMED REFUSAL — house style refuses ambiguity rather than guessing which the caller meant. THE PAYLOAD IS OPTIONAL AND ITS ABSENCE IS THE BACK-COMPAT ARM: a call with no payload behaves byte-for-byte as it does today and emits NO event, which is what lets every already-shipped adapter keep firing this verb on every hook across the release that lands this. THE DECOUPLING, which is the load-bearing decision: one IO event is emitted per PAYLOAD-CARRYING `api state` call, while `stamp_transition`'s edge-only rule is left byte-for-byte untouched. Binding it to the transition edge instead would mean an adapter that reports idle without ever reporting busy emits exactly ONE event for the life of the endpoint. The alternative of stamping every report is REFUSED BY NAME: ADR-0048 decision 3 anchors an idle countdown to the flip instant, and walking that instant forward on every hook fire is precisely the defect that decision exists to prevent, so a consumer countdown could never fire. Core does NOT dedupe calls — once-per-turn discipline belongs to the adapter under the manifest IO-compliance declaration.",
2026-08-28T09:54:47.1584741Z       "requiredStages": [
2026-08-28T09:54:47.1585418Z         "doc",
2026-08-28T09:54:47.1586013Z         "impl",
2026-08-28T09:54:47.1586607Z         "unit",
2026-08-28T09:54:47.1587217Z         "int"
2026-08-28T09:54:47.1587798Z       ],
2026-08-28T09:54:47.1588375Z       "stages": {
2026-08-28T09:54:47.1589042Z         "doc": {
2026-08-28T09:54:47.1589657Z           "complete": true,
2026-08-28T09:54:47.1590348Z           "evidence": [
2026-08-28T09:54:47.1590991Z             {
2026-08-28T09:54:47.1591719Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:47.1592620Z               "line": 298
2026-08-28T09:54:47.1593283Z             },
2026-08-28T09:54:47.1593863Z             {
2026-08-28T09:54:47.1594533Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1595377Z               "line": 338
2026-08-28T09:54:47.1596030Z             }
2026-08-28T09:54:47.1596638Z           ]
2026-08-28T09:54:47.1597206Z         },
2026-08-28T09:54:47.1597807Z         "impl": {
2026-08-28T09:54:47.1598426Z           "complete": true,
2026-08-28T09:54:47.1599188Z           "evidence": [
2026-08-28T09:54:47.1599822Z             {
2026-08-28T09:54:47.1600494Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1601481Z               "line": 50
2026-08-28T09:54:47.1602126Z             },
2026-08-28T09:54:47.1602708Z             {
2026-08-28T09:54:47.1603375Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1604216Z               "line": 84
2026-08-28T09:54:47.1604855Z             },
2026-08-28T09:54:47.1605441Z             {
2026-08-28T09:54:47.1606115Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1606966Z               "line": 103
2026-08-28T09:54:47.1607664Z             },
2026-08-28T09:54:47.1608246Z             {
2026-08-28T09:54:47.1608919Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1609853Z               "line": 294
2026-08-28T09:54:47.1610501Z             }
2026-08-28T09:54:47.1611083Z           ]
2026-08-28T09:54:47.1611655Z         },
2026-08-28T09:54:47.1612226Z         "int": {
2026-08-28T09:54:47.1612844Z           "complete": true,
2026-08-28T09:54:47.1613545Z           "evidence": [
2026-08-28T09:54:47.1614175Z             {
2026-08-28T09:54:47.1614889Z               "path": "crates/spt/tests/io_state_payload_e2e.rs",
2026-08-28T09:54:47.1615802Z               "line": 40
2026-08-28T09:54:47.1616469Z             }
2026-08-28T09:54:47.1617042Z           ]
2026-08-28T09:54:47.1617602Z         },
2026-08-28T09:54:47.1618182Z         "unit": {
2026-08-28T09:54:47.1618801Z           "complete": true,
2026-08-28T09:54:47.1619561Z           "evidence": [
2026-08-28T09:54:47.1620195Z             {
2026-08-28T09:54:47.1620876Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1621724Z               "line": 659
2026-08-28T09:54:47.1622363Z             },
2026-08-28T09:54:47.1622951Z             {
2026-08-28T09:54:47.1623618Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1624453Z               "line": 668
2026-08-28T09:54:47.1625106Z             },
2026-08-28T09:54:47.1625828Z             {
2026-08-28T09:54:47.1626499Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1627349Z               "line": 680
2026-08-28T09:54:47.1627988Z             },
2026-08-28T09:54:47.1628571Z             {
2026-08-28T09:54:47.1629334Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1630179Z               "line": 699
2026-08-28T09:54:47.1630832Z             },
2026-08-28T09:54:47.1631416Z             {
2026-08-28T09:54:47.1632090Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1632956Z               "line": 709
2026-08-28T09:54:47.1633616Z             },
2026-08-28T09:54:47.1634207Z             {
2026-08-28T09:54:47.1634874Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1635718Z               "line": 719
2026-08-28T09:54:47.1636378Z             },
2026-08-28T09:54:47.1636965Z             {
2026-08-28T09:54:47.1637656Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1638534Z               "line": 739
2026-08-28T09:54:47.1639255Z             }
2026-08-28T09:54:47.1639846Z           ]
2026-08-28T09:54:47.1640414Z         }
2026-08-28T09:54:47.1640977Z       }
2026-08-28T09:54:47.1641576Z     },
2026-08-28T09:54:47.1642125Z     {
2026-08-28T09:54:47.1642715Z       "id": "REQ-IO-MSG-EDGES",
2026-08-28T09:54:47.1650735Z       "title": "MSG_IN AND MSG_OUT ARE ACCOUNTED AT THE DELIVERY EDGES CORE ALREADY OWNS, not at a new interception point: MSG_OUT publishes where the send path commits an outbound message and MSG_IN publishes where core delivers or injects an inbound one, so the funnel observes the edges rather than growing a parallel notion of what a message is. THE INGEST-SCOPE BOUNDARY IS ESTABLISHED HERE EVEN THOUGH THE PARSERS LAND LATER (operator ruling 11): a received message body is INGEST DATA and never a parse surface — no MSG_IN body may fire a dispatch or a ceremony at the receiver, and W1 is where MSG_IN gets published in a shape that keeps the later parsers structurally unable to read it as agent output. Emission is best-effort and never alters delivery: a message is delivered, spooled, or refused exactly as it is today regardless of what the funnel does with the observation.",
2026-08-28T09:54:47.1658456Z       "requiredStages": [
2026-08-28T09:54:47.1659221Z         "doc",
2026-08-28T09:54:47.1659819Z         "impl",
2026-08-28T09:54:47.1660418Z         "unit"
2026-08-28T09:54:47.1661005Z       ],
2026-08-28T09:54:47.1661286Z       "stages": {
2026-08-28T09:54:47.1661548Z         "doc": {
2026-08-28T09:54:47.1661849Z           "complete": true,
2026-08-28T09:54:47.1662126Z           "evidence": [
2026-08-28T09:54:47.1662393Z             {
2026-08-28T09:54:47.1662753Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1663030Z               "line": 386
2026-08-28T09:54:47.1663301Z             }
2026-08-28T09:54:47.1663564Z           ]
2026-08-28T09:54:47.1663832Z         },
2026-08-28T09:54:47.1664094Z         "impl": {
2026-08-28T09:54:47.1664394Z           "complete": true,
2026-08-28T09:54:47.1664676Z           "evidence": [
2026-08-28T09:54:47.1664946Z             {
2026-08-28T09:54:47.1665301Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1665577Z               "line": 586
2026-08-28T09:54:47.1665844Z             },
2026-08-28T09:54:47.1666103Z             {
2026-08-28T09:54:47.1666465Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1666741Z               "line": 596
2026-08-28T09:54:47.1667013Z             },
2026-08-28T09:54:47.1667276Z             {
2026-08-28T09:54:47.1667601Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1667884Z               "line": 11013
2026-08-28T09:54:47.1668144Z             },
2026-08-28T09:54:47.1668416Z             {
2026-08-28T09:54:47.1668735Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1669098Z               "line": 11286
2026-08-28T09:54:47.1669360Z             }
2026-08-28T09:54:47.1669737Z           ]
2026-08-28T09:54:47.1670004Z         },
2026-08-28T09:54:47.1670280Z         "int": {
2026-08-28T09:54:47.1670578Z           "complete": false,
2026-08-28T09:54:47.1670855Z           "evidence": []
2026-08-28T09:54:47.1671127Z         },
2026-08-28T09:54:47.1671393Z         "unit": {
2026-08-28T09:54:47.1671689Z           "complete": true,
2026-08-28T09:54:47.1671965Z           "evidence": [
2026-08-28T09:54:47.1672232Z             {
2026-08-28T09:54:47.1672604Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1672885Z               "line": 925
2026-08-28T09:54:47.1673156Z             },
2026-08-28T09:54:47.1673419Z             {
2026-08-28T09:54:47.1673781Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1674058Z               "line": 981
2026-08-28T09:54:47.1674334Z             }
2026-08-28T09:54:47.1674597Z           ]
2026-08-28T09:54:47.1674863Z         }
2026-08-28T09:54:47.1675125Z       }
2026-08-28T09:54:47.1675397Z     },
2026-08-28T09:54:47.1675672Z     {
2026-08-28T09:54:47.1676015Z       "id": "REQ-IO-SEAL-SHORTFORM-CEREMONY",
2026-08-28T09:54:47.1686052Z       "title": "A `;;` MINT RUNS THE EXISTING SEAL CEREMONY, OFF THE HOOK PATH, AND ITS REFUSAL IS THE ONE ALREADY SHIPPED (operator ruling 15 + the async rider ruled 2026-08-27). The ceremony is `Brain::seal_ceremony` — the same TOTP human-presence path `spt seal mint` runs; no second ceremony, no second refusal. WITH NO CAPABLE CONTROLLER ATTACHED the ceremony already answers an immediate named `SEAL_NO_CEREMONY_SURFACE` with no pending state and no timeout queue, and W4 ROUTES that outcome into DISPATCH_RESULTS rather than minting a rival refusal beside it. INGEST-FIRED MINTS ARE ASYNC-DISPATCHED: the `api state` call returns immediately and the ceremony runs off the hook path, because that ceremony blocks for a human-scale duration and an adapter hook that blocks on a human overlay is the wedge class this project has refused twice already (the `--payload-stdin` sniff and the pump deadlines). THE TWO IMMEDIACIES ARE DIFFERENT AND BOTH HOLD: `immediate, never queued` pins CEREMONY SEMANTICS — nothing waits for a controller to show up — while the hook's return is PLUMBING, so an async hook does not weaken ruling 15. A reader must be able to see that distinction in the code rather than rediscover it.",
2026-08-28T09:54:47.1686697Z       "requiredStages": [
2026-08-28T09:54:47.1686974Z         "doc",
2026-08-28T09:54:47.1687246Z         "impl",
2026-08-28T09:54:47.1687537Z         "unit",
2026-08-28T09:54:47.1687800Z         "int"
2026-08-28T09:54:47.1688068Z       ],
2026-08-28T09:54:47.1688334Z       "stages": {
2026-08-28T09:54:47.1693290Z         "doc": {
2026-08-28T09:54:47.1693619Z           "complete": true,
2026-08-28T09:54:47.1693901Z           "evidence": [
2026-08-28T09:54:47.1694179Z             {
2026-08-28T09:54:47.1694545Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1694830Z               "line": 552
2026-08-28T09:54:47.1695093Z             }
2026-08-28T09:54:47.1695373Z           ]
2026-08-28T09:54:47.1695645Z         },
2026-08-28T09:54:47.1695921Z         "impl": {
2026-08-28T09:54:47.1696226Z           "complete": true,
2026-08-28T09:54:47.1696512Z           "evidence": [
2026-08-28T09:54:47.1696782Z             {
2026-08-28T09:54:47.1697153Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1697435Z               "line": 224
2026-08-28T09:54:47.1697702Z             },
2026-08-28T09:54:47.1697970Z             {
2026-08-28T09:54:47.1698322Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1698609Z               "line": 237
2026-08-28T09:54:47.1698909Z             },
2026-08-28T09:54:47.1699290Z             {
2026-08-28T09:54:47.1699650Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1699935Z               "line": 246
2026-08-28T09:54:47.1700197Z             },
2026-08-28T09:54:47.1700458Z             {
2026-08-28T09:54:47.1700807Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:47.1701232Z               "line": 187
2026-08-28T09:54:47.1701509Z             }
2026-08-28T09:54:47.1701776Z           ]
2026-08-28T09:54:47.1702050Z         },
2026-08-28T09:54:47.1702324Z         "int": {
2026-08-28T09:54:47.1702621Z           "complete": true,
2026-08-28T09:54:47.1702898Z           "evidence": [
2026-08-28T09:54:47.1703160Z             {
2026-08-28T09:54:47.1703565Z               "path": "crates/spt/tests/seal_shortform_e2e.rs",
2026-08-28T09:54:47.1703841Z               "line": 27
2026-08-28T09:54:47.1704104Z             }
2026-08-28T09:54:47.1704362Z           ]
2026-08-28T09:54:47.1704633Z         },
2026-08-28T09:54:47.1704903Z         "unit": {
2026-08-28T09:54:47.1705184Z           "complete": true,
2026-08-28T09:54:47.1705462Z           "evidence": [
2026-08-28T09:54:47.1705719Z             {
2026-08-28T09:54:47.1706086Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1706368Z               "line": 800
2026-08-28T09:54:47.1706650Z             },
2026-08-28T09:54:47.1706907Z             {
2026-08-28T09:54:47.1707277Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1707580Z               "line": 854
2026-08-28T09:54:47.1707837Z             },
2026-08-28T09:54:47.1708099Z             {
2026-08-28T09:54:47.1708452Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1708733Z               "line": 866
2026-08-28T09:54:47.1709096Z             }
2026-08-28T09:54:47.1709382Z           ]
2026-08-28T09:54:47.1709644Z         }
2026-08-28T09:54:47.1709911Z       }
2026-08-28T09:54:47.1710177Z     },
2026-08-28T09:54:47.1710447Z     {
2026-08-28T09:54:47.1710800Z       "id": "REQ-IO-SEAL-SHORTFORM-GRAMMAR",
2026-08-28T09:54:47.1720733Z       "title": "THE `;;` SEAL-MINT SHORTFORM PARSES UNDER THE SAME SUPPRESSION GRAMMAR AS `@<…@>` (operator rulings 8 and 12-14). Pairs parse GREEDY LEFT-TO-RIGHT and each pair mints its OWN ceremony, run sequentially — two pairs in one turn are two seals over two texts, never one seal over the span between them. AN EMPTY PAIR `;;;;` IS FULLY IGNORED: no ceremony, and NO REFUSAL either, because an author who typed nothing between the markers asked for nothing and a refusal would be noise about a non-event. AN ODD TRAILING `;;` IS THE BARE CASE and seals ALL TEXT AFTER IT THROUGH END OF OUTPUT, with the text between the last completed pair and the bare marker left UNTOUCHED — the bare marker is a decision to seal the remainder, not a retroactive claim on what preceded it. Pair parsing runs FIRST and the bare case is what an odd marker becomes after pairing, which is the only order under which `;;a;; tail ;;rest` has one pair and one bare seal rather than an ambiguous three-marker soup. Detection covers AGENT OUTPUT and USER INPUT alike (CONTEXT.md): either author path mints, because the user typing the directive verbatim and the agent drafting it are the same intent.",
2026-08-28T09:54:47.1721264Z       "requiredStages": [
2026-08-28T09:54:47.1721536Z         "doc",
2026-08-28T09:54:47.1721827Z         "impl",
2026-08-28T09:54:47.1722104Z         "unit",
2026-08-28T09:54:47.1722380Z         "int"
2026-08-28T09:54:47.1722644Z       ],
2026-08-28T09:54:47.1722920Z       "stages": {
2026-08-28T09:54:47.1723180Z         "doc": {
2026-08-28T09:54:47.1723468Z           "complete": true,
2026-08-28T09:54:47.1723750Z           "evidence": [
2026-08-28T09:54:47.1724013Z             {
2026-08-28T09:54:47.1724380Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1724661Z               "line": 517
2026-08-28T09:54:47.1724923Z             }
2026-08-28T09:54:47.1725182Z           ]
2026-08-28T09:54:47.1725453Z         },
2026-08-28T09:54:47.1725719Z         "impl": {
2026-08-28T09:54:47.1726019Z           "complete": true,
2026-08-28T09:54:47.1726347Z           "evidence": [
2026-08-28T09:54:47.1726667Z             {
2026-08-28T09:54:47.1727083Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1727403Z               "line": 242
2026-08-28T09:54:47.1727803Z             }
2026-08-28T09:54:47.1728070Z           ]
2026-08-28T09:54:47.1728335Z         },
2026-08-28T09:54:47.1728600Z         "int": {
2026-08-28T09:54:47.1728890Z           "complete": true,
2026-08-28T09:54:47.1729258Z           "evidence": [
2026-08-28T09:54:47.1729524Z             {
2026-08-28T09:54:47.1729925Z               "path": "crates/spt/tests/seal_shortform_e2e.rs",
2026-08-28T09:54:47.1730207Z               "line": 28
2026-08-28T09:54:47.1730474Z             }
2026-08-28T09:54:47.1730736Z           ]
2026-08-28T09:54:47.1731004Z         },
2026-08-28T09:54:47.1731269Z         "unit": {
2026-08-28T09:54:47.1731562Z           "complete": true,
2026-08-28T09:54:47.1731848Z           "evidence": [
2026-08-28T09:54:47.1732115Z             {
2026-08-28T09:54:47.1732497Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1732778Z               "line": 434
2026-08-28T09:54:47.1733055Z             },
2026-08-28T09:54:47.1733326Z             {
2026-08-28T09:54:47.1733712Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1733991Z               "line": 454
2026-08-28T09:54:47.1734263Z             },
2026-08-28T09:54:47.1734526Z             {
2026-08-28T09:54:47.1734911Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1735192Z               "line": 473
2026-08-28T09:54:47.1735460Z             },
2026-08-28T09:54:47.1735757Z             {
2026-08-28T09:54:47.1736137Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1736419Z               "line": 483
2026-08-28T09:54:47.1736679Z             },
2026-08-28T09:54:47.1736951Z             {
2026-08-28T09:54:47.1737329Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1737623Z               "line": 494
2026-08-28T09:54:47.1737885Z             },
2026-08-28T09:54:47.1738157Z             {
2026-08-28T09:54:47.1738549Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1738824Z               "line": 504
2026-08-28T09:54:47.1739256Z             },
2026-08-28T09:54:47.1739518Z             {
2026-08-28T09:54:47.1739905Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1740176Z               "line": 516
2026-08-28T09:54:47.1740447Z             },
2026-08-28T09:54:47.1740720Z             {
2026-08-28T09:54:47.1741096Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1741450Z               "line": 526
2026-08-28T09:54:47.1741710Z             }
2026-08-28T09:54:47.1741975Z           ]
2026-08-28T09:54:47.1742233Z         }
2026-08-28T09:54:47.1742505Z       }
2026-08-28T09:54:47.1742839Z     },
2026-08-28T09:54:47.1743106Z     {
2026-08-28T09:54:47.1743421Z       "id": "REQ-IO-SEND-VERDICT",
2026-08-28T09:54:47.1757162Z       "title": "THE SEND PATH RETURNS A NAMED OUTCOME, NOT AN EXIT CODE, AND THAT IS WHAT POPULATES NO_PERCH (booked as the W5 prerequisite, IO-PARSER #22). Before this, cmd_send_with_body answered 1 for a missing perch, a refused admission gate, an ambiguous target, an unconfirmed WAN hop and an empty body alike, so the DISPATCH_RESULTS accumulator could only record the coarse transitional NOT_DELIVERED arm and the ruled delivered/no-perch split was NOT DERIVABLE AT ALL — a report this lane handed the gater by name rather than approximating. The send path therefore names its own outcomes: DELIVERED covers SENT and QUEUED alike (both mean the message is the target's problem now), NO_PERCH covers every absence arm across all three delivery cascades — the local perch that is not listening, the WAN leg answering no-perch-remote, and the WAN registry answering not-found — and REFUSED carries the exit code for every outcome that is a refusal rather than an absence. THE EXIT CODE IS DERIVED FROM THE VERDICT AND NEVER THE OTHER WAY AROUND: the CLI wrapper maps the verdict to its process code so that the operator-facing contract is unchanged to the byte, while the in-process caller reads the name. AN ABSENCE IS NOT A REFUSAL, AND THE OPPOSITE READING IS THE ONE THIS EXISTS TO KILL: an author whose peer simply is not listening must not be told their message was refused, because those two facts call for different next actions. NO ROW ALREADY WRITTEN IS MIGRATED — the store is append-only, so previously-written NOT_DELIVERED rows stay exactly as written and the arm merely narrows for rows written from here on.",
2026-08-28T09:54:47.1757709Z       "requiredStages": [
2026-08-28T09:54:47.1757981Z         "impl",
2026-08-28T09:54:47.1758258Z         "unit"
﻿2026-08-28T09:54:47.1761181Z       ],
2026-08-28T09:54:47.1761473Z       "stages": {
2026-08-28T09:54:47.1761759Z         "doc": {
2026-08-28T09:54:47.1762068Z           "complete": false,
2026-08-28T09:54:47.1762351Z           "evidence": []
2026-08-28T09:54:47.1762619Z         },
2026-08-28T09:54:47.1762883Z         "impl": {
2026-08-28T09:54:47.1763185Z           "complete": true,
2026-08-28T09:54:47.1763462Z           "evidence": [
2026-08-28T09:54:47.1763743Z             {
2026-08-28T09:54:47.1764110Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1764402Z               "line": 157
2026-08-28T09:54:47.1764677Z             },
2026-08-28T09:54:47.1769400Z             {
2026-08-28T09:54:47.1769819Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1770104Z               "line": 193
2026-08-28T09:54:47.1770368Z             },
2026-08-28T09:54:47.1770643Z             {
2026-08-28T09:54:47.1770965Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1771246Z               "line": 11074
2026-08-28T09:54:47.1771546Z             },
2026-08-28T09:54:47.1771817Z             {
2026-08-28T09:54:47.1772142Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1772428Z               "line": 11092
2026-08-28T09:54:47.1772700Z             },
2026-08-28T09:54:47.1772962Z             {
2026-08-28T09:54:47.1773291Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1773566Z               "line": 11110
2026-08-28T09:54:47.1773842Z             },
2026-08-28T09:54:47.1774204Z             {
2026-08-28T09:54:47.1774528Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1774805Z               "line": 11156
2026-08-28T09:54:47.1775067Z             },
2026-08-28T09:54:47.1775329Z             {
2026-08-28T09:54:47.1775658Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1775938Z               "line": 11334
2026-08-28T09:54:47.1776203Z             },
2026-08-28T09:54:47.1776466Z             {
2026-08-28T09:54:47.1776785Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1777071Z               "line": 11423
2026-08-28T09:54:47.1777395Z             }
2026-08-28T09:54:47.1777658Z           ]
2026-08-28T09:54:47.1777929Z         },
2026-08-28T09:54:47.1778201Z         "int": {
2026-08-28T09:54:47.1778492Z           "complete": false,
2026-08-28T09:54:47.1778777Z           "evidence": []
2026-08-28T09:54:47.1779139Z         },
2026-08-28T09:54:47.1779411Z         "unit": {
2026-08-28T09:54:47.1779698Z           "complete": true,
2026-08-28T09:54:47.1779979Z           "evidence": [
2026-08-28T09:54:47.1780247Z             {
2026-08-28T09:54:47.1780604Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1780881Z               "line": 1511
2026-08-28T09:54:47.1781131Z             },
2026-08-28T09:54:47.1781387Z             {
2026-08-28T09:54:47.1781758Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1782035Z               "line": 1542
2026-08-28T09:54:47.1782306Z             }
2026-08-28T09:54:47.1782569Z           ]
2026-08-28T09:54:47.1782827Z         }
2026-08-28T09:54:47.1783099Z       }
2026-08-28T09:54:47.1783356Z     },
2026-08-28T09:54:47.1783618Z     {
2026-08-28T09:54:47.1783946Z       "id": "REQ-IO-SHORTFORM-DISPATCH",
2026-08-28T09:54:47.1791880Z       "title": "CORE PARSES `@<targets body @>` OVER INGESTED AGENT OUTPUT AND USER INPUT ONLY, AND DISPATCHES THROUGH THE NORMAL SEND PATH (operator rulings 10 and 11). The grammar: `@<` opens, comma-separated target ids run to the first space, the body runs to the first `@>`. THE INGEST-SCOPE BOUNDARY IS ABSOLUTE AND STRUCTURAL: parsers run over USER_INPUT and AGENT_OUTPUT ingest only and NEVER over a MSG_IN body — a message that ARRIVES carrying a live tag can never fire a dispatch or a ceremony at its receiver, because a peer's text is data about a tag, not an instruction to send one. That boundary is held by which funnel path the body traverses rather than by a kind check a later edit could widen. Dispatch reuses the delivery path core already owns — no parallel send machinery, no second notion of what delivery means — so admission, sealing, spooling and refusal behave exactly as they do for an operator-typed send.",
2026-08-28T09:54:47.1792366Z       "requiredStages": [
2026-08-28T09:54:47.1792633Z         "doc",
2026-08-28T09:54:47.1792904Z         "impl",
2026-08-28T09:54:47.1793163Z         "unit",
2026-08-28T09:54:47.1793434Z         "int"
2026-08-28T09:54:47.1793707Z       ],
2026-08-28T09:54:47.1793974Z       "stages": {
2026-08-28T09:54:47.1794251Z         "doc": {
2026-08-28T09:54:47.1794539Z           "complete": true,
2026-08-28T09:54:47.1794828Z           "evidence": [
2026-08-28T09:54:47.1795090Z             {
2026-08-28T09:54:47.1795452Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1795729Z               "line": 436
2026-08-28T09:54:47.1796010Z             }
2026-08-28T09:54:47.1796278Z           ]
2026-08-28T09:54:47.1796536Z         },
2026-08-28T09:54:47.1796803Z         "impl": {
2026-08-28T09:54:47.1797091Z           "complete": true,
2026-08-28T09:54:47.1797380Z           "evidence": [
2026-08-28T09:54:47.1797638Z             {
2026-08-28T09:54:47.1798019Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1798296Z               "line": 161
2026-08-28T09:54:47.1798558Z             },
2026-08-28T09:54:47.1798826Z             {
2026-08-28T09:54:47.1799269Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1799550Z               "line": 134
2026-08-28T09:54:47.1799883Z             }
2026-08-28T09:54:47.1800146Z           ]
2026-08-28T09:54:47.1800408Z         },
2026-08-28T09:54:47.1800680Z         "int": {
2026-08-28T09:54:47.1800965Z           "complete": true,
2026-08-28T09:54:47.1801256Z           "evidence": [
2026-08-28T09:54:47.1801528Z             {
2026-08-28T09:54:47.1801953Z               "path": "crates/spt/tests/shortform_dispatch_e2e.rs",
2026-08-28T09:54:47.1802237Z               "line": 24
2026-08-28T09:54:47.1802497Z             }
2026-08-28T09:54:47.1802769Z           ]
2026-08-28T09:54:47.1803084Z         },
2026-08-28T09:54:47.1803341Z         "unit": {
2026-08-28T09:54:47.1803628Z           "complete": true,
2026-08-28T09:54:47.1803924Z           "evidence": [
2026-08-28T09:54:47.1804196Z             {
2026-08-28T09:54:47.1804577Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1804859Z               "line": 285
2026-08-28T09:54:47.1805123Z             },
2026-08-28T09:54:47.1805407Z             {
2026-08-28T09:54:47.1805784Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1806074Z               "line": 297
2026-08-28T09:54:47.1806341Z             },
2026-08-28T09:54:47.1806605Z             {
2026-08-28T09:54:47.1806990Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1807267Z               "line": 307
2026-08-28T09:54:47.1807533Z             },
2026-08-28T09:54:47.1807795Z             {
2026-08-28T09:54:47.1808175Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1808456Z               "line": 326
2026-08-28T09:54:47.1808724Z             },
2026-08-28T09:54:47.1809085Z             {
2026-08-28T09:54:47.1809452Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1809743Z               "line": 337
2026-08-28T09:54:47.1810002Z             },
2026-08-28T09:54:47.1810273Z             {
2026-08-28T09:54:47.1810711Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1810997Z               "line": 345
2026-08-28T09:54:47.1811264Z             },
2026-08-28T09:54:47.1811535Z             {
2026-08-28T09:54:47.1811917Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1812204Z               "line": 415
2026-08-28T09:54:47.1812474Z             },
2026-08-28T09:54:47.1812745Z             {
2026-08-28T09:54:47.1813105Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1813381Z               "line": 878
2026-08-28T09:54:47.1813710Z             }
2026-08-28T09:54:47.1813973Z           ]
2026-08-28T09:54:47.1814245Z         }
2026-08-28T09:54:47.1814512Z       }
2026-08-28T09:54:47.1814770Z     },
2026-08-28T09:54:47.1815032Z     {
2026-08-28T09:54:47.1815352Z       "id": "REQ-IO-SHORTFORM-GATE",
2026-08-28T09:54:47.1824424Z       "title": "SHORTFORM IS ENABLED PER-ADAPTER, ONLY ON A MANIFEST IO-COMPLIANCE DECLARATION (operator ruling 9), AND A DECLARING ADAPTER MAY STILL OPT OUT (ruling 8). Absent the declaration core parses NOTHING for that adapter, which is what makes the migration safe: every adapter shipping its own parser today keeps parsing, alone, until its own release declares compliance and deletes the local parser in the same change — so no release exists in which both parse the same text and dispatch it twice. THE DEFAULT IS OFF AND THAT IS LOAD-BEARING: a default-on core would double-fire against every already-shipped adapter the moment core upgraded, which is precisely the window ruling 9 forbids. The manifest fields are additive and N-1-safe (absent in older manifests, omitted from serialization when unset), so an older core reading a newer manifest and a newer core reading an older one both behave as they did before. Core owns the field and the gating; the handshake with each adapter's own release is the gater's boundary, not this requirement's.",
2026-08-28T09:54:47.1824762Z       "requiredStages": [
2026-08-28T09:54:47.1825039Z         "doc",
2026-08-28T09:54:47.1825316Z         "impl",
2026-08-28T09:54:47.1825660Z         "unit",
2026-08-28T09:54:47.1825921Z         "int"
2026-08-28T09:54:47.1826191Z       ],
2026-08-28T09:54:47.1826461Z       "stages": {
2026-08-28T09:54:47.1826733Z         "doc": {
2026-08-28T09:54:47.1827019Z           "complete": true,
2026-08-28T09:54:47.1827310Z           "evidence": [
2026-08-28T09:54:47.1827568Z             {
2026-08-28T09:54:47.1828010Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:47.1828293Z               "line": 370
2026-08-28T09:54:47.1828555Z             },
2026-08-28T09:54:47.1828825Z             {
2026-08-28T09:54:47.1829328Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1829605Z               "line": 480
2026-08-28T09:54:47.1829872Z             },
2026-08-28T09:54:47.1830139Z             {
2026-08-28T09:54:47.1830444Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.1830725Z               "line": 346
2026-08-28T09:54:47.1830992Z             }
2026-08-28T09:54:47.1831254Z           ]
2026-08-28T09:54:47.1831517Z         },
2026-08-28T09:54:47.1831783Z         "impl": {
2026-08-28T09:54:47.1832079Z           "complete": true,
2026-08-28T09:54:47.1832355Z           "evidence": [
2026-08-28T09:54:47.1832621Z             {
2026-08-28T09:54:47.1832990Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.1833275Z               "line": 201
2026-08-28T09:54:47.1833537Z             },
2026-08-28T09:54:47.1833799Z             {
2026-08-28T09:54:47.1834178Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.1834459Z               "line": 1110
2026-08-28T09:54:47.1834736Z             },
2026-08-28T09:54:47.1834998Z             {
2026-08-28T09:54:47.1835375Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1835656Z               "line": 330
2026-08-28T09:54:47.1835933Z             },
2026-08-28T09:54:47.1836201Z             {
2026-08-28T09:54:47.1836638Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.1836927Z               "line": 351
2026-08-28T09:54:47.1837188Z             },
2026-08-28T09:54:47.1837455Z             {
2026-08-28T09:54:47.1837779Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:47.1838070Z               "line": 701
2026-08-28T09:54:47.1838332Z             }
2026-08-28T09:54:47.1838599Z           ]
2026-08-28T09:54:47.1838871Z         },
2026-08-28T09:54:47.1839224Z         "int": {
2026-08-28T09:54:47.1839517Z           "complete": true,
2026-08-28T09:54:47.1839870Z           "evidence": [
2026-08-28T09:54:47.1840141Z             {
2026-08-28T09:54:47.1840565Z               "path": "crates/spt/tests/shortform_dispatch_e2e.rs",
2026-08-28T09:54:47.1840847Z               "line": 25
2026-08-28T09:54:47.1841114Z             }
2026-08-28T09:54:47.1841382Z           ]
2026-08-28T09:54:47.1841701Z         },
2026-08-28T09:54:47.1841968Z         "unit": {
2026-08-28T09:54:47.1842266Z           "complete": true,
2026-08-28T09:54:47.1842547Z           "evidence": [
2026-08-28T09:54:47.1842814Z             {
2026-08-28T09:54:47.1843191Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.1843472Z               "line": 2712
2026-08-28T09:54:47.1843740Z             },
2026-08-28T09:54:47.1844002Z             {
2026-08-28T09:54:47.1844392Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.1844671Z               "line": 2722
2026-08-28T09:54:47.1844944Z             },
2026-08-28T09:54:47.1845249Z             {
2026-08-28T09:54:47.1845621Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.1845911Z               "line": 2732
2026-08-28T09:54:47.1846169Z             },
2026-08-28T09:54:47.1846426Z             {
2026-08-28T09:54:47.1846804Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.1847085Z               "line": 2742
2026-08-28T09:54:47.1847359Z             }
2026-08-28T09:54:47.1847772Z           ]
2026-08-28T09:54:47.1848168Z         }
2026-08-28T09:54:47.1848854Z       }
2026-08-28T09:54:47.1849197Z     },
2026-08-28T09:54:47.1849464Z     {
2026-08-28T09:54:47.1849840Z       "id": "REQ-IO-SUPPRESSION-GRAMMAR",
2026-08-28T09:54:47.1857749Z       "title": "ONE SUPPRESSION GRAMMAR, CORE-OWNED, SHARED BY EVERY SHORTFORM (operator ruling 8). A shortform marker inside an inline backtick span or a fenced code block is a QUOTATION and fires nothing — that is how an agent writes about a tag without dispatching one, and how a code sample containing a marker stays a code sample. The grammar lives in ONE place and is applied by every shortform reader: the `@<…@>` parser of this wave and the `;;` seal-mint of the next, so the two can never disagree about what is quoted. A second spelling of suppression is the defect this requirement exists to prevent — an author who learns the rule from one surface must not be surprised by the other. The masking is computed over the raw text before any marker scan, so a marker is either inside a suppressed region or it is live, never both, and nesting is resolved by the outer region: a backtick span inside a fenced block is simply more fenced content.",
2026-08-28T09:54:47.1858184Z       "requiredStages": [
2026-08-28T09:54:47.1858451Z         "doc",
2026-08-28T09:54:47.1858719Z         "impl",
2026-08-28T09:54:47.1859057Z         "unit"
2026-08-28T09:54:47.1859315Z       ],
2026-08-28T09:54:47.1859587Z       "stages": {
2026-08-28T09:54:47.1859849Z         "doc": {
2026-08-28T09:54:47.1860144Z           "complete": true,
2026-08-28T09:54:47.1860438Z           "evidence": [
2026-08-28T09:54:47.1860713Z             {
2026-08-28T09:54:47.1861079Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.1861356Z               "line": 458
2026-08-28T09:54:47.1861628Z             }
2026-08-28T09:54:47.1861891Z           ]
2026-08-28T09:54:47.1862154Z         },
2026-08-28T09:54:47.1862420Z         "impl": {
2026-08-28T09:54:47.1862774Z           "complete": true,
2026-08-28T09:54:47.1863065Z           "evidence": [
2026-08-28T09:54:47.1863329Z             {
2026-08-28T09:54:47.1863711Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1863987Z               "line": 56
2026-08-28T09:54:47.1864254Z             },
2026-08-28T09:54:47.1864517Z             {
2026-08-28T09:54:47.1864893Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1865174Z               "line": 68
2026-08-28T09:54:47.1865442Z             }
2026-08-28T09:54:47.1865713Z           ]
2026-08-28T09:54:47.1866035Z         },
2026-08-28T09:54:47.1866306Z         "int": {
2026-08-28T09:54:47.1866603Z           "complete": false,
2026-08-28T09:54:47.1866893Z           "evidence": []
2026-08-28T09:54:47.1867159Z         },
2026-08-28T09:54:47.1867432Z         "unit": {
2026-08-28T09:54:47.1867717Z           "complete": true,
2026-08-28T09:54:47.1867999Z           "evidence": [
2026-08-28T09:54:47.1868272Z             {
2026-08-28T09:54:47.1868650Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1868936Z               "line": 355
2026-08-28T09:54:47.1869294Z             },
2026-08-28T09:54:47.1869555Z             {
2026-08-28T09:54:47.1869970Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1870256Z               "line": 363
2026-08-28T09:54:47.1870519Z             },
2026-08-28T09:54:47.1870791Z             {
2026-08-28T09:54:47.1871170Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1871445Z               "line": 371
2026-08-28T09:54:47.1871711Z             },
2026-08-28T09:54:47.1871978Z             {
2026-08-28T09:54:47.1872356Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1872632Z               "line": 384
2026-08-28T09:54:47.1872908Z             },
2026-08-28T09:54:47.1873166Z             {
2026-08-28T09:54:47.1873548Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1873833Z               "line": 393
2026-08-28T09:54:47.1874095Z             },
2026-08-28T09:54:47.1874434Z             {
2026-08-28T09:54:47.1874805Z               "path": "crates/spt-proto/src/shortform.rs",
2026-08-28T09:54:47.1875092Z               "line": 404
2026-08-28T09:54:47.1875354Z             }
2026-08-28T09:54:47.1875626Z           ]
2026-08-28T09:54:47.1875884Z         }
2026-08-28T09:54:47.1876149Z       }
2026-08-28T09:54:47.1876408Z     },
2026-08-28T09:54:47.1876671Z     {
2026-08-28T09:54:47.1877047Z       "id": "REQ-IPC-DEADLINE-UNHONORABLE-REFUSED",
2026-08-28T09:54:47.1904241Z       "title": "A BRAIN-IPC READ HANDED A DEADLINE ITS CARRIER CANNOT HONOR REFUSES BY NAME AT THE READ PRIMITIVE, never silently unbounded. `Brain::read_frame_until` takes `deadline: Option<Instant>` and dispatches on the carrier: the `Split` (pump) arm honors it as a total-wait `recv_timeout` on the remaining budget, and the blocking `Whole` arm CANNOT honor it at all — a timeout there would have to abandon a half-read frame, which is a desynced carrier, and that is precisely why REQ-HAZARD-PUMP-IPC-DEADLINE built the reader-thread carrier rather than reaching for a socket timeout (interprocess on Windows named pipes has no portable read timeout and its `set_nonblocking` corrupts mid-stream — measured at that requirement). So the fix is NOT to make the Whole arm bounded; the fix is to stop the Whole arm from ACCEPTING a bound it will not keep. Pre-fix it dropped the parameter on the floor and returned a blocking read, so a caller that asked for a bounded read got an unbounded one WITH NO DIAGNOSTIC — the caller's own deadline was the thing that vanished. THE INVARIANT IS TWO-SIDED AND BOTH SIDES ARE LOAD-BEARING: an ABSENT deadline STAYS ABSENT (the ordinary blocking read on a `Whole` carrier is untouched, and no default bound is fabricated for it — the absent-is-not-zero shape ruled on releases#201), while a PRESENT deadline on a carrier that cannot honor it becomes a NAMED, DISTINCT error naming the carrier arm and the remedy. THIS MOVES AN EXISTING RULE TO THE SEAM EVERY VERB CROSSES rather than inventing one: `digestlink::refuse_unbounded_carrier` already refuses a `Whole` brain for the digest-pull verb, and its own doc comment records why a comment was not enough — 'it already fooled one implementation of this very function'. One verb was guarded; every other deadline-taking verb (`read_event_until`, `broker_image_version_until`, `read_controller_event_resuming_until`, `read_peer_reply_until`) reached the same primitive unguarded, which is the declare-vs-enforce shape: the rule was declared in three doc comments and enforced at one call site. AT c62904e7 NO PRODUCTION CALLER PASSES A DEADLINE ON A WHOLE CARRIER — the rc pump, the peer pump and the digest pull all build `cold_start_pump`, and the two deadline-aware wrappers document that production passes `None` — so this is a latent unbounded read one construction away, filed as such rather than as a field incident. Gate: impl — the `Whole` arm of `read_frame_until` returns the named refusal for `Some(deadline)` and the unchanged blocking read for `None`, plus the one-line amendment at `refuse_unbounded_carrier` recording that the primitive now enforces what its comment used to only warn; int — three carrier arms measured together, because any one of them alone is satisfiable by a wrong fix: `Whole`+deadline must RETURN (the witnessed red, which pre-fix blocks to its kill bound), `Split`+deadline must STILL time out at its deadline (the positive control a blanket refusal would break), and `Whole`+`None` must still round-trip a real request (the negative control against a fabricated default). Kin REQ-HAZARD-PUMP-IPC-DEADLINE (the carrier split this protects) and REQ-DIGEST-CROSS-NODE-PULL (the one verb that guarded itself).",
2026-08-28T09:54:47.1904937Z       "requiredStages": [
2026-08-28T09:54:47.1905209Z         "impl",
2026-08-28T09:54:47.1905480Z         "int"
2026-08-28T09:54:47.1905748Z       ],
2026-08-28T09:54:47.1906019Z       "stages": {
2026-08-28T09:54:47.1906296Z         "doc": {
2026-08-28T09:54:47.1906586Z           "complete": false,
2026-08-28T09:54:47.1906944Z           "evidence": []
2026-08-28T09:54:47.1907216Z         },
2026-08-28T09:54:47.1907482Z         "impl": {
2026-08-28T09:54:47.1907786Z           "complete": true,
2026-08-28T09:54:47.1908070Z           "evidence": [
2026-08-28T09:54:47.1908333Z             {
2026-08-28T09:54:47.1908699Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.1909071Z               "line": 2450
2026-08-28T09:54:47.1909333Z             }
2026-08-28T09:54:47.1909615Z           ]
2026-08-28T09:54:47.1909882Z         },
2026-08-28T09:54:47.1910211Z         "int": {
2026-08-28T09:54:47.1910512Z           "complete": true,
2026-08-28T09:54:47.1910787Z           "evidence": [
2026-08-28T09:54:47.1911052Z             {
2026-08-28T09:54:47.1911510Z               "path": "crates/spt-daemon/tests/brain_read_deadline.rs",
2026-08-28T09:54:47.1911796Z               "line": 117
2026-08-28T09:54:47.1912064Z             },
2026-08-28T09:54:47.1912325Z             {
2026-08-28T09:54:47.1912783Z               "path": "crates/spt-daemon/tests/brain_read_deadline.rs",
2026-08-28T09:54:47.1913060Z               "line": 175
2026-08-28T09:54:47.1913335Z             },
2026-08-28T09:54:47.1913594Z             {
2026-08-28T09:54:47.1914044Z               "path": "crates/spt-daemon/tests/brain_read_deadline.rs",
2026-08-28T09:54:47.1914334Z               "line": 208
2026-08-28T09:54:47.1914597Z             }
2026-08-28T09:54:47.1914863Z           ]
2026-08-28T09:54:47.1915125Z         },
2026-08-28T09:54:47.1915401Z         "unit": {
2026-08-28T09:54:47.1915707Z           "complete": false,
2026-08-28T09:54:47.1915989Z           "evidence": []
2026-08-28T09:54:47.1916260Z         }
2026-08-28T09:54:47.1916522Z       }
2026-08-28T09:54:47.1916788Z     },
2026-08-28T09:54:47.1917050Z     {
2026-08-28T09:54:47.1917393Z       "id": "REQ-JOIN-DEFERRED-ELEVATION",
2026-08-28T09:54:47.1926605Z       "title": "W2 (JOIN-TRUTH, operator UX ruling verbatim): 'if --code was not supplied, don't spawn the elevated subnet-join window until a target machine is discovered → just in time for the code prompt.' When --code is ABSENT and the process is UNELEVATED, run the name prompt + ALREADY_MEMBER check + ensure_daemon + the MEET phase (brain.pair_meet) UNELEVATED; only on MetMember spawn the elevated window via the EXISTING try_auto_elevate machinery (the elevated re-run re-executes the join flow — its second meet is cheap, the member is proven present). A FAILED search must NEVER show a UAC/sudo/pkexec prompt. The --code path is UNCHANGED (gate-first, one-shot). The unelevated phase performs ZERO trust mutation — meet is pre-trust per REQ-JOIN-TWO-PHASE/ADR-0030. RULED OUT (doyle): cross-elevation hold-session adoption (passing the daemon-held pair session_id into the elevated process) — a new security seam we don't need; the elevated re-run re-meets instead. The elevation gate MOVES from command-entry to the enrollment boundary; discovery is read-only pre-trust.",
2026-08-28T09:54:47.1927082Z       "requiredStages": [
2026-08-28T09:54:47.1927362Z         "doc",
2026-08-28T09:54:47.1927639Z         "impl",
2026-08-28T09:54:47.1927902Z         "unit"
2026-08-28T09:54:47.1928178Z       ],
2026-08-28T09:54:47.1928446Z       "stages": {
2026-08-28T09:54:47.1928713Z         "doc": {
2026-08-28T09:54:47.1929083Z           "complete": true,
2026-08-28T09:54:47.1929372Z           "evidence": [
2026-08-28T09:54:47.1929644Z             {
2026-08-28T09:54:47.1930125Z               "path": "docs/adr/0005-totp-seeded-spake2-node-pairing.md",
2026-08-28T09:54:47.1930426Z               "line": 91
2026-08-28T09:54:47.1930702Z             }
2026-08-28T09:54:47.1930975Z           ]
2026-08-28T09:54:47.1931237Z         },
2026-08-28T09:54:47.1931508Z         "impl": {
2026-08-28T09:54:47.1931802Z           "complete": true,
2026-08-28T09:54:47.1932091Z           "evidence": [
2026-08-28T09:54:47.1932349Z             {
2026-08-28T09:54:47.1932682Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1932974Z               "line": 14912
2026-08-28T09:54:47.1933312Z             },
2026-08-28T09:54:47.1933583Z             {
2026-08-28T09:54:47.1933908Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1934185Z               "line": 14930
2026-08-28T09:54:47.1934455Z             }
2026-08-28T09:54:47.1934729Z           ]
2026-08-28T09:54:47.1934991Z         },
2026-08-28T09:54:47.1935254Z         "int": {
2026-08-28T09:54:47.1935554Z           "complete": false,
2026-08-28T09:54:47.1935835Z           "evidence": []
2026-08-28T09:54:47.1936103Z         },
2026-08-28T09:54:47.1936371Z         "unit": {
2026-08-28T09:54:47.1936742Z           "complete": true,
2026-08-28T09:54:47.1937024Z           "evidence": [
2026-08-28T09:54:47.1937288Z             {
2026-08-28T09:54:47.1937608Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1937889Z               "line": 33726
2026-08-28T09:54:47.1938180Z             }
2026-08-28T09:54:47.1938448Z           ]
2026-08-28T09:54:47.1938705Z         }
2026-08-28T09:54:47.1939044Z       }
2026-08-28T09:54:47.1939307Z     },
2026-08-28T09:54:47.1939562Z     {
2026-08-28T09:54:47.1939884Z       "id": "REQ-JOIN-DIAGNOSTICS",
2026-08-28T09:54:47.1948154Z       "title": "`spt subnet join` never fails SILENTLY (ADR-0030; the field incident showed no output at all). (a) LIVE progress during the meet (replace the one-shot \"Searching…\" cli.rs:6268 with periodic elapsed/deadline) so silence ≠ hang; (b) DETAILED failure on meet-exhaustion — rendezvous candidates + families attempted (IPv4/IPv6) + relay-vs-direct + the last concrete error — surfaced BEFORE any code prompt (a dead subnet must not make the user fetch a code); connect_seed_holder (pairhost.rs:437) and dial_via_rendezvous (meet.rs:281) currently swallow per-attempt errors — thread the last error up with attempt context; (c) PROPAGATE the terminal event — brain.rs:1024 `_ => continue` must deliver a daemon NoSeedHolder/PairFail to the CLI as a printed error (this is WHY the user saw nothing); (d) `--verbose`/`SPT_LOG` discovery TRACE (per-probe derived id, discovery path mDNS/n0-DNS/relay, per-family timeouts), opt-in — no such knob exists today. (next milestone)",
2026-08-28T09:54:47.1948589Z       "requiredStages": [
2026-08-28T09:54:47.1948856Z         "doc",
2026-08-28T09:54:47.1949209Z         "impl",
2026-08-28T09:54:47.1949466Z         "unit"
2026-08-28T09:54:47.1949737Z       ],
2026-08-28T09:54:47.1950008Z       "stages": {
2026-08-28T09:54:47.1950278Z         "doc": {
2026-08-28T09:54:47.1950565Z           "complete": true,
2026-08-28T09:54:47.1950916Z           "evidence": [
2026-08-28T09:54:47.1951193Z             {
2026-08-28T09:54:47.1951608Z               "path": "docs/adr/0030-robust-wan-subnet-join.md",
2026-08-28T09:54:47.1951885Z               "line": 3
2026-08-28T09:54:47.1952175Z             }
2026-08-28T09:54:47.1952590Z           ]
2026-08-28T09:54:47.1953052Z         },
2026-08-28T09:54:47.1953436Z         "impl": {
2026-08-28T09:54:47.1953731Z           "complete": true,
2026-08-28T09:54:47.1954023Z           "evidence": [
2026-08-28T09:54:47.1954285Z             {
2026-08-28T09:54:47.1954652Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.1954919Z               "line": 1842
2026-08-28T09:54:47.1955181Z             },
2026-08-28T09:54:47.1955475Z             {
2026-08-28T09:54:47.1955844Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.1956126Z               "line": 586
2026-08-28T09:54:47.1956388Z             },
2026-08-28T09:54:47.1956651Z             {
2026-08-28T09:54:47.1957027Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.1957294Z               "line": 468
2026-08-28T09:54:47.1957557Z             },
2026-08-28T09:54:47.1957805Z             {
2026-08-28T09:54:47.1958125Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1958394Z               "line": 15086
2026-08-28T09:54:47.1958666Z             }
2026-08-28T09:54:47.1958924Z           ]
2026-08-28T09:54:47.1959291Z         },
2026-08-28T09:54:47.1959658Z         "int": {
2026-08-28T09:54:47.1959997Z           "complete": false,
2026-08-28T09:54:47.1960297Z           "evidence": []
2026-08-28T09:54:47.1960549Z         },
2026-08-28T09:54:47.1960833Z         "unit": {
2026-08-28T09:54:47.1961134Z           "complete": true,
2026-08-28T09:54:47.1961420Z           "evidence": [
2026-08-28T09:54:47.1961682Z             {
2026-08-28T09:54:47.1962073Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.1962354Z               "line": 1035
2026-08-28T09:54:47.1962617Z             },
2026-08-28T09:54:47.1962942Z             {
2026-08-28T09:54:47.1963261Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.1963549Z               "line": 33607
2026-08-28T09:54:47.1963814Z             }
2026-08-28T09:54:47.1964081Z           ]
2026-08-28T09:54:47.1964344Z         }
2026-08-28T09:54:47.1964606Z       }
2026-08-28T09:54:47.1964883Z     },
2026-08-28T09:54:47.1965145Z     {
2026-08-28T09:54:47.1965460Z       "id": "REQ-JOIN-TWO-PHASE",
2026-08-28T09:54:47.1975848Z       "title": "`spt subnet join` is two-phase (meet-before-code) so the entered code is FRESH at the ceremony regardless of discovery time (ADR-0030). The meet selector is the PUBLIC `(subnet-name, TOTP-epoch)` (rendezvous_token = SHA256(domain ‖ name ‖ totp_step)); the secret TOTP-code is the SPAKE2 password ONLY, never a discovery input — so the code is collected AFTER a member is found. Extend the brain.pair_join event stream (brain.rs:1009): CLI PairMeetReq{subnet} → daemon meets (name, current-epoch) resolving the seed-holder's REAL stable pairing address → MetMember event → CLI prompts the code (cli.rs cmd_subnet_join :6236) → PairCodeSubmit{code} → daemon dials the held real-address on SPT_PAIR_ALPN + SPAKE2 → PairJoined/PairFail. Daemon holds the real-address between phases, bounded by a 5-MINUTE wait-for-code timeout; a wrong-code retry re-runs the CEREMONY ONLY against the held address (no re-search). The non-interactive `--code` path stays one-shot (no prompt; relies on REQ-NET-FAMILY-GATE fast discovery, fails loudly per REQ-JOIN-DIAGNOSTICS on staleness). Security unchanged — the meet is pre-trust/unauthenticated (SPT_PAIR_MEET_ALPN); auth stays in SPAKE2. (next milestone)",
2026-08-28T09:54:47.1976286Z       "requiredStages": [
2026-08-28T09:54:47.1976548Z         "doc",
2026-08-28T09:54:47.1976813Z         "impl",
2026-08-28T09:54:47.1977089Z         "unit",
2026-08-28T09:54:47.1977352Z         "int"
2026-08-28T09:54:47.1977613Z       ],
2026-08-28T09:54:47.1977958Z       "stages": {
2026-08-28T09:54:47.1978224Z         "doc": {
2026-08-28T09:54:47.1978529Z           "complete": true,
2026-08-28T09:54:47.1978810Z           "evidence": [
2026-08-28T09:54:47.1979158Z             {
2026-08-28T09:54:47.1979572Z               "path": "docs/adr/0030-robust-wan-subnet-join.md",
2026-08-28T09:54:47.1979853Z               "line": 3
2026-08-28T09:54:47.1980120Z             }
2026-08-28T09:54:47.1980392Z           ]
2026-08-28T09:54:47.1980654Z         },
2026-08-28T09:54:47.1980932Z         "impl": {
2026-08-28T09:54:47.1981228Z           "complete": true,
2026-08-28T09:54:47.1981505Z           "evidence": [
2026-08-28T09:54:47.1981769Z             {
2026-08-28T09:54:47.1982129Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.1982411Z               "line": 1842
2026-08-28T09:54:47.1982673Z             },
2026-08-28T09:54:47.1982935Z             {
2026-08-28T09:54:47.1983302Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.1983583Z               "line": 1866
2026-08-28T09:54:47.1983855Z             },
2026-08-28T09:54:47.1984123Z             {
2026-08-28T09:54:47.1984503Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.1984788Z               "line": 8998
2026-08-28T09:54:47.1985049Z             },
2026-08-28T09:54:47.1985426Z             {
2026-08-28T09:54:47.1985835Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.1986112Z               "line": 9050
2026-08-28T09:54:47.1986455Z             },
2026-08-28T09:54:47.1986723Z             {
2026-08-28T09:54:47.1987099Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.1987373Z               "line": 1506
2026-08-28T09:54:47.1987641Z             },
2026-08-28T09:54:47.1987912Z             {
2026-08-28T09:54:47.1988331Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.1988618Z               "line": 462
2026-08-28T09:54:47.1988890Z             },
2026-08-28T09:54:47.1989247Z             {
2026-08-28T09:54:47.1989651Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.1989989Z               "line": 273
2026-08-28T09:54:47.1990271Z             }
2026-08-28T09:54:47.1990538Z           ]
2026-08-28T09:54:47.1990801Z         },
2026-08-28T09:54:47.1991067Z         "int": {
2026-08-28T09:54:47.1991358Z           "complete": true,
2026-08-28T09:54:47.1991648Z           "evidence": [
2026-08-28T09:54:47.1991911Z             {
2026-08-28T09:54:47.1992305Z               "path": "crates/spt-daemon/tests/pairjoin.rs",
2026-08-28T09:54:47.1992575Z               "line": 82
2026-08-28T09:54:47.1992847Z             },
2026-08-28T09:54:47.1993114Z             {
2026-08-28T09:54:47.1993495Z               "path": "crates/spt-daemon/tests/pairjoin.rs",
2026-08-28T09:54:47.1993777Z               "line": 107
2026-08-28T09:54:47.1994044Z             }
2026-08-28T09:54:47.1994312Z           ]
2026-08-28T09:54:47.1994569Z         },
2026-08-28T09:54:47.1994840Z         "unit": {
2026-08-28T09:54:47.1995140Z           "complete": true,
2026-08-28T09:54:47.1995461Z           "evidence": [
2026-08-28T09:54:47.1995728Z             {
2026-08-28T09:54:47.1996090Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.1996367Z               "line": 9950
2026-08-28T09:54:47.1996625Z             },
2026-08-28T09:54:47.1996888Z             {
2026-08-28T09:54:47.1997292Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.1997584Z               "line": 1942
2026-08-28T09:54:47.1997854Z             }
2026-08-28T09:54:47.1998114Z           ]
2026-08-28T09:54:47.1998385Z         }
2026-08-28T09:54:47.1998643Z       }
2026-08-28T09:54:47.1998906Z     },
2026-08-28T09:54:47.1999239Z     {
2026-08-28T09:54:47.1999578Z       "id": "REQ-JOIN-VERBOSE-CLOCK",
2026-08-28T09:54:47.2005695Z       "title": "W2/D4 (JOIN-TRUTH): the JOINER side is no longer blind to its own ceremony clock — `spt subnet join --verbose` prints the joiner's derived TOTP step, the applied offset seconds, and the NTP correction state (corrected / uncorrected) per meet sweep; the same triple folds into `meet_failure_detail` so the NO_SEED_HOLDER verbose block carries it. ROOT: diagnosing enlyzeam required shipping a compiled probe over ssh because the member logs PAIR_MEET_UP step=N but the joiner surfaces nothing about its OWN step/offset — the exact asymmetry that hid D1-D3. Extends REQ-JOIN-DIAGNOSTICS's --verbose without a new knob. CLI help changes → xtask docs gen, no internal REQ codes in clap /// (docs-token gate).",
2026-08-28T09:54:47.2006141Z       "requiredStages": [
2026-08-28T09:54:47.2006417Z         "impl",
2026-08-28T09:54:47.2006684Z         "unit"
2026-08-28T09:54:47.2006951Z       ],
2026-08-28T09:54:47.2007228Z       "stages": {
2026-08-28T09:54:47.2007495Z         "doc": {
2026-08-28T09:54:47.2007805Z           "complete": false,
2026-08-28T09:54:47.2008088Z           "evidence": []
2026-08-28T09:54:47.2008361Z         },
2026-08-28T09:54:47.2008640Z         "impl": {
2026-08-28T09:54:47.2008931Z           "complete": true,
2026-08-28T09:54:47.2009308Z           "evidence": [
2026-08-28T09:54:47.2009565Z             {
2026-08-28T09:54:47.2009947Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.2010233Z               "line": 553
2026-08-28T09:54:47.2010495Z             },
2026-08-28T09:54:47.2010767Z             {
2026-08-28T09:54:47.2011157Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.2011515Z               "line": 564
2026-08-28T09:54:47.2011786Z             },
2026-08-28T09:54:47.2012054Z             {
2026-08-28T09:54:47.2012439Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.2012721Z               "line": 586
2026-08-28T09:54:47.2012993Z             },
2026-08-28T09:54:47.2013256Z             {
2026-08-28T09:54:47.2013643Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.2013930Z               "line": 129
2026-08-28T09:54:47.2014197Z             }
2026-08-28T09:54:47.2014464Z           ]
2026-08-28T09:54:47.2014783Z         },
2026-08-28T09:54:47.2015054Z         "int": {
2026-08-28T09:54:47.2015350Z           "complete": false,
2026-08-28T09:54:47.2015636Z           "evidence": []
2026-08-28T09:54:47.2015903Z         },
2026-08-28T09:54:47.2016170Z         "unit": {
2026-08-28T09:54:47.2016450Z           "complete": true,
2026-08-28T09:54:47.2016725Z           "evidence": [
2026-08-28T09:54:47.2016987Z             {
2026-08-28T09:54:47.2017365Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.2017650Z               "line": 1035
2026-08-28T09:54:47.2017912Z             },
2026-08-28T09:54:47.2018208Z             {
2026-08-28T09:54:47.2018586Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.2018873Z               "line": 1069
2026-08-28T09:54:47.2019220Z             }
2026-08-28T09:54:47.2019482Z           ]
2026-08-28T09:54:47.2019739Z         }
2026-08-28T09:54:47.2020002Z       }
2026-08-28T09:54:47.2020269Z     },
2026-08-28T09:54:47.2020527Z     {
2026-08-28T09:54:47.2020823Z       "id": "REQ-KICK-1",
2026-08-28T09:54:47.2028053Z       "title": "Explicit, loud controller displacement: `spt rc kick <target>` / `--take` (Take intent) kicks the incumbent controller and becomes controller; the displaced controller receives a LOUD `Displaced{by}` notice and is FULLY DETACHED (not demoted to a viewer). A default attach to a controlled endpoint is NEVER a silent displace (it is the Control busy-refusal). An old (N-1) rc omits intent → Control, so it can drive a free endpoint but CANNOT `--take` — it can never silently steal, and gets a clean busy-refusal instead. Taking control rides the same access_check(endpoint, origin, Unsolicited) as a normal control attach (if you may drive, you may take — no elevated kick policy). The picker surfaces 'Kick <node> and attach' (Take) only on a controlled (blue ■) endpoint, via the existing attach dispatch (single-bringup-path: intent is a parameter).",
2026-08-28T09:54:47.2028625Z       "requiredStages": [
2026-08-28T09:54:47.2028888Z         "doc",
2026-08-28T09:54:47.2029231Z         "impl",
2026-08-28T09:54:47.2029539Z         "unit",
2026-08-28T09:54:47.2029804Z         "int"
2026-08-28T09:54:47.2030066Z       ],
2026-08-28T09:54:47.2030352Z       "stages": {
2026-08-28T09:54:47.2030615Z         "doc": {
2026-08-28T09:54:47.2030915Z           "complete": true,
2026-08-28T09:54:47.2031205Z           "evidence": [
2026-08-28T09:54:47.2031483Z             {
2026-08-28T09:54:47.2031793Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2032070Z               "line": 405
2026-08-28T09:54:47.2032345Z             }
2026-08-28T09:54:47.2032615Z           ]
2026-08-28T09:54:47.2032883Z         },
2026-08-28T09:54:47.2033155Z         "impl": {
2026-08-28T09:54:47.2033446Z           "complete": true,
2026-08-28T09:54:47.2033723Z           "evidence": [
2026-08-28T09:54:47.2033986Z             {
2026-08-28T09:54:47.2034357Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.2034637Z               "line": 41
2026-08-28T09:54:47.2034906Z             },
2026-08-28T09:54:47.2035168Z             {
2026-08-28T09:54:47.2035487Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.2035764Z               "line": 1522
2026-08-28T09:54:47.2036027Z             }
2026-08-28T09:54:47.2036318Z           ]
2026-08-28T09:54:47.2036576Z         },
2026-08-28T09:54:47.2036844Z         "int": {
2026-08-28T09:54:47.2037234Z           "complete": true,
2026-08-28T09:54:47.2037518Z           "evidence": [
2026-08-28T09:54:47.2037778Z             {
2026-08-28T09:54:47.2038156Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.2038432Z               "line": 1166
2026-08-28T09:54:47.2038703Z             }
2026-08-28T09:54:47.2039051Z           ]
2026-08-28T09:54:47.2039308Z         },
2026-08-28T09:54:47.2039580Z         "unit": {
2026-08-28T09:54:47.2039867Z           "complete": true,
2026-08-28T09:54:47.2040146Z           "evidence": [
2026-08-28T09:54:47.2040402Z             {
2026-08-28T09:54:47.2040931Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.2041198Z               "line": 627
2026-08-28T09:54:47.2041541Z             }
2026-08-28T09:54:47.2041819Z           ]
2026-08-28T09:54:47.2042081Z         }
2026-08-28T09:54:47.2042344Z       }
2026-08-28T09:54:47.2042602Z     },
2026-08-28T09:54:47.2042866Z     {
2026-08-28T09:54:47.2043190Z       "id": "REQ-KNOCK-ANSWER-RECEIPT",
2026-08-28T09:54:47.2064072Z       "title": "A CROSS-NODE APPROVAL SENDS AN ANSWER RECEIPT BACK TO THE KNOCKER'S NODE, and that receipt is the only thing that consumes a knocker-local `--mutual` pre-authorization. Pre-auths are node-local BY DESIGN and stay so: nobody writes another endpoint's rules, so the knocker states its own conditional intention on its own side and its own daemon writes the reverse rule when the answer is proven. As shipped the only consumer runs inside the APPROVER's node against the APPROVER's store, so for every cross-node knock `armed_mutual` is None at the approver and the knocker's record dangles forever -- the seam CONTEXT.md's mutual-whitelisting entry already names ('written by their daemon at answer-receipt, keyed to the knock's correlation id and the node-proven answer') simply does not exist. THE RECEIPT IS ITS OWN KIND-TAGGED WIRE FAMILY MEMBER, on the `knockmsg`/`redeemmsg` precedent and for the identical reason: UNKNOWN FIELDS DECODE FINE, so a receipt smuggled as a field on an existing record would be ACCEPTED and MISREAD by an N-1 daemon, and misread is worse than dropped. A new kind resolves to the unknown family and drops clean. NODE-PROVEN OR IT CONSUMES NOTHING: the receipt's origin node is transport truth from the handshake identity, never a claimed field, and the consumed pre-auth is keyed to the knock's correlation id so a replayed receipt writes the reverse rule exactly once. AN UNPROVEN OR UNKNOWN RECEIPT IS NOT A REFUSAL AND NOT AN ANSWER -- it leaves the pre-authorization armed, because a conditional intention that silently expired reads identically to one that was never made. Gate: doc -- the entry naming the receipt family, its tag, and what a receipt is allowed to consume; impl -- the record, the send leg on the approve path, the classifier arm and the receiving consume seam; unit -- a receipt classifies into its own family and can NEVER be read as the message feed or as a knock (both asserted, since either alone leaves the other misclassification reachable), an N-1 receiver drops it clean, a proven receipt consumes the knocker-local pre-auth and writes the reverse rule ONCE while a REPLAY of the same receipt writes nothing further, a receipt whose correlation id matches no armed record writes nothing, and -- the discriminator, since 'consumed' and 'never armed' both end with no pending record -- an arrival that is NOT node-proven leaves the record ARMED rather than consumed, asserted beside the proven arrival on the same fixture so the two cannot both be satisfied by an implementation that ignores proof.",
2026-08-28T09:54:47.2064531Z       "requiredStages": [
2026-08-28T09:54:47.2064797Z         "doc",
2026-08-28T09:54:47.2065070Z         "impl",
2026-08-28T09:54:47.2065328Z         "unit",
2026-08-28T09:54:47.2065594Z         "int"
2026-08-28T09:54:47.2065856Z       ],
2026-08-28T09:54:47.2066150Z       "stages": {
2026-08-28T09:54:47.2066411Z         "doc": {
2026-08-28T09:54:47.2066712Z           "complete": true,
2026-08-28T09:54:47.2067055Z           "evidence": [
2026-08-28T09:54:47.2067317Z             {
2026-08-28T09:54:47.2067623Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2067899Z               "line": 927
2026-08-28T09:54:47.2068170Z             }
2026-08-28T09:54:47.2068432Z           ]
2026-08-28T09:54:47.2068699Z         },
2026-08-28T09:54:47.2069042Z         "impl": {
2026-08-28T09:54:47.2069339Z           "complete": true,
2026-08-28T09:54:47.2069621Z           "evidence": [
2026-08-28T09:54:47.2069879Z             {
2026-08-28T09:54:47.2070265Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2070603Z               "line": 33
2026-08-28T09:54:47.2070875Z             },
2026-08-28T09:54:47.2071138Z             {
2026-08-28T09:54:47.2071528Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2071812Z               "line": 43
2026-08-28T09:54:47.2072078Z             },
2026-08-28T09:54:47.2072349Z             {
2026-08-28T09:54:47.2072727Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2073014Z               "line": 190
2026-08-28T09:54:47.2073279Z             },
2026-08-28T09:54:47.2073547Z             {
2026-08-28T09:54:47.2073924Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2074204Z               "line": 268
2026-08-28T09:54:47.2074551Z             },
2026-08-28T09:54:47.2074842Z             {
2026-08-28T09:54:47.2075254Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2080262Z               "line": 1087
2026-08-28T09:54:47.2080591Z             },
2026-08-28T09:54:47.2080872Z             {
2026-08-28T09:54:47.2081273Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2081554Z               "line": 1774
2026-08-28T09:54:47.2081821Z             },
2026-08-28T09:54:47.2082083Z             {
2026-08-28T09:54:47.2082447Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.2082829Z               "line": 524
2026-08-28T09:54:47.2083110Z             },
2026-08-28T09:54:47.2083378Z             {
2026-08-28T09:54:47.2083735Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.2084021Z               "line": 540
2026-08-28T09:54:47.2084283Z             },
2026-08-28T09:54:47.2084552Z             {
2026-08-28T09:54:47.2084904Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.2085189Z               "line": 574
2026-08-28T09:54:47.2085455Z             },
2026-08-28T09:54:47.2085726Z             {
2026-08-28T09:54:47.2086180Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2086467Z               "line": 54
2026-08-28T09:54:47.2086743Z             },
2026-08-28T09:54:47.2087009Z             {
2026-08-28T09:54:47.2087404Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2087683Z               "line": 66
2026-08-28T09:54:47.2087950Z             },
2026-08-28T09:54:47.2088218Z             {
2026-08-28T09:54:47.2088603Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2088890Z               "line": 81
2026-08-28T09:54:47.2089232Z             },
2026-08-28T09:54:47.2089500Z             {
2026-08-28T09:54:47.2089858Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2090142Z               "line": 953
2026-08-28T09:54:47.2090404Z             },
2026-08-28T09:54:47.2090675Z             {
2026-08-28T09:54:47.2091146Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2091489Z               "line": 1015
2026-08-28T09:54:47.2091747Z             },
2026-08-28T09:54:47.2092014Z             {
2026-08-28T09:54:47.2092376Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2092658Z               "line": 1538
2026-08-28T09:54:47.2092924Z             },
2026-08-28T09:54:47.2093184Z             {
2026-08-28T09:54:47.2093514Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2093795Z               "line": 17454
2026-08-28T09:54:47.2094143Z             },
2026-08-28T09:54:47.2094414Z             {
2026-08-28T09:54:47.2094739Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2095024Z               "line": 17515
2026-08-28T09:54:47.2095388Z             },
2026-08-28T09:54:47.2095657Z             {
2026-08-28T09:54:47.2095976Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2096263Z               "line": 18320
2026-08-28T09:54:47.2096530Z             },
2026-08-28T09:54:47.2096798Z             {
2026-08-28T09:54:47.2097131Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2097484Z               "line": 18372
2026-08-28T09:54:47.2097747Z             },
2026-08-28T09:54:47.2098012Z             {
2026-08-28T09:54:47.2098339Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2098616Z               "line": 18389
2026-08-28T09:54:47.2098887Z             },
2026-08-28T09:54:47.2099231Z             {
2026-08-28T09:54:47.2099570Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2099851Z               "line": 18401
2026-08-28T09:54:47.2100112Z             },
2026-08-28T09:54:47.2100384Z             {
2026-08-28T09:54:47.2100717Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2101001Z               "line": 1670
2026-08-28T09:54:47.2101268Z             },
2026-08-28T09:54:47.2101531Z             {
2026-08-28T09:54:47.2101870Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2102146Z               "line": 1689
2026-08-28T09:54:47.2102403Z             },
2026-08-28T09:54:47.2102665Z             {
2026-08-28T09:54:47.2102999Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2103274Z               "line": 1722
2026-08-28T09:54:47.2103545Z             }
2026-08-28T09:54:47.2103811Z           ]
2026-08-28T09:54:47.2104079Z         },
2026-08-28T09:54:47.2104345Z         "int": {
2026-08-28T09:54:47.2104645Z           "complete": true,
2026-08-28T09:54:47.2105018Z           "evidence": [
2026-08-28T09:54:47.2105289Z             {
2026-08-28T09:54:47.2105775Z               "path": "crates/spt/tests/knock_approve_not_hostage_e2e.rs",
2026-08-28T09:54:47.2106057Z               "line": 227
2026-08-28T09:54:47.2106328Z             }
2026-08-28T09:54:47.2106590Z           ]
2026-08-28T09:54:47.2106861Z         },
2026-08-28T09:54:47.2107133Z         "unit": {
2026-08-28T09:54:47.2107424Z           "complete": true,
2026-08-28T09:54:47.2107710Z           "evidence": [
2026-08-28T09:54:47.2107978Z             {
2026-08-28T09:54:47.2108424Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2108713Z               "line": 328
2026-08-28T09:54:47.2109061Z             },
2026-08-28T09:54:47.2109318Z             {
2026-08-28T09:54:47.2109695Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2109981Z               "line": 375
2026-08-28T09:54:47.2110258Z             },
2026-08-28T09:54:47.2110530Z             {
2026-08-28T09:54:47.2110901Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2111188Z               "line": 424
2026-08-28T09:54:47.2111458Z             },
2026-08-28T09:54:47.2111728Z             {
2026-08-28T09:54:47.2112110Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2112391Z               "line": 539
2026-08-28T09:54:47.2112662Z             },
2026-08-28T09:54:47.2112924Z             {
2026-08-28T09:54:47.2113307Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2113588Z               "line": 2603
2026-08-28T09:54:47.2113858Z             },
2026-08-28T09:54:47.2114128Z             {
2026-08-28T09:54:47.2114518Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2114795Z               "line": 2661
2026-08-28T09:54:47.2115063Z             },
2026-08-28T09:54:47.2115330Z             {
2026-08-28T09:54:47.2115706Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2115997Z               "line": 178
2026-08-28T09:54:47.2116340Z             },
2026-08-28T09:54:47.2116613Z             {
2026-08-28T09:54:47.2117002Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2117294Z               "line": 204
2026-08-28T09:54:47.2117560Z             },
2026-08-28T09:54:47.2117837Z             {
2026-08-28T09:54:47.2118223Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2118501Z               "line": 222
2026-08-28T09:54:47.2118772Z             },
2026-08-28T09:54:47.2119128Z             {
2026-08-28T09:54:47.2119527Z               "path": "crates/spt-net/src/net/answermsg.rs",
2026-08-28T09:54:47.2119855Z               "line": 242
2026-08-28T09:54:47.2120127Z             },
2026-08-28T09:54:47.2120423Z             {
2026-08-28T09:54:47.2120813Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2121095Z               "line": 3316
2026-08-28T09:54:47.2121354Z             },
2026-08-28T09:54:47.2121620Z             {
2026-08-28T09:54:47.2121933Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2122225Z               "line": 37222
2026-08-28T09:54:47.2122498Z             },
2026-08-28T09:54:47.2122765Z             {
2026-08-28T09:54:47.2123089Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2123371Z               "line": 37268
2026-08-28T09:54:47.2123643Z             }
2026-08-28T09:54:47.2123906Z           ]
2026-08-28T09:54:47.2124172Z         }
2026-08-28T09:54:47.2124437Z       }
2026-08-28T09:54:47.2124703Z     },
2026-08-28T09:54:47.2124961Z     {
2026-08-28T09:54:47.2125299Z       "id": "REQ-KNOCK-AUTHORITY-SPLIT",
2026-08-28T09:54:47.2139878Z       "title": "Who may answer a knock, or mint an invite code, follows the TARGET TIER of what it grants. Node-target grants (node-tier rules, node modes, any permission no single endpoint owns) are answerable and mintable ONLY by the node's engine-room and land only in the engine-room's inbox. Endpoint-target grants stay SELF-SOVEREIGN — the target endpoint's own agent answers — with one guard: approving a surface that is not sender-attributable writes a NODE-SUBJECT entry, admitting every endpoint on the knocker's node whatever the knock named, so that approval (and a code-mint baking such a surface) must carry an explicit widening acknowledgment at the CLI and is gated by the node's grant-nodes policy. No silent widening, ever. A code is a pre-approval, never a widening loophole: it carries the same acknowledgment as the approve it stands in for. Where a single knock mixes attributable and non-attributable surfaces under a false policy, the attributable SUBSET is approvable and the refused remainder STAYS PENDING with stdout naming the engine-room as the seat that can answer it — the mixed case renders its own verdict and must not collapse into a blanket approve or a blanket deny (hazard 7.61: a partial fault renders its own verdict). Gate: doc — the CONTEXT.md grant-authority entry; impl — target-tier routing, the widening acknowledgment, and the partial-approve path; unit — a node-target knock reaches only the engine-room inbox, an endpoint-target knock is answerable by its own agent and not routed to the engine-room, a non-attributable approval without the acknowledgment is refused, and a mixed knock under a false policy grants the attributable subset while the remainder stays pending naming the engine-room.",
2026-08-28T09:54:47.2140432Z       "requiredStages": [
2026-08-28T09:54:47.2140694Z         "doc",
2026-08-28T09:54:47.2140976Z         "impl",
2026-08-28T09:54:47.2141252Z         "unit"
2026-08-28T09:54:47.2141510Z       ],
2026-08-28T09:54:47.2141849Z       "stages": {
2026-08-28T09:54:47.2142116Z         "doc": {
2026-08-28T09:54:47.2142401Z           "complete": true,
2026-08-28T09:54:47.2142682Z           "evidence": [
2026-08-28T09:54:47.2142948Z             {
2026-08-28T09:54:47.2143246Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2143547Z               "line": 936
2026-08-28T09:54:47.2143857Z             }
2026-08-28T09:54:47.2144196Z           ]
2026-08-28T09:54:47.2144467Z         },
2026-08-28T09:54:47.2144740Z         "impl": {
2026-08-28T09:54:47.2145036Z           "complete": true,
2026-08-28T09:54:47.2145312Z           "evidence": [
2026-08-28T09:54:47.2145581Z             {
2026-08-28T09:54:47.2145937Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2146217Z               "line": 744
2026-08-28T09:54:47.2146490Z             },
2026-08-28T09:54:47.2146748Z             {
2026-08-28T09:54:47.2147105Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2147415Z               "line": 769
2026-08-28T09:54:47.2147725Z             },
2026-08-28T09:54:47.2147983Z             {
2026-08-28T09:54:47.2148354Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2148655Z               "line": 788
2026-08-28T09:54:47.2149073Z             },
2026-08-28T09:54:47.2149364Z             {
2026-08-28T09:54:47.2149721Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2150003Z               "line": 796
2026-08-28T09:54:47.2150270Z             },
2026-08-28T09:54:47.2150538Z             {
2026-08-28T09:54:47.2150977Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2151382Z               "line": 1303
2026-08-28T09:54:47.2151702Z             },
2026-08-28T09:54:47.2151964Z             {
2026-08-28T09:54:47.2152293Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2152570Z               "line": 17935
2026-08-28T09:54:47.2152846Z             },
2026-08-28T09:54:47.2153114Z             {
2026-08-28T09:54:47.2153443Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2153727Z               "line": 19458
2026-08-28T09:54:47.2153992Z             }
2026-08-28T09:54:47.2154264Z           ]
2026-08-28T09:54:47.2154526Z         },
2026-08-28T09:54:47.2154802Z         "int": {
2026-08-28T09:54:47.2155099Z           "complete": false,
2026-08-28T09:54:47.2155470Z           "evidence": []
2026-08-28T09:54:47.2155737Z         },
2026-08-28T09:54:47.2156009Z         "unit": {
2026-08-28T09:54:47.2156294Z           "complete": true,
2026-08-28T09:54:47.2156583Z           "evidence": [
2026-08-28T09:54:47.2156840Z             {
2026-08-28T09:54:47.2157341Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2157618Z               "line": 2721
2026-08-28T09:54:47.2157885Z             },
2026-08-28T09:54:47.2158148Z             {
2026-08-28T09:54:47.2158501Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2158858Z               "line": 2756
2026-08-28T09:54:47.2159201Z             }
2026-08-28T09:54:47.2159501Z           ]
2026-08-28T09:54:47.2159768Z         }
2026-08-28T09:54:47.2160029Z       }
2026-08-28T09:54:47.2160286Z     },
2026-08-28T09:54:47.2160545Z     {
2026-08-28T09:54:47.2160863Z       "id": "REQ-KNOCK-BARE-VERB",
2026-08-28T09:54:47.2172130Z       "title": "`spt knock <target>` is the bare form of the knock verb — sugar routing to `knock send` with identical semantics, identical origin classification and identical defaults, never a second code path with its own behavior. The docs already describe this form (the CLI's own knock doc-comment and the CONTEXT.md knock-initiation entry both state it): this requirement makes those sentences TRUE rather than amending them away, which is the correct repair for a documented-but-unbuilt affordance. Because clap resolves a subcommand name before a positional, an endpoint whose id collides with a subcommand name (`send`, `list`, `approve`, `deny`, `new-code`, `redeem`) is shadowed and must be knocked as `knock send <id>`; that SHADOWING RULE IS DOCUMENTED where an operator meets it rather than left to be discovered, since the failure mode is a knock that silently runs a different verb. Gate: doc — the CONTEXT.md knock-initiation entry and the public CLI reference stating the bare form and the shadowing rule; impl — the optional-subcommand-with-positional shape routing to the send path; unit — the bare form produces the same knock the explicit send form produces for the same arguments, and a target whose id equals a subcommand name resolves to THAT SUBCOMMAND (the precedence is pinned, not assumed).",
2026-08-28T09:54:47.2172575Z       "requiredStages": [
2026-08-28T09:54:47.2172847Z         "doc",
2026-08-28T09:54:47.2173118Z         "impl",
2026-08-28T09:54:47.2173385Z         "unit"
2026-08-28T09:54:47.2173652Z       ],
2026-08-28T09:54:47.2173914Z       "stages": {
2026-08-28T09:54:47.2174177Z         "doc": {
2026-08-28T09:54:47.2174474Z           "complete": true,
2026-08-28T09:54:47.2174757Z           "evidence": [
2026-08-28T09:54:47.2175079Z             {
2026-08-28T09:54:47.2175509Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2175795Z               "line": 920
2026-08-28T09:54:47.2176058Z             },
2026-08-28T09:54:47.2176343Z             {
2026-08-28T09:54:47.2176773Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2177064Z               "line": 9
2026-08-28T09:54:47.2177324Z             }
2026-08-28T09:54:47.2177593Z           ]
2026-08-28T09:54:47.2177850Z         },
2026-08-28T09:54:47.2178123Z         "impl": {
2026-08-28T09:54:47.2178414Z           "complete": true,
2026-08-28T09:54:47.2178691Z           "evidence": [
2026-08-28T09:54:47.2179047Z             {
2026-08-28T09:54:47.2179381Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2179677Z               "line": 16603
2026-08-28T09:54:47.2179936Z             }
2026-08-28T09:54:47.2180201Z           ]
2026-08-28T09:54:47.2180463Z         },
2026-08-28T09:54:47.2180734Z         "int": {
2026-08-28T09:54:47.2181025Z           "complete": false,
2026-08-28T09:54:47.2181312Z           "evidence": []
2026-08-28T09:54:47.2181579Z         },
2026-08-28T09:54:47.2181842Z         "unit": {
2026-08-28T09:54:47.2182138Z           "complete": true,
2026-08-28T09:54:47.2182417Z           "evidence": [
2026-08-28T09:54:47.2182690Z             {
2026-08-28T09:54:47.2183092Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2183383Z               "line": 30370
2026-08-28T09:54:47.2183649Z             },
2026-08-28T09:54:47.2183912Z             {
2026-08-28T09:54:47.2184231Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2184512Z               "line": 30402
2026-08-28T09:54:47.2184780Z             },
2026-08-28T09:54:47.2185048Z             {
2026-08-28T09:54:47.2185379Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2185669Z               "line": 30430
2026-08-28T09:54:47.2185993Z             }
2026-08-28T09:54:47.2186259Z           ]
2026-08-28T09:54:47.2186526Z         }
2026-08-28T09:54:47.2186793Z       }
2026-08-28T09:54:47.2187056Z     },
2026-08-28T09:54:47.2187319Z     {
2026-08-28T09:54:47.2187685Z       "id": "REQ-KNOCK-CODE-INERT-RULE-REPAIR",
2026-08-28T09:54:47.2201554Z       "title": "A SHIPPED DEFECT, REPAIRED IN THE OPEN RATHER THAN RIDDEN ALONG. `spt knock redeem` as shipped in v0.49.0 writes `Subject::SenderEndpoint` for EVERY surface and hardcodes the widening acknowledgment true at the mutation seam. For a NON-ATTRIBUTABLE surface that rule CAN NEVER MATCH TRAFFIC: it is written, reported as approved, rendered in the access view as though it governed something, and governs nothing -- the dead-rule class, and the silent arm of the same fault whose loud arm was already filed. The acknowledgment was never actually given by anyone, either; it was asserted by the code on the operator's behalf, which is the more serious half. THE REPAIR IS ONE IMPLEMENTATION UNDER BOTH ARMS -- the local verb and the wire serve side compute the grant through the SAME code, in the shape the fork-local split already established -- because a repair applied to one arm is a defect scheduled to return through the other. IT IS NAMED IN THE WAVE CARD AS A REPAIR OF SHIPPED BEHAVIOUR, not folded silently into the feature that happened to touch it: an operator whose access view currently shows an inert rule deserves to find the reason under its own heading. Gate: impl -- the shared grant construction replacing the every-surface sender-endpoint write and the hardcoded acknowledgment; unit -- a non-attributable surface redeemed LOCALLY writes a rule that MATCHES the traffic it names (asserted against the real chain, not against a second reading of it), the acknowledgment is honoured rather than assumed, and the local and wire arms produce the identical grant for one fixture -- the discriminator that proves it is one implementation and not two that currently agree.",
2026-08-28T09:54:47.2201966Z       "requiredStages": [
2026-08-28T09:54:47.2202232Z         "impl",
2026-08-28T09:54:47.2202575Z         "unit"
2026-08-28T09:54:47.2202837Z       ],
2026-08-28T09:54:47.2203124Z       "stages": {
2026-08-28T09:54:47.2203390Z         "doc": {
2026-08-28T09:54:47.2203693Z           "complete": false,
2026-08-28T09:54:47.2203979Z           "evidence": []
2026-08-28T09:54:47.2204241Z         },
2026-08-28T09:54:47.2204518Z         "impl": {
2026-08-28T09:54:47.2204808Z           "complete": true,
2026-08-28T09:54:47.2205104Z           "evidence": [
2026-08-28T09:54:47.2205404Z             {
2026-08-28T09:54:47.2205787Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2206062Z               "line": 128
2026-08-28T09:54:47.2206319Z             },
2026-08-28T09:54:47.2206584Z             {
2026-08-28T09:54:47.2206941Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2207223Z               "line": 557
2026-08-28T09:54:47.2207485Z             },
2026-08-28T09:54:47.2207757Z             {
2026-08-28T09:54:47.2208110Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2208397Z               "line": 581
2026-08-28T09:54:47.2208668Z             },
2026-08-28T09:54:47.2208928Z             {
2026-08-28T09:54:47.2209389Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2209666Z               "line": 590
2026-08-28T09:54:47.2209937Z             },
2026-08-28T09:54:47.2210257Z             {
2026-08-28T09:54:47.2210620Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2210896Z               "line": 631
2026-08-28T09:54:47.2211157Z             },
2026-08-28T09:54:47.2211415Z             {
2026-08-28T09:54:47.2211734Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2212025Z               "line": 19257
2026-08-28T09:54:47.2212292Z             }
2026-08-28T09:54:47.2212554Z           ]
2026-08-28T09:54:47.2212825Z         },
2026-08-28T09:54:47.2213092Z         "int": {
2026-08-28T09:54:47.2213460Z           "complete": false,
2026-08-28T09:54:47.2213746Z           "evidence": []
2026-08-28T09:54:47.2214021Z         },
2026-08-28T09:54:47.2214295Z         "unit": {
2026-08-28T09:54:47.2214591Z           "complete": true,
2026-08-28T09:54:47.2214872Z           "evidence": [
2026-08-28T09:54:47.2215145Z             {
2026-08-28T09:54:47.2215535Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2215817Z               "line": 745
2026-08-28T09:54:47.2216089Z             },
2026-08-28T09:54:47.2216342Z             {
2026-08-28T09:54:47.2216700Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2216979Z               "line": 2239
2026-08-28T09:54:47.2217253Z             },
2026-08-28T09:54:47.2217515Z             {
2026-08-28T09:54:47.2217877Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2218168Z               "line": 2277
2026-08-28T09:54:47.2218446Z             },
2026-08-28T09:54:47.2218726Z             {
2026-08-28T09:54:47.2219165Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2219446Z               "line": 2317
2026-08-28T09:54:47.2219710Z             },
2026-08-28T09:54:47.2219973Z             {
2026-08-28T09:54:47.2220321Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2220602Z               "line": 2443
2026-08-28T09:54:47.2220870Z             },
2026-08-28T09:54:47.2221131Z             {
2026-08-28T09:54:47.2221456Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2221819Z               "line": 29391
2026-08-28T09:54:47.2222086Z             },
2026-08-28T09:54:47.2222355Z             {
2026-08-28T09:54:47.2222684Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2222971Z               "line": 29547
2026-08-28T09:54:47.2223229Z             }
2026-08-28T09:54:47.2223505Z           ]
2026-08-28T09:54:47.2223763Z         }
2026-08-28T09:54:47.2224035Z       }
2026-08-28T09:54:47.2224296Z     },
2026-08-28T09:54:47.2224567Z     {
2026-08-28T09:54:47.2224922Z       "id": "REQ-KNOCK-CODE-MULTI-ENVELOPE",
2026-08-28T09:54:47.2260353Z       "title": "A CODE MINTED ON A MULTI-SUBNET NODE OPENS FOR EVERY MEMBERSHIP THAT NODE HOLDS, AND THE MINT SAYS SO. The ratified design always had it (ADR-0054 sketch line 17, `--subnet` selecting only when the minter belongs to several); the W4 build DEFERRED the slice and marked it UNBUILT in amendment 3, and the shipped surface then taught the deferral as the design -- `--subnet` took exactly ONE value and several memberships with no `--subnet` REFUSED with `KNOCK_WHICH_SUBNET`, whose copy states 'a sealed code opens only for members of ONE subnet' as though it were a rule rather than a gap. The operator's restatement (2026-08-04) governs and supersedes amendment 3: `--subnet` TAKES A LIST, and OMITTED means seal for ALL memberships. ONE SECRET, N KEYS -- NEVER N SECRETS: the store record keys on the secret, so a second draw would mint a code whose envelope opens to a secret no record holds, and this is also what keeps the SIV construction safe, since the envelopes differ by KEY and never by a repeated (key, plaintext) pair. The envelopes ride ONE string, concatenated at a fixed 22 B width so the count is DERIVED FROM THE LENGTH rather than declared in a header -- nothing in the string says how many there are, for the same reason nothing in it says which subnets they are for. THE DISCLOSURE DELTA IS ACCEPTED AND STATED RATHER THAN PADDED AWAY (doyle, 2026-08-18): a concatenated code reveals HOW MANY memberships the minter holds, never WHICH, and padding to a fixed envelope count would spend the length budget the whole ADR defends in order to hide a fact strictly weaker than the ones the format actually hides. THE N-1 ARM IS REAL AND IS ANSWERED AT THE MINT, NOT BY A VERSION FLOOR: an older binary refuses a multi-envelope string on its length check and reports it through the anti-oracle silence every other failure uses, so no redeemer can ever diagnose it -- and a new prefix would not help, since an unknown prefix routes to the legacy path and misses just as silently. The mint is therefore the only place the fact can be told, and it tells it: sealing N>1 envelopes PRINTS the consequence, naming that the code redeems only at or past the version that ships this. No fleet version floor is claimed, because a floor claimed before the feature ships is a floor about an unshipped thing. TWO OPENINGS ARE NOW POSSIBLE AND THE WINNER IS PINNED, NOT INCIDENTAL: a redeemer holding two of the minter's subnets opens two envelopes, and the winner selects the registry that resolves the short node key -- so the loop's exit condition is ROUTED, NOT OPENED (try every opening, prefer the first that resolves a route), with ties broken by SUBNET-NAME LEXICOGRAPHIC ORDER so the choice is a stated property rather than an artifact of store iteration. This cannot reach a wrong destination by construction: the short key is the MINTER's, so every opening names the same physical node, and preferring a routed one can only avoid a thin registry's NoRoute. Gate: doc -- the CONTEXT.md sealed-code entry gaining the multi-envelope mint UX and the count-disclosure qualifier; impl -- `seal_to_all` over N seeds sharing one secret, the length-derived envelope split, `open_all_among` returning EVERY opening with its label, the redeem route's prefer-routed selection with the lexicographic tiebreak, the mint's subnet-list choice replacing the single-choice refusal, and the N>1 mint print; unit -- a two-membership code opening under BOTH seeds and yielding the SAME secret and node (the property the one-draw rule exists for), the single-envelope form byte-unchanged and still exactly 36 base32 chars beside a multi-envelope sibling pinning the N>1 length as a LITERAL (71 for N=2, because the envelopes are base32-encoded as ONE blob rather than encoded separately and joined -- twice-36 is the wrong figure and a derived expectation gets it wrong, which is why the pin is written out), a non-member opening NOTHING from a multi-envelope code (the anti-cross-open pair kept as the negative control), prefer-routed selecting the subnet that RESOLVES when the lexicographically-first one does not, the lexicographic tiebreak deciding when BOTH route, and the previous-seed rotation grace still opening one envelope of a multi-envelope code.",
2026-08-28T09:54:47.2261072Z       "requiredStages": [
2026-08-28T09:54:47.2261343Z         "doc",
2026-08-28T09:54:47.2261616Z         "impl",
2026-08-28T09:54:47.2261881Z         "unit"
2026-08-28T09:54:47.2262142Z       ],
2026-08-28T09:54:47.2262413Z       "stages": {
2026-08-28T09:54:47.2262689Z         "doc": {
2026-08-28T09:54:47.2262971Z           "complete": true,
2026-08-28T09:54:47.2263258Z           "evidence": [
2026-08-28T09:54:47.2263520Z             {
2026-08-28T09:54:47.2263820Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2264098Z               "line": 900
2026-08-28T09:54:47.2264365Z             }
2026-08-28T09:54:47.2264629Z           ]
2026-08-28T09:54:47.2264886Z         },
2026-08-28T09:54:47.2265169Z         "impl": {
2026-08-28T09:54:47.2265455Z           "complete": true,
2026-08-28T09:54:47.2265750Z           "evidence": [
2026-08-28T09:54:47.2266009Z             {
2026-08-28T09:54:47.2266403Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2266686Z               "line": 215
2026-08-28T09:54:47.2266955Z             },
2026-08-28T09:54:47.2267225Z             {
2026-08-28T09:54:47.2267650Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2267941Z               "line": 242
2026-08-28T09:54:47.2268203Z             },
2026-08-28T09:54:47.2268469Z             {
2026-08-28T09:54:47.2268847Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2269224Z               "line": 336
2026-08-28T09:54:47.2269491Z             },
2026-08-28T09:54:47.2269755Z             {
2026-08-28T09:54:47.2270077Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2270359Z               "line": 16980
2026-08-28T09:54:47.2270692Z             },
2026-08-28T09:54:47.2270955Z             {
2026-08-28T09:54:47.2271284Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2271565Z               "line": 17021
2026-08-28T09:54:47.2271837Z             },
2026-08-28T09:54:47.2272096Z             {
2026-08-28T09:54:47.2272418Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2272697Z               "line": 18483
2026-08-28T09:54:47.2272959Z             },
2026-08-28T09:54:47.2273230Z             {
2026-08-28T09:54:47.2273569Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2273851Z               "line": 1514
2026-08-28T09:54:47.2274118Z             }
2026-08-28T09:54:47.2274380Z           ]
2026-08-28T09:54:47.2274648Z         },
2026-08-28T09:54:47.2274915Z         "int": {
2026-08-28T09:54:47.2275204Z           "complete": false,
2026-08-28T09:54:47.2275485Z           "evidence": []
2026-08-28T09:54:47.2275748Z         },
2026-08-28T09:54:47.2276015Z         "unit": {
2026-08-28T09:54:47.2276306Z           "complete": true,
2026-08-28T09:54:47.2276588Z           "evidence": [
2026-08-28T09:54:47.2276855Z             {
2026-08-28T09:54:47.2277236Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2277515Z               "line": 402
2026-08-28T09:54:47.2277780Z             },
2026-08-28T09:54:47.2278037Z             {
2026-08-28T09:54:47.2278419Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2278705Z               "line": 449
2026-08-28T09:54:47.2279126Z             },
2026-08-28T09:54:47.2279398Z             {
2026-08-28T09:54:47.2279770Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2280046Z               "line": 485
2026-08-28T09:54:47.2280310Z             },
2026-08-28T09:54:47.2280580Z             {
2026-08-28T09:54:47.2280947Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2281229Z               "line": 648
2026-08-28T09:54:47.2281491Z             },
2026-08-28T09:54:47.2281758Z             {
2026-08-28T09:54:47.2282082Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2282416Z               "line": 29170
2026-08-28T09:54:47.2282684Z             },
2026-08-28T09:54:47.2282945Z             {
2026-08-28T09:54:47.2283267Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2283543Z               "line": 29221
2026-08-28T09:54:47.2283814Z             },
2026-08-28T09:54:47.2284077Z             {
2026-08-28T09:54:47.2284420Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2284702Z               "line": 2965
2026-08-28T09:54:47.2284964Z             }
2026-08-28T09:54:47.2285227Z           ]
2026-08-28T09:54:47.2285490Z         }
2026-08-28T09:54:47.2285749Z       }
2026-08-28T09:54:47.2286007Z     },
2026-08-28T09:54:47.2286256Z     {
2026-08-28T09:54:47.2286565Z       "id": "REQ-KNOCK-CODE-ROUTE",
2026-08-28T09:54:47.2302160Z       "title": "THE REDEEMER RESOLVES THE MINTING NODE FROM THE CODE, NEVER FROM DISCOVERY. The sealed payload's 4 B short key is matched against the node-tier rows the redeemer's own subnet registry already replicates -- node-level labels and the authoring nodes of instance rows -- because a code exists precisely to reach an endpoint that discovery does NOT surface. Routing through endpoint DISCOVER would rebuild the hidden co-requisite the fork-surface rig finding already paid for (releases#76 grounds): any cross-node verb that resolves its target through registry replication inherits a DISCOVER dependency it never declared. THE RESOLUTION SET IS THE UNION of both node-tier carriers rather than the label map alone -- a member that never named itself holds no label row, and that member is exactly the undiscoverable minter this feature exists to reach, so a label-only lookup would fail for the case the feature was built for. AN AMBIGUOUS PREFIX REFUSES AND NEVER PICKS: 4 B is 32 bits, collision is negligible and not zero, and guessing dials a stranger with a live code -- the resolution policy's own refuse-and-qualify discipline, applied where the cost of a wrong guess is a capability handed to the wrong machine. Resolution runs INSIDE the one subnet whose key opened the envelope, so the ambiguity surface is that subnet's node set rather than every node known. Gate: doc -- the networking entry stating what the route resolves against and what it must not widen; impl -- the union lookup and the ambiguity refusal; unit -- a short key resolving to its full node key through each carrier INDEPENDENTLY (a label-only row and an instance-only row, so neither leg can be the only one working), two nodes sharing a prefix refusing rather than resolving to either, and an unresolvable short key reading as its own outcome rather than as a refusal by the far end.",
2026-08-28T09:54:47.2302668Z       "requiredStages": [
2026-08-28T09:54:47.2302941Z         "doc",
2026-08-28T09:54:47.2303208Z         "impl",
2026-08-28T09:54:47.2303471Z         "unit"
2026-08-28T09:54:47.2303733Z       ],
2026-08-28T09:54:47.2304012Z       "stages": {
2026-08-28T09:54:47.2304282Z         "doc": {
2026-08-28T09:54:47.2304577Z           "complete": true,
2026-08-28T09:54:47.2304897Z           "evidence": [
2026-08-28T09:54:47.2305151Z             {
2026-08-28T09:54:47.2305445Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2305718Z               "line": 905
2026-08-28T09:54:47.2305976Z             }
2026-08-28T09:54:47.2306232Z           ]
2026-08-28T09:54:47.2306499Z         },
2026-08-28T09:54:47.2306770Z         "impl": {
2026-08-28T09:54:47.2307142Z           "complete": true,
2026-08-28T09:54:47.2307428Z           "evidence": [
2026-08-28T09:54:47.2307686Z             {
2026-08-28T09:54:47.2308019Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2308306Z               "line": 18940
2026-08-28T09:54:47.2308569Z             },
2026-08-28T09:54:47.2308831Z             {
2026-08-28T09:54:47.2309257Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2309547Z               "line": 1381
2026-08-28T09:54:47.2309814Z             },
2026-08-28T09:54:47.2310080Z             {
2026-08-28T09:54:47.2310482Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2310773Z               "line": 1403
2026-08-28T09:54:47.2311044Z             },
2026-08-28T09:54:47.2311306Z             {
2026-08-28T09:54:47.2311649Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2311925Z               "line": 1551
2026-08-28T09:54:47.2312199Z             },
2026-08-28T09:54:47.2312462Z             {
2026-08-28T09:54:47.2312805Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2313077Z               "line": 1632
2026-08-28T09:54:47.2313349Z             }
2026-08-28T09:54:47.2313615Z           ]
2026-08-28T09:54:47.2313877Z         },
2026-08-28T09:54:47.2314149Z         "int": {
2026-08-28T09:54:47.2314435Z           "complete": false,
2026-08-28T09:54:47.2314757Z           "evidence": []
2026-08-28T09:54:47.2315014Z         },
2026-08-28T09:54:47.2315277Z         "unit": {
2026-08-28T09:54:47.2315563Z           "complete": true,
2026-08-28T09:54:47.2315848Z           "evidence": [
2026-08-28T09:54:47.2316110Z             {
2026-08-28T09:54:47.2316444Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2316730Z               "line": 2900
2026-08-28T09:54:47.2316992Z             },
2026-08-28T09:54:47.2317256Z             {
2026-08-28T09:54:47.2317584Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2317932Z               "line": 2939
2026-08-28T09:54:47.2318198Z             }
2026-08-28T09:54:47.2318476Z           ]
2026-08-28T09:54:47.2318742Z         }
2026-08-28T09:54:47.2319091Z       }
2026-08-28T09:54:47.2319361Z     },
2026-08-28T09:54:47.2319623Z     {
2026-08-28T09:54:47.2319949Z       "id": "REQ-KNOCK-CODE-SEALED",
2026-08-28T09:54:47.2339233Z       "title": "A KNOCK CODE CARRIES ITS OWN ROUTE, SEALED TO THE MINTING NODE'S SUBNET (ADR-0054, ratified 2026-08-01). The string is `sptkc_` + unpadded lowercase base32 of one envelope; the prefix is the FORMAT VERSION MARKER (a future format mints a new prefix, never a flag day) and the standing agent-recognition hook. Payload = the minting node's SHORT key (4 B) + the code secret (10 B): 80 bits is ample under the receiver-enforced redemption rate limit and the 24 h TTL, and the length is bought with payload economy because NO INVERTIBLE TRANSFORM EMITS FEWER BITS THAN IT CARRIES -- 'shrink by adding an encryption layer' is refused on the record so it cannot resurface looking clever. SEAL, as ruled: keys HKDF-SHA256 from the subnet seed under DISTINCT domain-separated labels for encryption and authentication (a tag key and a cipher key must never be the same key); the tag is truncate-8 of HMAC-SHA256 over the PLAINTEXT and that tag IS the SIV nonce, padded to the cipher's nonce width, so the envelope is tag||ciphertext at 22 B and ~36 base32 chars -- SHORTER than the shipped 32-hex form. Determinism is safe ONLY because the 10 B secret is fresh per code; a reused secret would repeat an envelope, and that is the property this construction rests on. Verification is CONSTANT-TIME. THE REDEEMER TRY-DECRYPTS with every subnet key it holds, CURRENT AND PREVIOUS SEED, so a code inherits the subnet's own one-deep rotation grace (Mesh-D7) rather than a private key schedule -- and EVERY failure is INDISTINGUISHABLE from every other: a wrong subnet, a tampered byte, a bad length and an unknown code all return the same nothing, because a decode that reported WHY would be the oracle the redeem refusals already refuse to be. A pasted code reveals nothing to a non-member -- not the node, not the subnet, not which subnet -- and the decode-set is exactly the population that could dial the minter anyway, so no capability is lost. LEGACY BARE-HEX CODES STAY LOCAL-REDEEMABLE, untouched. Gate: doc -- the CONTEXT.md sealed-code entry naming the format, the payload economy and the rotation grace; impl -- the codec, its two derived keys and the try-decrypt; unit -- a round trip through a real seed, a code sealed to one subnet refusing under another, the previous seed still opening a code the current one minted before rotation, a single flipped byte anywhere in the envelope refusing, every refusal shape returning the identical nothing, and a legacy bare-hex code still reading as itself.",
2026-08-28T09:54:47.2339790Z       "requiredStages": [
2026-08-28T09:54:47.2340058Z         "doc",
2026-08-28T09:54:47.2340324Z         "impl",
2026-08-28T09:54:47.2340579Z         "unit"
2026-08-28T09:54:47.2340848Z       ],
2026-08-28T09:54:47.2341116Z       "stages": {
2026-08-28T09:54:47.2341379Z         "doc": {
2026-08-28T09:54:47.2341737Z           "complete": true,
2026-08-28T09:54:47.2342023Z           "evidence": [
2026-08-28T09:54:47.2342281Z             {
2026-08-28T09:54:47.2342586Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2342863Z               "line": 899
2026-08-28T09:54:47.2343140Z             }
2026-08-28T09:54:47.2343402Z           ]
2026-08-28T09:54:47.2343667Z         },
2026-08-28T09:54:47.2343941Z         "impl": {
2026-08-28T09:54:47.2344232Z           "complete": true,
2026-08-28T09:54:47.2344523Z           "evidence": [
2026-08-28T09:54:47.2344786Z             {
2026-08-28T09:54:47.2345167Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2345448Z               "line": 48
2026-08-28T09:54:47.2345716Z             },
2026-08-28T09:54:47.2345979Z             {
2026-08-28T09:54:47.2346423Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2346705Z               "line": 78
2026-08-28T09:54:47.2346981Z             },
2026-08-28T09:54:47.2347248Z             {
2026-08-28T09:54:47.2347629Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2347916Z               "line": 190
2026-08-28T09:54:47.2348178Z             },
2026-08-28T09:54:47.2348444Z             {
2026-08-28T09:54:47.2348817Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2349197Z               "line": 270
2026-08-28T09:54:47.2349526Z             },
2026-08-28T09:54:47.2349803Z             {
2026-08-28T09:54:47.2350198Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2350475Z               "line": 335
2026-08-28T09:54:47.2350747Z             },
2026-08-28T09:54:47.2351013Z             {
2026-08-28T09:54:47.2351403Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2351686Z               "line": 359
2026-08-28T09:54:47.2351963Z             },
2026-08-28T09:54:47.2352235Z             {
2026-08-28T09:54:47.2352597Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2352884Z               "line": 384
2026-08-28T09:54:47.2353151Z             },
2026-08-28T09:54:47.2353423Z             {
2026-08-28T09:54:47.2353757Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2354025Z               "line": 398
2026-08-28T09:54:47.2354294Z             },
2026-08-28T09:54:47.2354544Z             {
2026-08-28T09:54:47.2354907Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2355188Z               "line": 450
2026-08-28T09:54:47.2355440Z             },
2026-08-28T09:54:47.2355703Z             {
2026-08-28T09:54:47.2356056Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2356332Z               "line": 531
2026-08-28T09:54:47.2356596Z             },
2026-08-28T09:54:47.2356856Z             {
2026-08-28T09:54:47.2357217Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2357565Z               "line": 542
2026-08-28T09:54:47.2357823Z             },
2026-08-28T09:54:47.2358089Z             {
2026-08-28T09:54:47.2358418Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2358699Z               "line": 16921
2026-08-28T09:54:47.2359043Z             },
2026-08-28T09:54:47.2359305Z             {
2026-08-28T09:54:47.2359628Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2359914Z               "line": 16936
2026-08-28T09:54:47.2360182Z             },
2026-08-28T09:54:47.2360444Z             {
2026-08-28T09:54:47.2360825Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2361107Z               "line": 16979
2026-08-28T09:54:47.2361374Z             },
2026-08-28T09:54:47.2361636Z             {
2026-08-28T09:54:47.2361954Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2362233Z               "line": 18584
2026-08-28T09:54:47.2362490Z             },
2026-08-28T09:54:47.2362767Z             {
2026-08-28T09:54:47.2363096Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2363382Z               "line": 18674
2026-08-28T09:54:47.2363640Z             }
2026-08-28T09:54:47.2363907Z           ]
2026-08-28T09:54:47.2364169Z         },
2026-08-28T09:54:47.2364445Z         "int": {
2026-08-28T09:54:47.2364735Z           "complete": false,
2026-08-28T09:54:47.2365023Z           "evidence": []
2026-08-28T09:54:47.2365292Z         },
2026-08-28T09:54:47.2365554Z         "unit": {
2026-08-28T09:54:47.2365845Z           "complete": true,
2026-08-28T09:54:47.2366121Z           "evidence": [
2026-08-28T09:54:47.2366397Z             {
2026-08-28T09:54:47.2366789Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2367080Z               "line": 375
2026-08-28T09:54:47.2367344Z             },
2026-08-28T09:54:47.2367605Z             {
2026-08-28T09:54:47.2367986Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2368324Z               "line": 506
2026-08-28T09:54:47.2368601Z             },
2026-08-28T09:54:47.2368864Z             {
2026-08-28T09:54:47.2369327Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2369603Z               "line": 517
2026-08-28T09:54:47.2369875Z             },
2026-08-28T09:54:47.2370141Z             {
2026-08-28T09:54:47.2370512Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2370793Z               "line": 543
2026-08-28T09:54:47.2371056Z             },
2026-08-28T09:54:47.2371385Z             {
2026-08-28T09:54:47.2371762Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2372057Z               "line": 567
2026-08-28T09:54:47.2372324Z             },
2026-08-28T09:54:47.2372590Z             {
2026-08-28T09:54:47.2372966Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2373252Z               "line": 601
2026-08-28T09:54:47.2373523Z             },
2026-08-28T09:54:47.2373785Z             {
2026-08-28T09:54:47.2374162Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2374439Z               "line": 616
2026-08-28T09:54:47.2374710Z             },
2026-08-28T09:54:47.2374973Z             {
2026-08-28T09:54:47.2375352Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2375641Z               "line": 624
2026-08-28T09:54:47.2375899Z             },
2026-08-28T09:54:47.2376166Z             {
2026-08-28T09:54:47.2376538Z               "path": "crates/spt-net/src/net/codeseal.rs",
2026-08-28T09:54:47.2376823Z               "line": 680
2026-08-28T09:54:47.2377092Z             },
2026-08-28T09:54:47.2377359Z             {
2026-08-28T09:54:47.2377716Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2378005Z               "line": 1903
2026-08-28T09:54:47.2378289Z             },
2026-08-28T09:54:47.2378551Z             {
2026-08-28T09:54:47.2378914Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2379352Z               "line": 1931
2026-08-28T09:54:47.2379630Z             },
2026-08-28T09:54:47.2379897Z             {
2026-08-28T09:54:47.2380260Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2380541Z               "line": 1969
2026-08-28T09:54:47.2380805Z             },
2026-08-28T09:54:47.2381072Z             {
2026-08-28T09:54:47.2381387Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2381673Z               "line": 29308
2026-08-28T09:54:47.2381936Z             },
2026-08-28T09:54:47.2386888Z             {
2026-08-28T09:54:47.2387256Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2387670Z               "line": 30278
2026-08-28T09:54:47.2387928Z             }
2026-08-28T09:54:47.2388196Z           ]
2026-08-28T09:54:47.2388465Z         }
2026-08-28T09:54:47.2388734Z       }
2026-08-28T09:54:47.2389092Z     },
2026-08-28T09:54:47.2389350Z     {
2026-08-28T09:54:47.2389721Z       "id": "REQ-KNOCK-COUNTER-KNOCK-TRAVELS",
2026-08-28T09:54:47.2410022Z       "title": "RETIRED 2026-08-04 (ADR-0055, releases#144 bag grill) — ITS SUBJECT NO LONGER EXISTS. `knock approve --mutual` and the reciprocal knock it minted are REMOVED, not renamed: an approval carries no directionality, and a receiver who wants reverse reach knocks back through the knock verb itself. The routing bug this requirement fixed was real and its fix was correct for the shape that then existed; the shape is gone, so its impl, unit and int evidence deleted with the code. Retained in the registry rather than deleted so the reversal reads back. The superseded text follows verbatim. THE RECIPROCAL KNOCK AN APPROVAL MINTS RIDES THE SAME WIRE LEG A FIRST-ORDER KNOCK RIDES. `knock approve --mutual` mints a counter-knock addressed to the original knocker and, as shipped, upserts it into the APPROVER'S OWN local store -- so when the knocker is remote the approver's node holds a knock addressed to an endpoint that queries a different node and will never see it. It is not a delivery that failed; it is a delivery that was never attempted, silently, while the approver's stdout reads as though reciprocity was offered. The first-order path already calls `wansend::knock_send_remote` for exactly this reason and the counter-knock path does not; the paired notify is `NotifScope::Node` and by its own comment never enters a replication feed, so it carries nothing across either and STAYS as the design says for the remote case. THE ROUTE IS CHOSEN BY WHERE THE ORIGINAL KNOCKER LIVES, not by a flag: a local knocker keeps the local upsert (the shipped behaviour, which is correct for it), a remote knocker gets the send. AND THE APPROVAL ITSELF IS NEVER HELD HOSTAGE TO THE RECIPROCAL: the approval has already been decided and written when the counter-knock is minted, so a counter-knock that cannot be delivered reports its own failure and does not unwind or downgrade the approval it rode in on. Gate: impl -- the route split on the original knocker's node and the wansend leg for the remote arm; unit -- a REMOTE knocker's counter-knock leaves the approver's local store untouched and reaches the send leg, a LOCAL knocker's counter-knock still lands in the local store and does NOT reach the send leg (the pair asserted together, since either alone passes an implementation that routes everything one way), and a send-leg failure on the remote arm leaves the ALREADY-WRITTEN approval intact and still reported as approved.",
2026-08-28T09:54:47.2410604Z       "requiredStages": [],
2026-08-28T09:54:47.2410880Z       "stages": {
2026-08-28T09:54:47.2411152Z         "doc": {
2026-08-28T09:54:47.2411448Z           "complete": false,
2026-08-28T09:54:47.2411738Z           "evidence": []
2026-08-28T09:54:47.2411996Z         },
2026-08-28T09:54:47.2412283Z         "impl": {
2026-08-28T09:54:47.2412567Z           "complete": false,
2026-08-28T09:54:47.2412849Z           "evidence": []
2026-08-28T09:54:47.2413110Z         },
2026-08-28T09:54:47.2413373Z         "int": {
2026-08-28T09:54:47.2413674Z           "complete": true,
2026-08-28T09:54:47.2414016Z           "evidence": [
2026-08-28T09:54:47.2414283Z             {
2026-08-28T09:54:47.2414755Z               "path": "crates/spt/tests/knock_approve_not_hostage_e2e.rs",
2026-08-28T09:54:47.2415038Z               "line": 216
2026-08-28T09:54:47.2415310Z             }
2026-08-28T09:54:47.2415573Z           ]
2026-08-28T09:54:47.2415849Z         },
2026-08-28T09:54:47.2416112Z         "unit": {
2026-08-28T09:54:47.2416413Z           "complete": false,
2026-08-28T09:54:47.2416689Z           "evidence": []
2026-08-28T09:54:47.2416960Z         }
2026-08-28T09:54:47.2417217Z       }
2026-08-28T09:54:47.2417536Z     },
2026-08-28T09:54:47.2417801Z     {
2026-08-28T09:54:47.2418163Z       "id": "REQ-KNOCK-DEFAULT-SURFACE-MSG",
2026-08-28T09:54:47.2430431Z       "title": "A knock sent with no --surfaces requests MSG AND NOTHING ELSE, because the commonest knock is 'let me talk to you' and a default that requests every surface asks an operator to approve a machine-wide grant they never intended. The narrowing lives ENTIRELY IN THE CLI, which materializes an EXPLICIT [MSG] list at compose time: the store's wire encoding is UNCHANGED and empty still means every surface, so `--surfaces ALL` keeps mapping to the empty vec through the same field and an N-1 record with an empty list still reads as all. DISCOVER is deliberately OUT of the default (ruled): reachability and enumerability are different asks. SCOPE IS send AND THE BARE FORM ONLY — `approve` and `new-code` keep their current defaults, so any helper shared with them must not be changed underneath them; a narrowing applied at the shared helper would silently re-scope two other verbs. The help sentence states the affordance positively ('only use --surfaces if you need more than MSG') rather than describing the encoding. Gate: doc — the CONTEXT.md knock-initiation entry stating the send-side default; impl — the CLI-side materialization at the send/bare compose site only; unit — a bare send composes exactly [MSG], ALL composes the empty vec and still reads as every-surface, approve and new-code defaults are unchanged by the same call, and a store fixture carrying an empty list still evaluates as every surface.",
2026-08-28T09:54:47.2430844Z       "requiredStages": [
2026-08-28T09:54:47.2431181Z         "doc",
2026-08-28T09:54:47.2431538Z         "impl",
2026-08-28T09:54:47.2431805Z         "unit"
2026-08-28T09:54:47.2432063Z       ],
2026-08-28T09:54:47.2432339Z       "stages": {
2026-08-28T09:54:47.2432606Z         "doc": {
2026-08-28T09:54:47.2432897Z           "complete": true,
2026-08-28T09:54:47.2433255Z           "evidence": [
2026-08-28T09:54:47.2433539Z             {
2026-08-28T09:54:47.2433840Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2434136Z               "line": 920
2026-08-28T09:54:47.2434408Z             },
2026-08-28T09:54:47.2434675Z             {
2026-08-28T09:54:47.2435084Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2435371Z               "line": 18
2026-08-28T09:54:47.2435638Z             }
2026-08-28T09:54:47.2435904Z           ]
2026-08-28T09:54:47.2436163Z         },
2026-08-28T09:54:47.2436425Z         "impl": {
2026-08-28T09:54:47.2436712Z           "complete": true,
2026-08-28T09:54:47.2436989Z           "evidence": [
2026-08-28T09:54:47.2437246Z             {
2026-08-28T09:54:47.2437571Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2437848Z               "line": 17096
2026-08-28T09:54:47.2438115Z             },
2026-08-28T09:54:47.2438371Z             {
2026-08-28T09:54:47.2438704Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2439074Z               "line": 17353
2026-08-28T09:54:47.2439345Z             }
2026-08-28T09:54:47.2439612Z           ]
2026-08-28T09:54:47.2439876Z         },
2026-08-28T09:54:47.2440147Z         "int": {
2026-08-28T09:54:47.2440438Z           "complete": false,
2026-08-28T09:54:47.2440724Z           "evidence": []
2026-08-28T09:54:47.2440982Z         },
2026-08-28T09:54:47.2441261Z         "unit": {
2026-08-28T09:54:47.2441621Z           "complete": true,
2026-08-28T09:54:47.2441984Z           "evidence": [
2026-08-28T09:54:47.2442250Z             {
2026-08-28T09:54:47.2442575Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2442856Z               "line": 37008
2026-08-28T09:54:47.2443118Z             },
2026-08-28T09:54:47.2443380Z             {
2026-08-28T09:54:47.2443704Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2443986Z               "line": 37400
2026-08-28T09:54:47.2444253Z             }
2026-08-28T09:54:47.2444514Z           ]
2026-08-28T09:54:47.2444839Z         }
2026-08-28T09:54:47.2445100Z       }
2026-08-28T09:54:47.2445372Z     },
2026-08-28T09:54:47.2445630Z     {
2026-08-28T09:54:47.2446002Z       "id": "REQ-KNOCK-DIRECTIONALITY-EXPLICIT",
2026-08-28T09:54:47.2474746Z       "title": "RETIRED 2026-08-04 (ADR-0055, releases#144 bag grill) — SUPERSEDED BY REQ-KNOCK-DIRECTIONALITY-SENDER, which owns the surviving fact at its new seats. The forced explicit choice was RIGHT and is kept; the SEAT was wrong. Directionality is sender-declared, so the mutex moved to `spt knock` / `knock send` / `knock redeem` and left `approve` and `new-code` declaring nothing, and the mint-side pre-authorization this requirement specified is removed with the flag that armed it. Retained in the registry rather than deleted so the reversal reads back. The superseded text follows verbatim. Answering a knock and minting a code both FORCE AN EXPLICIT DIRECTIONALITY CHOICE: `knock approve` and `knock new-code` require exactly one of --mutual or --one-way, and a bare invocation REFUSES LOUDLY naming both options rather than proceeding on a silent default. A mandatory choice is not auto-mutual — nobody's rules are written without their own act — it removes the default whose consequence an operator most often failed to notice. --one-way is the explicit decline and is RECORDED (on the answer for approve, on the code record at mint for new-code) so the declining act is legible afterward, not merely an absence. `new-code --mutual` is a MINTER-LOCAL persisted pre-authorization of the REVERSE grant, armed at mint and keyed to the CODE ID, consumed EXACTLY ONCE at receipt of the node-proven REDEEMED outcome, at which point the minter's own node writes its whitelist entry naming the redeemer. There is no counter-knock at mint — at mint there is no knocker yet, which is precisely why arming defers to redemption — and this is approve --mutual's consent shape transposed from knock correlation to code id, SYMMETRIC with redeem --mutual: each side arms only its OWN side, neither ever writes on the other's node, and full mutuality requires both. The pre-authorization record is the EXISTING one, extended with an EXPLICIT TWO-VALUED KEY KIND (knock | code) rather than overloading its knock-id field with a code id: consumption is a string match, so an overloaded field makes a code pre-authorization consumable by a knock answer that merely carries the same id string, and a discriminant makes that unrepresentable instead of merely improbable. The discriminant is additive with a serde default of knock — the only kind shipped records can be — so N-1 records decode unchanged, and the code record's directionality field is additive by the same discipline so a code minted before the field existed still reads. Gate: doc — the CONTEXT.md mutual-whitelisting entry, amended so the forced choice replaces the one-directional default while the auto-mutual ban survives intact; impl — the mandatory-one-of arg shape on both verbs, the --one-way record, and the code-id-keyed pre-authorization with its once-only consumption at node-proven redemption; unit — a bare approve and a bare new-code each refuse naming both options, a mint with --mutual plus a node-proven redemption writes the minter-side entry exactly once, a SECOND redemption notice finds the pre-authorization already consumed, --one-way writes nothing on redemption, a forged or unproven redemption notice consumes nothing, A CODE PRE-AUTHORIZATION IS NOT CONSUMABLE BY A KNOCK ANSWER CARRYING THE SAME ID STRING (the row that fails under an overloaded key), and an N-1 record with neither the key kind nor the directionality field still decodes.",
2026-08-28T09:54:47.2475433Z       "requiredStages": [],
2026-08-28T09:54:47.2475700Z       "stages": {
2026-08-28T09:54:47.2475971Z         "doc": {
2026-08-28T09:54:47.2476268Z           "complete": false,
2026-08-28T09:54:47.2476553Z           "evidence": []
2026-08-28T09:54:47.2476820Z         },
2026-08-28T09:54:47.2477096Z         "impl": {
2026-08-28T09:54:47.2477396Z           "complete": false,
2026-08-28T09:54:47.2477750Z           "evidence": []
2026-08-28T09:54:47.2478016Z         },
2026-08-28T09:54:47.2478276Z         "int": {
2026-08-28T09:54:47.2478577Z           "complete": false,
2026-08-28T09:54:47.2478853Z           "evidence": []
2026-08-28T09:54:47.2479205Z         },
2026-08-28T09:54:47.2479478Z         "unit": {
2026-08-28T09:54:47.2479769Z           "complete": false,
2026-08-28T09:54:47.2480050Z           "evidence": []
2026-08-28T09:54:47.2480326Z         }
2026-08-28T09:54:47.2480588Z       }
2026-08-28T09:54:47.2480850Z     },
2026-08-28T09:54:47.2481120Z     {
2026-08-28T09:54:47.2481481Z       "id": "REQ-KNOCK-DIRECTIONALITY-SENDER",
2026-08-28T09:54:47.2506594Z       "title": "DIRECTIONALITY IS SENDER-DECLARED, AND ONLY SENDER-DECLARED (ratified 2026-08-04 bag grill, releases#144 / ADR-0055). The reach-REQUESTING surfaces — `spt knock <target>`, `spt knock send` and `spt knock redeem` — take a MANDATORY, MUTUALLY EXCLUSIVE pair, --send-only | --send-receive, with NO default: a bare invocation refuses loudly naming both, and naming both together refuses as opposite answers to one question. The declaration names what the DECLARER'S OWN SIDE does — --send-receive arms the declarer's own inbound to the counterparty, at answer-receipt for a knock and at redemption for a code, and nothing more. The RECEIVER verbs `knock approve` and `knock new-code` carry NO directionality flag at all: accepting IS the receiver's own-side act, so there is nothing further for them to declare, and the `approve --mutual` COUNTER-KNOCK IS REMOVED RATHER THAN RENAMED — a receiver who wants reverse reach knocks back, because the counter-ask is the knock verb's own job and a rider on approval duplicated it with a second grammar. VOCABULARY: send-only and send-receive are canonical; mutual and one-way are RETIRED from every user-visible surface — help text, refusals, stdout claims and the published guide alike — because 'mutual' misdescribes an act that only ever opens the declarer's side. MIGRATION IS A CLEAN BREAK WITH A SPEAKING REFUSAL: --mutual and --one-way are parse errors that NAME the flag which replaced them and the seat they were typed at, never clap's bare unexpected-argument, and there are no deprecation aliases (an alias keeps the retired mental model alive in scripts and agent habits). THE RENAME IS THE USER-VISIBLE SURFACE ONLY: store and wire field names are untouched, and PRE-AUTHORIZATIONS ARMED UNDER THE OLD FLAGS STAY HONORED — a record armed before this change still consumes through the answer-receipt path and still opens the reverse it was armed for. Gate: doc — the CONTEXT.md knock/knock-code directionality sentence and the mutual-whitelisting entry corrected by replacement so no entry states the retired seats, plus the published knocking guide; impl — the mandatory mutex at the bare form, `send` and `redeem`, the absence of any directionality argument at `approve` and `new-code`, the removal of the counter-knock path, and the retired-flag refusals; unit — a bare requesting invocation refuses naming both new flags, each flag ALONE is accepted, both together refuse, `approve` and `new-code` refuse the directionality flags outright, a retired flag's refusal NAMES its replacement at every seat that carried it, no user-visible string on the knock family carries the retired vocabulary, and — the load-bearing row — A PRE-AUTHORIZATION RECORD ARMED UNDER THE OLD FLAGS, DECODED FROM ITS SHIPPED BYTES RATHER THAN BUILT BY THE NEW CLI, STILL CONSUMES THROUGH THE RECEIPT PATH AND STILL OPENS ITS REVERSE, with the store and wire field names it names unchanged.",
2026-08-28T09:54:47.2507243Z       "requiredStages": [
2026-08-28T09:54:47.2507512Z         "doc",
2026-08-28T09:54:47.2507785Z         "impl",
2026-08-28T09:54:47.2508047Z         "unit"
2026-08-28T09:54:47.2508315Z       ],
2026-08-28T09:54:47.2508591Z       "stages": {
2026-08-28T09:54:47.2508864Z         "doc": {
2026-08-28T09:54:47.2509240Z           "complete": true,
2026-08-28T09:54:47.2509526Z           "evidence": [
2026-08-28T09:54:47.2509801Z             {
2026-08-28T09:54:47.2510161Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2510447Z               "line": 893
2026-08-28T09:54:47.2510713Z             },
2026-08-28T09:54:47.2510981Z             {
2026-08-28T09:54:47.2511286Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2511573Z               "line": 926
2026-08-28T09:54:47.2511849Z             },
2026-08-28T09:54:47.2512107Z             {
2026-08-28T09:54:47.2512507Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2512763Z               "line": 96
2026-08-28T09:54:47.2513028Z             }
2026-08-28T09:54:47.2513285Z           ]
2026-08-28T09:54:47.2513557Z         },
2026-08-28T09:54:47.2513825Z         "impl": {
2026-08-28T09:54:47.2514115Z           "complete": true,
2026-08-28T09:54:47.2514406Z           "evidence": [
2026-08-28T09:54:47.2514669Z             {
2026-08-28T09:54:47.2515054Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2515330Z               "line": 200
2026-08-28T09:54:47.2515775Z             },
2026-08-28T09:54:47.2516048Z             {
2026-08-28T09:54:47.2516429Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2516701Z               "line": 201
2026-08-28T09:54:47.2516963Z             },
2026-08-28T09:54:47.2517227Z             {
2026-08-28T09:54:47.2517579Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.2517940Z               "line": 469
2026-08-28T09:54:47.2518207Z             },
2026-08-28T09:54:47.2518484Z             {
2026-08-28T09:54:47.2518870Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.2519246Z               "line": 202
2026-08-28T09:54:47.2519518Z             },
2026-08-28T09:54:47.2519781Z             {
2026-08-28T09:54:47.2520171Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.2520446Z               "line": 218
2026-08-28T09:54:47.2520779Z             },
2026-08-28T09:54:47.2521041Z             {
2026-08-28T09:54:47.2521404Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2521676Z               "line": 120
2026-08-28T09:54:47.2521951Z             },
2026-08-28T09:54:47.2522218Z             {
2026-08-28T09:54:47.2522567Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2522857Z               "line": 220
2026-08-28T09:54:47.2523123Z             },
2026-08-28T09:54:47.2523388Z             {
2026-08-28T09:54:47.2523741Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2524018Z               "line": 225
2026-08-28T09:54:47.2524285Z             },
2026-08-28T09:54:47.2524557Z             {
2026-08-28T09:54:47.2524910Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2525191Z               "line": 288
2026-08-28T09:54:47.2525568Z             },
2026-08-28T09:54:47.2525828Z             {
2026-08-28T09:54:47.2526184Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2526470Z               "line": 445
2026-08-28T09:54:47.2526736Z             },
2026-08-28T09:54:47.2526998Z             {
2026-08-28T09:54:47.2527356Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2527642Z               "line": 843
2026-08-28T09:54:47.2527915Z             },
2026-08-28T09:54:47.2528181Z             {
2026-08-28T09:54:47.2528528Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2528895Z               "line": 864
2026-08-28T09:54:47.2529248Z             },
2026-08-28T09:54:47.2529515Z             {
2026-08-28T09:54:47.2529873Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2530154Z               "line": 890
2026-08-28T09:54:47.2530430Z             },
2026-08-28T09:54:47.2530694Z             {
2026-08-28T09:54:47.2531048Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2531334Z               "line": 911
2026-08-28T09:54:47.2531601Z             },
2026-08-28T09:54:47.2531868Z             {
2026-08-28T09:54:47.2532226Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2532570Z               "line": 929
2026-08-28T09:54:47.2532836Z             },
2026-08-28T09:54:47.2533107Z             {
2026-08-28T09:54:47.2533457Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2533735Z               "line": 970
2026-08-28T09:54:47.2534005Z             },
2026-08-28T09:54:47.2534277Z             {
2026-08-28T09:54:47.2534630Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2534912Z               "line": 985
2026-08-28T09:54:47.2535183Z             },
2026-08-28T09:54:47.2535446Z             {
2026-08-28T09:54:47.2535804Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2536085Z               "line": 1030
2026-08-28T09:54:47.2536355Z             },
2026-08-28T09:54:47.2536614Z             {
2026-08-28T09:54:47.2536958Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2537244Z               "line": 1399
2026-08-28T09:54:47.2537516Z             },
2026-08-28T09:54:47.2537783Z             {
2026-08-28T09:54:47.2538132Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2538413Z               "line": 1412
2026-08-28T09:54:47.2538685Z             },
2026-08-28T09:54:47.2539033Z             {
2026-08-28T09:54:47.2539395Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2539737Z               "line": 1480
2026-08-28T09:54:47.2540009Z             },
2026-08-28T09:54:47.2540272Z             {
2026-08-28T09:54:47.2540634Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2540916Z               "line": 1482
2026-08-28T09:54:47.2541183Z             },
2026-08-28T09:54:47.2541442Z             {
2026-08-28T09:54:47.2541812Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2542099Z               "line": 16674
2026-08-28T09:54:47.2542361Z             },
2026-08-28T09:54:47.2542685Z             {
2026-08-28T09:54:47.2543004Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2543291Z               "line": 16704
2026-08-28T09:54:47.2543553Z             },
2026-08-28T09:54:47.2543820Z             {
2026-08-28T09:54:47.2544135Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2544415Z               "line": 16739
2026-08-28T09:54:47.2544680Z             },
2026-08-28T09:54:47.2544956Z             {
2026-08-28T09:54:47.2545410Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2545691Z               "line": 17444
2026-08-28T09:54:47.2545953Z             },
2026-08-28T09:54:47.2546210Z             {
2026-08-28T09:54:47.2546534Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2546815Z               "line": 17506
2026-08-28T09:54:47.2547085Z             },
2026-08-28T09:54:47.2547352Z             {
2026-08-28T09:54:47.2547676Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2547962Z               "line": 17590
2026-08-28T09:54:47.2548230Z             },
2026-08-28T09:54:47.2548496Z             {
2026-08-28T09:54:47.2548816Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2549184Z               "line": 18190
2026-08-28T09:54:47.2549450Z             },
2026-08-28T09:54:47.2549715Z             {
2026-08-28T09:54:47.2550034Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2550321Z               "line": 18431
2026-08-28T09:54:47.2550599Z             },
2026-08-28T09:54:47.2550946Z             {
2026-08-28T09:54:47.2551270Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2551551Z               "line": 18669
2026-08-28T09:54:47.2551824Z             },
2026-08-28T09:54:47.2552089Z             {
2026-08-28T09:54:47.2552416Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2552697Z               "line": 18687
2026-08-28T09:54:47.2552963Z             },
2026-08-28T09:54:47.2553231Z             {
2026-08-28T09:54:47.2553545Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2553832Z               "line": 18714
2026-08-28T09:54:47.2554151Z             },
2026-08-28T09:54:47.2554422Z             {
2026-08-28T09:54:47.2554747Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2555036Z               "line": 18770
2026-08-28T09:54:47.2555307Z             },
2026-08-28T09:54:47.2555631Z             {
2026-08-28T09:54:47.2556041Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2556322Z               "line": 18810
2026-08-28T09:54:47.2556576Z             },
2026-08-28T09:54:47.2556833Z             {
2026-08-28T09:54:47.2557144Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2557422Z               "line": 19016
2026-08-28T09:54:47.2557702Z             },
2026-08-28T09:54:47.2557960Z             {
2026-08-28T09:54:47.2558298Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2558575Z               "line": 19054
2026-08-28T09:54:47.2558837Z             },
2026-08-28T09:54:47.2559195Z             {
2026-08-28T09:54:47.2559523Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2559810Z               "line": 19163
2026-08-28T09:54:47.2560073Z             },
2026-08-28T09:54:47.2560347Z             {
2026-08-28T09:54:47.2560666Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2560943Z               "line": 19338
2026-08-28T09:54:47.2561220Z             },
2026-08-28T09:54:47.2561558Z             {
2026-08-28T09:54:47.2561877Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2562154Z               "line": 19344
2026-08-28T09:54:47.2562421Z             },
2026-08-28T09:54:47.2562687Z             {
2026-08-28T09:54:47.2563010Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2563291Z               "line": 19359
2026-08-28T09:54:47.2563558Z             },
2026-08-28T09:54:47.2563824Z             {
2026-08-28T09:54:47.2564124Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2564468Z               "line": 19367
2026-08-28T09:54:47.2564730Z             },
2026-08-28T09:54:47.2565002Z             {
2026-08-28T09:54:47.2565340Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2565620Z               "line": 19413
2026-08-28T09:54:47.2565882Z             },
2026-08-28T09:54:47.2566139Z             {
2026-08-28T09:54:47.2566459Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2566740Z               "line": 19428
2026-08-28T09:54:47.2567011Z             },
2026-08-28T09:54:47.2567278Z             {
2026-08-28T09:54:47.2567617Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2567902Z               "line": 1451
2026-08-28T09:54:47.2568167Z             }
2026-08-28T09:54:47.2568434Z           ]
2026-08-28T09:54:47.2568696Z         },
2026-08-28T09:54:47.2569045Z         "int": {
2026-08-28T09:54:47.2569331Z           "complete": false,
2026-08-28T09:54:47.2569621Z           "evidence": []
2026-08-28T09:54:47.2569888Z         },
2026-08-28T09:54:47.2570160Z         "unit": {
2026-08-28T09:54:47.2570450Z           "complete": true,
2026-08-28T09:54:47.2570727Z           "evidence": [
2026-08-28T09:54:47.2570994Z             {
2026-08-28T09:54:47.2571375Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2571661Z               "line": 914
2026-08-28T09:54:47.2571924Z             },
2026-08-28T09:54:47.2572176Z             {
2026-08-28T09:54:47.2572563Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2572916Z               "line": 915
2026-08-28T09:54:47.2573186Z             },
2026-08-28T09:54:47.2573450Z             {
2026-08-28T09:54:47.2573827Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2574118Z               "line": 1032
2026-08-28T09:54:47.2574389Z             },
2026-08-28T09:54:47.2574661Z             {
2026-08-28T09:54:47.2575004Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.2575291Z               "line": 2002
2026-08-28T09:54:47.2575553Z             },
2026-08-28T09:54:47.2575821Z             {
2026-08-28T09:54:47.2576260Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.2576551Z               "line": 379
2026-08-28T09:54:47.2576824Z             },
2026-08-28T09:54:47.2577095Z             {
2026-08-28T09:54:47.2577457Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2577739Z               "line": 2860
2026-08-28T09:54:47.2578016Z             },
2026-08-28T09:54:47.2578283Z             {
2026-08-28T09:54:47.2578648Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2578927Z               "line": 2899
2026-08-28T09:54:47.2579291Z             },
2026-08-28T09:54:47.2579552Z             {
2026-08-28T09:54:47.2579915Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2580201Z               "line": 2959
2026-08-28T09:54:47.2580462Z             },
2026-08-28T09:54:47.2580734Z             {
2026-08-28T09:54:47.2581082Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2581377Z               "line": 2982
2026-08-28T09:54:47.2581639Z             },
2026-08-28T09:54:47.2581968Z             {
2026-08-28T09:54:47.2582480Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2582836Z               "line": 3217
2026-08-28T09:54:47.2583104Z             },
2026-08-28T09:54:47.2583399Z             {
2026-08-28T09:54:47.2583896Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2584178Z               "line": 3263
2026-08-28T09:54:47.2584445Z             },
2026-08-28T09:54:47.2584707Z             {
2026-08-28T09:54:47.2585060Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2585347Z               "line": 3305
2026-08-28T09:54:47.2585608Z             },
2026-08-28T09:54:47.2585879Z             {
2026-08-28T09:54:47.2586194Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2586489Z               "line": 29813
2026-08-28T09:54:47.2586834Z             },
2026-08-28T09:54:47.2587102Z             {
2026-08-28T09:54:47.2587435Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2587718Z               "line": 29890
2026-08-28T09:54:47.2587994Z             },
2026-08-28T09:54:47.2588261Z             {
2026-08-28T09:54:47.2588586Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2588867Z               "line": 37051
2026-08-28T09:54:47.2589232Z             },
2026-08-28T09:54:47.2589501Z             {
2026-08-28T09:54:47.2589831Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2590107Z               "line": 37118
2026-08-28T09:54:47.2590374Z             },
2026-08-28T09:54:47.2590641Z             {
2026-08-28T09:54:47.2590960Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2591251Z               "line": 37146
2026-08-28T09:54:47.2591509Z             }
2026-08-28T09:54:47.2591782Z           ]
2026-08-28T09:54:47.2592046Z         }
2026-08-28T09:54:47.2592308Z       }
2026-08-28T09:54:47.2592566Z     },
2026-08-28T09:54:47.2592834Z     {
2026-08-28T09:54:47.2593167Z       "id": "REQ-KNOCK-EVIDENCE-ROUTE",
2026-08-28T09:54:47.2613292Z       "title": "A KNOCK REACHES AN EVIDENCE-KNOWN PEER THAT RESOLUTION CANNOT FIND, exactly as an ordinary send already does. `knock_send_remote` returned `NotFound` the moment `resolve_across_visible` did, while the message leg at the SAME resolution point fell through to the node-tier evidence route (REQ-UNLISTED-EVIDENCE-ROUTE, DOORBELL W3): an undiscoverable target was therefore UNKNOCKABLE WHILE STILL SENDABLE -- the one door whose whole purpose is to be knocked on was the one that was closed, and a knock is precisely how a stranger asks to be admitted. IT IS ALSO THE N-1 INTEROP LEG OF releases#180 AND LOAD-BEARING, NOT COSMETIC: a peer on a pre-#180 build still applies its blanket-closed posture to DISCOVER and will not advertise, so flipping OUR default cannot make THEM knockable, and without this arm #180 buys nothing against the installed fleet. THE ARM IS THE MESSAGE LEG'S, NOT A SECOND MECHANISM: the same `unlisted::route_node_for` over the same `raw_evidence`, consuming the same field (the node key) the message leg consumes, and the ASKER'S OWN EXCLUSION IS RE-IMPOSED AT THE ARM with `excl.anywhere()` -- the same source the resolve path's predicate came from -- because resolution's own check lives INSIDE the call this arm has already fallen out of. NOTHING ABOUT ADMISSION MOVES: the TARGET's access gate rules this hop at the owner's own seam exactly as it rules every inbound today; routing on evidence is not circumventing hiddenness, because the invitation IS the consent. `KnockSendOutcome::Excluded` is minted as the message leg's `WanSendOutcome::Excluded` sibling so an exclusion refusal NAMES THE BOUNDARY AND WHOSE IT IS instead of collapsing into `NotFound` and sending the operator hunting at the far end for a decision they made at this one -- and it is deliberately NOT a landing: it must not take `NotFound`'s local-inbox fallback, since recording the ask locally would write a row against a boundary the operator themselves drew (releases#145's defect in a new costume). Gate: doc -- the CONTEXT.md evidence-route entry extended to name the knock leg and what it does not widen; impl -- the NotFound arm on the knock leg, the `Excluded` outcome, its CLI line, and its placement in the landing/refusal partition; unit -- the discriminator triple at the real function over an EMPTY registry (no evidence still refuses NotFound, an excluded id refuses through the route, and a non-excluded evidence-known id is REACHED), with the excluded arm run FIRST so the admitted arm cannot be a leftover, plus `Excluded` proven to be neither a landing at EITHER value of target-locality nor a wire refusal.",
2026-08-28T09:54:47.2613831Z       "requiredStages": [
2026-08-28T09:54:47.2614106Z         "doc",
2026-08-28T09:54:47.2614373Z         "impl",
2026-08-28T09:54:47.2614640Z         "unit",
2026-08-28T09:54:47.2614916Z         "int"
2026-08-28T09:54:47.2615240Z       ],
2026-08-28T09:54:47.2615516Z       "stages": {
2026-08-28T09:54:47.2615787Z         "doc": {
2026-08-28T09:54:47.2616082Z           "complete": true,
2026-08-28T09:54:47.2616368Z           "evidence": [
2026-08-28T09:54:47.2616634Z             {
2026-08-28T09:54:47.2616945Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2617221Z               "line": 605
2026-08-28T09:54:47.2617488Z             }
2026-08-28T09:54:47.2617793Z           ]
2026-08-28T09:54:47.2618160Z         },
2026-08-28T09:54:47.2618429Z         "impl": {
2026-08-28T09:54:47.2618726Z           "complete": true,
2026-08-28T09:54:47.2619073Z           "evidence": [
2026-08-28T09:54:47.2619335Z             {
2026-08-28T09:54:47.2619660Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2619937Z               "line": 17212
2026-08-28T09:54:47.2620204Z             },
2026-08-28T09:54:47.2620470Z             {
2026-08-28T09:54:47.2620793Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2621081Z               "line": 17486
2026-08-28T09:54:47.2621344Z             },
2026-08-28T09:54:47.2621616Z             {
2026-08-28T09:54:47.2621955Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2622236Z               "line": 525
2026-08-28T09:54:47.2622499Z             },
2026-08-28T09:54:47.2622761Z             {
2026-08-28T09:54:47.2623100Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2623381Z               "line": 577
2026-08-28T09:54:47.2623717Z             }
2026-08-28T09:54:47.2623989Z           ]
2026-08-28T09:54:47.2624256Z         },
2026-08-28T09:54:47.2624524Z         "int": {
2026-08-28T09:54:47.2624819Z           "complete": true,
2026-08-28T09:54:47.2625106Z           "evidence": [
2026-08-28T09:54:47.2625368Z             {
2026-08-28T09:54:47.2625745Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:47.2626146Z               "line": 848
2026-08-28T09:54:47.2626414Z             },
2026-08-28T09:54:47.2626685Z             {
2026-08-28T09:54:47.2627047Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:47.2627406Z               "line": 1240
2026-08-28T09:54:47.2627672Z             }
2026-08-28T09:54:47.2627926Z           ]
2026-08-28T09:54:47.2628198Z         },
2026-08-28T09:54:47.2628464Z         "unit": {
2026-08-28T09:54:47.2628758Z           "complete": true,
2026-08-28T09:54:47.2629122Z           "evidence": [
2026-08-28T09:54:47.2629394Z             {
2026-08-28T09:54:47.2629723Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2630004Z               "line": 30117
2026-08-28T09:54:47.2630272Z             },
2026-08-28T09:54:47.2630539Z             {
2026-08-28T09:54:47.2630887Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.2631169Z               "line": 2210
2026-08-28T09:54:47.2631444Z             }
2026-08-28T09:54:47.2631709Z           ]
2026-08-28T09:54:47.2631970Z         }
2026-08-28T09:54:47.2632238Z       }
2026-08-28T09:54:47.2632505Z     },
2026-08-28T09:54:47.2632772Z     {
2026-08-28T09:54:47.2633078Z       "id": "REQ-KNOCK-FLOOD",
2026-08-28T09:54:47.2649666Z       "title": "Knocking cannot be used to flood, enumerate or brute-force. One pending knock per (knocker, target) pair — a re-knock UPDATES IN PLACE rather than queueing a second row, so an inbox cannot be filled by repetition. Knocks carry a TTL of one day and the expiry is enforced AT THE ANSWER SEAM: an expired knock is unapprovable regardless of what a stale list rendering showed, because a TTL that only filters a view is a display convention rather than a boundary. Inbound knocks are rate-limited per node (roughly ten an hour by default, knob-adjustable) using the existing windowed-counter shape rather than a newly minted clock pattern, and code redemption attempts are rate-limited per node likewise. Redemption is single-use and ATOMIC — two concurrent redemptions of one code yield exactly one success — and a redemption whose resulting write is refused does NOT burn the code. Code entropy is sized so guessing is closed under the TTL and rate limit together, and codes carry their target so no blind enumeration is possible through the discovery bypass (the docs state this). An expiry that removes a knock from the inbox must render as expired rather than as a clean nothing-to-approve: set-membership change is a re-entry path for hazard 7.61 and is pinned by test. Gate: doc — the CONTEXT.md knock entry stating TTL, one-pending-per-pair and the enumeration property, plus the public docs note on codes carrying their target; impl — the in-place upsert, the answer-seam expiry check, the per-node rate windows, and atomic single-use redemption; unit — a re-knock updates rather than appends, an expired knock is refused at answer even when a stale list showed it pending, concurrent redemptions produce exactly one success, a refused write leaves the code unburned, the rate limit refuses past its window and admits within it, and an expired-out knock renders as expired rather than as absence.",
2026-08-28T09:54:47.2650167Z       "requiredStages": [
2026-08-28T09:54:47.2650439Z         "doc",
2026-08-28T09:54:47.2650715Z         "impl",
2026-08-28T09:54:47.2650993Z         "unit"
2026-08-28T09:54:47.2651255Z       ],
2026-08-28T09:54:47.2651540Z       "stages": {
2026-08-28T09:54:47.2651812Z         "doc": {
2026-08-28T09:54:47.2652098Z           "complete": true,
2026-08-28T09:54:47.2652388Z           "evidence": [
2026-08-28T09:54:47.2652663Z             {
2026-08-28T09:54:47.2653067Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2653483Z               "line": 3
2026-08-28T09:54:47.2653865Z             }
2026-08-28T09:54:47.2654231Z           ]
2026-08-28T09:54:47.2654513Z         },
2026-08-28T09:54:47.2654795Z         "impl": {
2026-08-28T09:54:47.2655085Z           "complete": true,
2026-08-28T09:54:47.2655374Z           "evidence": [
2026-08-28T09:54:47.2655636Z             {
2026-08-28T09:54:47.2656018Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2656308Z               "line": 1628
2026-08-28T09:54:47.2656667Z             },
2026-08-28T09:54:47.2656933Z             {
2026-08-28T09:54:47.2657320Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2657614Z               "line": 1860
2026-08-28T09:54:47.2657874Z             },
2026-08-28T09:54:47.2658141Z             {
2026-08-28T09:54:47.2658494Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2658780Z               "line": 314
2026-08-28T09:54:47.2659124Z             },
2026-08-28T09:54:47.2659391Z             {
2026-08-28T09:54:47.2659758Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2660039Z               "line": 506
2026-08-28T09:54:47.2660307Z             },
2026-08-28T09:54:47.2660576Z             {
2026-08-28T09:54:47.2660942Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2661219Z               "line": 516
2026-08-28T09:54:47.2661491Z             },
2026-08-28T09:54:47.2661757Z             {
2026-08-28T09:54:47.2662120Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2662406Z               "line": 1169
2026-08-28T09:54:47.2662668Z             },
2026-08-28T09:54:47.2662934Z             {
2026-08-28T09:54:47.2663279Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2663561Z               "line": 1217
2026-08-28T09:54:47.2663833Z             },
2026-08-28T09:54:47.2664171Z             {
2026-08-28T09:54:47.2664524Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2664814Z               "line": 1270
2026-08-28T09:54:47.2665097Z             },
2026-08-28T09:54:47.2665365Z             {
2026-08-28T09:54:47.2665718Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2666030Z               "line": 1324
2026-08-28T09:54:47.2666459Z             },
2026-08-28T09:54:47.2666726Z             {
2026-08-28T09:54:47.2667079Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2667432Z               "line": 1344
2026-08-28T09:54:47.2667698Z             },
2026-08-28T09:54:47.2667966Z             {
2026-08-28T09:54:47.2668316Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2668607Z               "line": 1581
2026-08-28T09:54:47.2668869Z             },
2026-08-28T09:54:47.2669222Z             {
2026-08-28T09:54:47.2669541Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2669833Z               "line": 17322
2026-08-28T09:54:47.2670104Z             },
2026-08-28T09:54:47.2670366Z             {
2026-08-28T09:54:47.2670694Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2670970Z               "line": 18471
2026-08-28T09:54:47.2671240Z             },
2026-08-28T09:54:47.2671507Z             {
2026-08-28T09:54:47.2671841Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2672122Z               "line": 19194
2026-08-28T09:54:47.2672399Z             }
2026-08-28T09:54:47.2672670Z           ]
2026-08-28T09:54:47.2672937Z         },
2026-08-28T09:54:47.2673209Z         "int": {
2026-08-28T09:54:47.2673494Z           "complete": false,
2026-08-28T09:54:47.2673788Z           "evidence": []
2026-08-28T09:54:47.2674046Z         },
2026-08-28T09:54:47.2674317Z         "unit": {
2026-08-28T09:54:47.2674608Z           "complete": true,
2026-08-28T09:54:47.2674893Z           "evidence": [
2026-08-28T09:54:47.2675165Z             {
2026-08-28T09:54:47.2675547Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2675901Z               "line": 2710
2026-08-28T09:54:47.2676167Z             },
2026-08-28T09:54:47.2676442Z             {
2026-08-28T09:54:47.2676790Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2677076Z               "line": 2492
2026-08-28T09:54:47.2677343Z             },
2026-08-28T09:54:47.2677610Z             {
2026-08-28T09:54:47.2678150Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2678436Z               "line": 2512
2026-08-28T09:54:47.2678691Z             },
2026-08-28T09:54:47.2679147Z             {
2026-08-28T09:54:47.2679548Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2679824Z               "line": 2533
2026-08-28T09:54:47.2680092Z             },
2026-08-28T09:54:47.2680354Z             {
2026-08-28T09:54:47.2680708Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2680984Z               "line": 2555
2026-08-28T09:54:47.2681245Z             },
2026-08-28T09:54:47.2681521Z             {
2026-08-28T09:54:47.2681871Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2682153Z               "line": 2577
2026-08-28T09:54:47.2682420Z             },
2026-08-28T09:54:47.2682692Z             {
2026-08-28T09:54:47.2683044Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2683326Z               "line": 2666
2026-08-28T09:54:47.2683594Z             },
2026-08-28T09:54:47.2683856Z             {
2026-08-28T09:54:47.2684221Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2684495Z               "line": 2687
2026-08-28T09:54:47.2684766Z             },
2026-08-28T09:54:47.2685025Z             {
2026-08-28T09:54:47.2685386Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2685678Z               "line": 2704
2026-08-28T09:54:47.2685945Z             }
2026-08-28T09:54:47.2686212Z           ]
2026-08-28T09:54:47.2686565Z         }
2026-08-28T09:54:47.2686833Z       }
2026-08-28T09:54:47.2687098Z     },
2026-08-28T09:54:47.2687360Z     {
2026-08-28T09:54:47.2687766Z       "id": "REQ-KNOCK-HUMAN-PRESENTER-NOT-DEAD-ENDED",
2026-08-28T09:54:47.2706259Z       "title": "A HUMAN PRESENTING A VALID CODE REACHES A DECISION, RATHER THAN SILENCE THAT NEVER ENDS. A bare-terminal presenter binds the deliberately-narrower `node + origin user` subject -- the knock design's own human form, 'the humans on my node', ratified as narrower than a bare node entry. `RuleMutation::widens()` classifies widening by subject KIND ALONE, so the origin-USER qualifier does not narrow it, and redeeming ANY code whose mint did not carry `--admit-node` -- INCLUDING AN MSG-ONLY CODE, whose surface is perfectly attributable -- refuses the rule write, reaches no decision, and returns the two-silences serve arm. The silence is individually correct and collectively a dead end: nobody at MINT time knows whether a human will redeem, so the commonest invite there is -- here is a code, message me -- is a latent trap for exactly the least-technical presenter, and it starts at the mint, where the person who could have avoided it was never told. THE FIX SIDE IS A RULING, NOT A BUILDER'S CHOICE, and this requirement deliberately states the PROPERTY rather than the mechanism: whether `widens()` learns the qualifier axis (a subject admitting only the humans on a machine is multi-party but materially narrower, and the acknowledgment's own stated ground -- that it admits every endpoint on the knocker's node -- is false of it) or the redemption path carries a special case, the delivered property is the same. Weighed against it and to be answered by the ruling, not assumed away: humans on a machine can widen over time as users are added, and the grant-nodes policy may deliberately treat any node-scoped subject as node-tier whatever its qualifier. Gate: impl -- the ruled mechanism, single-sourced so the local verb and the wire serve side cannot answer differently; unit -- an MSG-only code minted WITHOUT the acknowledgment, presented by a bare terminal, reaches a DECISION and writes a rule that MATCHES the traffic it names (asserted against the real chain, not a second reading of it), presented by an ENDPOINT it still binds the sender-endpoint subject unchanged, and -- the non-vacuity row, since a mechanism that stops refusing everything would also satisfy the first -- a genuinely node-widening bake WITHOUT the acknowledgment is still REFUSED on the same fixture.",
2026-08-28T09:54:47.2706798Z       "requiredStages": [
2026-08-28T09:54:47.2707075Z         "doc",
2026-08-28T09:54:47.2707356Z         "impl",
2026-08-28T09:54:47.2707685Z         "unit",
2026-08-28T09:54:47.2707953Z         "int"
2026-08-28T09:54:47.2708228Z       ],
2026-08-28T09:54:47.2708504Z       "stages": {
2026-08-28T09:54:47.2708780Z         "doc": {
2026-08-28T09:54:47.2709182Z           "complete": true,
2026-08-28T09:54:47.2709463Z           "evidence": [
2026-08-28T09:54:47.2709734Z             {
2026-08-28T09:54:47.2710039Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2710329Z               "line": 948
2026-08-28T09:54:47.2710595Z             }
2026-08-28T09:54:47.2710861Z           ]
2026-08-28T09:54:47.2711123Z         },
2026-08-28T09:54:47.2711395Z         "impl": {
2026-08-28T09:54:47.2711695Z           "complete": true,
2026-08-28T09:54:47.2711976Z           "evidence": [
2026-08-28T09:54:47.2712244Z             {
2026-08-28T09:54:47.2712615Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.2712911Z               "line": 1296
2026-08-28T09:54:47.2713177Z             },
2026-08-28T09:54:47.2713443Z             {
2026-08-28T09:54:47.2713767Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2714048Z               "line": 17854
2026-08-28T09:54:47.2714315Z             }
2026-08-28T09:54:47.2714577Z           ]
2026-08-28T09:54:47.2714844Z         },
2026-08-28T09:54:47.2715111Z         "int": {
2026-08-28T09:54:47.2715401Z           "complete": true,
2026-08-28T09:54:47.2715754Z           "evidence": [
2026-08-28T09:54:47.2716028Z             {
2026-08-28T09:54:47.2716452Z               "path": "crates/spt/tests/human_redeem_msg_code_e2e.rs",
2026-08-28T09:54:47.2716743Z               "line": 144
2026-08-28T09:54:47.2717024Z             },
2026-08-28T09:54:47.2717291Z             {
2026-08-28T09:54:47.2717720Z               "path": "crates/spt/tests/human_redeem_msg_code_e2e.rs",
2026-08-28T09:54:47.2717997Z               "line": 189
2026-08-28T09:54:47.2718259Z             },
2026-08-28T09:54:47.2718518Z             {
2026-08-28T09:54:47.2719122Z               "path": "crates/spt/tests/human_redeem_msg_code_e2e.rs",
2026-08-28T09:54:47.2719418Z               "line": 277
2026-08-28T09:54:47.2719689Z             }
2026-08-28T09:54:47.2719965Z           ]
2026-08-28T09:54:47.2720228Z         },
2026-08-28T09:54:47.2720499Z         "unit": {
2026-08-28T09:54:47.2720786Z           "complete": true,
2026-08-28T09:54:47.2725399Z           "evidence": [
2026-08-28T09:54:47.2725704Z             {
2026-08-28T09:54:47.2726111Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2726394Z               "line": 1131
2026-08-28T09:54:47.2726664Z             },
2026-08-28T09:54:47.2726927Z             {
2026-08-28T09:54:47.2727293Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.2727575Z               "line": 2426
2026-08-28T09:54:47.2727937Z             },
2026-08-28T09:54:47.2728205Z             {
2026-08-28T09:54:47.2728562Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2728847Z               "line": 2119
2026-08-28T09:54:47.2729219Z             },
2026-08-28T09:54:47.2729486Z             {
2026-08-28T09:54:47.2729838Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2730121Z               "line": 2161
2026-08-28T09:54:47.2730392Z             },
2026-08-28T09:54:47.2730651Z             {
2026-08-28T09:54:47.2731007Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2731285Z               "line": 2194
2026-08-28T09:54:47.2731654Z             },
2026-08-28T09:54:47.2731915Z             {
2026-08-28T09:54:47.2732249Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2732530Z               "line": 37614
2026-08-28T09:54:47.2732801Z             }
2026-08-28T09:54:47.2733073Z           ]
2026-08-28T09:54:47.2733331Z         }
2026-08-28T09:54:47.2733602Z       }
2026-08-28T09:54:47.2733870Z     },
2026-08-28T09:54:47.2734138Z     {
2026-08-28T09:54:47.2734479Z       "id": "REQ-KNOCK-INBOX-DAEMON-OWNED",
2026-08-28T09:54:47.2745823Z       "title": "The knock inbox is DAEMON-OWNED and durable independently of any agent's attach state: knocks land and persist whether or not the target's agent is running, attached, or resting, and an engine-room that is posture-offline loses nothing it was sent. This rules OUT the per-perch message spool as the substrate — that store is a property of a perch and dies with `endpoint purge`, which would make purging one endpoint destroy knocks addressed to another and would silently discard a pending knock at exactly the moment an operator is reorganizing endpoints. The store is therefore node-level and daemon-owned, and its durability is proven rather than asserted: purging the KNOCKER's perch leaves the knock answerable by the target, since the record's authority is the daemon's mint-time stamp and not the continued existence of the knocker's perch. Knocks are never auto-surfaced to the receiving agent — the inbox is queryable and the user or another agent must ask — with the sole exceptions being the three consented notifications. Gate: doc — the CONTEXT.md knock entry naming the inbox as daemon-owned and queryable-not-surfaced; impl — the node-level daemon-owned store; unit — a knock survives the target agent being absent and is answerable when it returns, purging the knocker's perch leaves the knock answerable, and no knock reaches an agent's event stream unbidden.",
2026-08-28T09:54:47.2746311Z       "requiredStages": [
2026-08-28T09:54:47.2746586Z         "doc",
2026-08-28T09:54:47.2746853Z         "impl",
2026-08-28T09:54:47.2747115Z         "unit"
2026-08-28T09:54:47.2747373Z       ],
2026-08-28T09:54:47.2747648Z       "stages": {
2026-08-28T09:54:47.2747913Z         "doc": {
2026-08-28T09:54:47.2748209Z           "complete": true,
2026-08-28T09:54:47.2748490Z           "evidence": [
2026-08-28T09:54:47.2748756Z             {
2026-08-28T09:54:47.2749235Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2749507Z               "line": 3
2026-08-28T09:54:47.2749841Z             }
2026-08-28T09:54:47.2750103Z           ]
2026-08-28T09:54:47.2750387Z         },
2026-08-28T09:54:47.2750653Z         "impl": {
2026-08-28T09:54:47.2750950Z           "complete": true,
2026-08-28T09:54:47.2751241Z           "evidence": [
2026-08-28T09:54:47.2751503Z             {
2026-08-28T09:54:47.2751865Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2752152Z               "line": 1119
2026-08-28T09:54:47.2752420Z             },
2026-08-28T09:54:47.2752684Z             {
2026-08-28T09:54:47.2753045Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2753321Z               "line": 1125
2026-08-28T09:54:47.2753606Z             },
2026-08-28T09:54:47.2754023Z             {
2026-08-28T09:54:47.2754489Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:47.2754770Z               "line": 329
2026-08-28T09:54:47.2755028Z             },
2026-08-28T09:54:47.2755287Z             {
2026-08-28T09:54:47.2755599Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2755878Z               "line": 17547
2026-08-28T09:54:47.2756135Z             }
2026-08-28T09:54:47.2756393Z           ]
2026-08-28T09:54:47.2756651Z         },
2026-08-28T09:54:47.2756913Z         "int": {
2026-08-28T09:54:47.2757200Z           "complete": false,
2026-08-28T09:54:47.2757471Z           "evidence": []
2026-08-28T09:54:47.2757738Z         },
2026-08-28T09:54:47.2758004Z         "unit": {
2026-08-28T09:54:47.2758387Z           "complete": true,
2026-08-28T09:54:47.2758673Z           "evidence": [
2026-08-28T09:54:47.2759045Z             {
2026-08-28T09:54:47.2759428Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2759704Z               "line": 3352
2026-08-28T09:54:47.2759970Z             },
2026-08-28T09:54:47.2760228Z             {
2026-08-28T09:54:47.2760581Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2760857Z               "line": 3380
2026-08-28T09:54:47.2761130Z             },
2026-08-28T09:54:47.2761387Z             {
2026-08-28T09:54:47.2761806Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2762091Z               "line": 3393
2026-08-28T09:54:47.2762355Z             },
2026-08-28T09:54:47.2762626Z             {
2026-08-28T09:54:47.2762980Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2763268Z               "line": 3422
2026-08-28T09:54:47.2763532Z             }
2026-08-28T09:54:47.2763800Z           ]
2026-08-28T09:54:47.2764067Z         }
2026-08-28T09:54:47.2764329Z       }
2026-08-28T09:54:47.2764583Z     },
2026-08-28T09:54:47.2764830Z     {
2026-08-28T09:54:47.2765155Z       "id": "REQ-KNOCK-KNOCKER-STAMP",
2026-08-28T09:54:47.2774684Z       "title": "BINDING: the knock record's knocker field is daemon-stamped at mint (session-proven, the W2b discipline) and never caller-supplied. This is the load-bearing security property of the whole knock mechanism, not a hardening detail — an approval WRITES A WHITELIST ENTRY FOR THAT ID, so a forgeable knocker field is a grant-to-attacker primitive: an attacker who can name someone else as the knocker gets the target's own agent to authorize reach for an identity the attacker controls. KNOCK is therefore attributable by construction, independent of the per-surface attributability of whatever surfaces the knock requests. The stamp is applied at the same sending-daemon seam that proves the sender endpoint, and no CLI flag, envelope field or record edit may override it after mint. Gate: doc — the CONTEXT.md knock entries naming the stamp as binding; impl — the mint-time stamp with no caller-supplied path to the field; unit — a knock minted by an agent carries that agent's proven id, a caller-supplied knocker value is ignored or refused rather than persisted, and an approval writes its entry for the STAMPED id and never for a supplied one.",
2026-08-28T09:54:47.2775204Z       "requiredStages": [
2026-08-28T09:54:47.2775472Z         "doc",
2026-08-28T09:54:47.2775815Z         "impl",
2026-08-28T09:54:47.2776078Z         "unit",
2026-08-28T09:54:47.2776345Z         "int"
2026-08-28T09:54:47.2776610Z       ],
2026-08-28T09:54:47.2776879Z       "stages": {
2026-08-28T09:54:47.2777147Z         "doc": {
2026-08-28T09:54:47.2777437Z           "complete": true,
2026-08-28T09:54:47.2777714Z           "evidence": [
2026-08-28T09:54:47.2777981Z             {
2026-08-28T09:54:47.2778381Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2778683Z               "line": 3
2026-08-28T09:54:47.2779030Z             }
2026-08-28T09:54:47.2779281Z           ]
2026-08-28T09:54:47.2779546Z         },
2026-08-28T09:54:47.2779817Z         "impl": {
2026-08-28T09:54:47.2780113Z           "complete": true,
2026-08-28T09:54:47.2780390Z           "evidence": [
2026-08-28T09:54:47.2780657Z             {
2026-08-28T09:54:47.2781029Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2781319Z               "line": 1627
2026-08-28T09:54:47.2781587Z             },
2026-08-28T09:54:47.2781841Z             {
2026-08-28T09:54:47.2782211Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2782488Z               "line": 1859
2026-08-28T09:54:47.2782754Z             },
2026-08-28T09:54:47.2783016Z             {
2026-08-28T09:54:47.2783398Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:47.2783679Z               "line": 56
2026-08-28T09:54:47.2783941Z             },
2026-08-28T09:54:47.2784274Z             {
2026-08-28T09:54:47.2784629Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2784910Z               "line": 144
2026-08-28T09:54:47.2785173Z             },
2026-08-28T09:54:47.2785426Z             {
2026-08-28T09:54:47.2785769Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2786051Z               "line": 237
2026-08-28T09:54:47.2786323Z             },
2026-08-28T09:54:47.2786580Z             {
2026-08-28T09:54:47.2786914Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2787193Z               "line": 16550
2026-08-28T09:54:47.2787534Z             },
2026-08-28T09:54:47.2787801Z             {
2026-08-28T09:54:47.2788140Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2788416Z               "line": 17321
2026-08-28T09:54:47.2788679Z             }
2026-08-28T09:54:47.2789051Z           ]
2026-08-28T09:54:47.2789308Z         },
2026-08-28T09:54:47.2789586Z         "int": {
2026-08-28T09:54:47.2789875Z           "complete": true,
2026-08-28T09:54:47.2790159Z           "evidence": [
2026-08-28T09:54:47.2790430Z             {
2026-08-28T09:54:47.2790818Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.2791094Z               "line": 1037
2026-08-28T09:54:47.2791365Z             }
2026-08-28T09:54:47.2791632Z           ]
2026-08-28T09:54:47.2791899Z         },
2026-08-28T09:54:47.2792175Z         "unit": {
2026-08-28T09:54:47.2792471Z           "complete": true,
2026-08-28T09:54:47.2792757Z           "evidence": [
2026-08-28T09:54:47.2793024Z             {
2026-08-28T09:54:47.2793410Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.2793692Z               "line": 2710
2026-08-28T09:54:47.2793968Z             },
2026-08-28T09:54:47.2794234Z             {
2026-08-28T09:54:47.2794607Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:47.2794954Z               "line": 173
2026-08-28T09:54:47.2795218Z             },
2026-08-28T09:54:47.2795489Z             {
2026-08-28T09:54:47.2795842Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2796124Z               "line": 2475
2026-08-28T09:54:47.2796386Z             }
2026-08-28T09:54:47.2796658Z           ]
2026-08-28T09:54:47.2796921Z         }
2026-08-28T09:54:47.2797179Z       }
2026-08-28T09:54:47.2797446Z     },
2026-08-28T09:54:47.2797701Z     {
2026-08-28T09:54:47.2798066Z       "id": "REQ-KNOCK-MINT-MUTUAL-IS-A-REQUEST",
2026-08-28T09:54:47.2832347Z       "title": "RETIRED 2026-08-04 (ADR-0055, releases#144 bag grill) — ITS SUBJECT NO LONGER EXISTS. `knock new-code --mutual` is removed: a mint declares no directionality at all, so there is no mint-side pre-authorization left to be a request or a grant. The finding this requirement recorded stands as history and its second property survives it — no surface may claim a reverse the claiming side did not open — which is now carried by the sender-declared model itself, where only the declarer's own act opens the declarer's own side. Its impl, unit and int evidence deleted with the code (including arms 2 and 3 of crates/spt/tests/knock_mutual_cross_node_e2e.rs; the surviving arms stay and remain REQ-KNOCK-REDEEM-MUTUAL-RECEIPT's). Retained in the registry rather than deleted so the reversal reads back. The superseded text follows verbatim. A MINT-SIDE `--mutual` IS A REQUEST FOR THE REVERSE, NEVER A GRANT OF IT, AND NOTHING MAY RENDER IT AS ONE. The reverse of a code grant is the TARGET reaching the REDEEMER, which can only be opened by a rule scoped on the REDEEMER'S OWN endpoint -- so no record held on the MINTING node can ever constitute that consent. As shipped, `new-code --mutual` armed a minter-local record whose consumption wrote scope=target subject=redeemer, which is the SAME DIRECTION the redemption grant already wrote: a DUPLICATE, not a reverse. The `REDEEMED` reply then carried a flag rendered to the presenter as `reach is TWO-way -- they may reach you as well`, asserting a direction that nothing had opened and that only the presenter's own act could open. TWO INDEPENDENT PROPERTIES, and the second is not implied by the first: the mint-side mutual must not DUPLICATE the forward grant, and no surface may CLAIM a reverse that the claiming side did not open. A repair that stopped the duplicate write while leaving the sentence standing would satisfy one and keep shipping the other. THE RATIFIED PRINCIPLES DECIDE THE INSTRUMENT and this requirement records which: `knock approve --mutual` was always the precedent -- when the side OFFERING reach wants it back, the instrument is a reciprocal KNOCK, not a grant -- so consuming the mint-armed record puts the target's knock in the redeemer's inbox, the redeemer answers it, and the reverse opens with the only consent that can open it. `full mutuality needs both` is FALSE under the grant spelling (`redeem --mutual` alone already writes the true reverse) and TRUE under this one, which is the tell that distinguishes them. WHICH SIDE A PRE-AUTHORIZATION IS MUST BE RECORDED AT ARM TIME, not re-derived at consumption by comparing an owner against the code's target: the two sides owe DIFFERENT things and a discriminant inferred at the check is a second source for what was known at the mint. THE REPLY IS THE CARRIER and the provenance is its own: the request rides the redemption reply already crossing the seam with node-proof in hand, and the knock the redeemer's node writes from it is stamped with a provenance distinct from a handshake-stamped first-order knock -- it is sound because the redeemer opened a sealed code with a subnet seed and received a node-proven reply in the SAME exchange, which is better evidence than an inbound receiver holds, and that argument does not generalize beyond this exchange. Gate: doc -- the CONTEXT.md mutual entry carrying the struck-and-amended mint-side clause; impl -- the arm-time side discriminant on the record, the consumption producing a reciprocal knock instead of a rule, the reply-carried request, and the distinct provenance at the write site; unit -- a mint-armed record's consumption yields a KNOCK and writes NO access rule (asserted against a fixture where the duplicate rule would be visible, since a repair that merely stopped rendering would pass a rendering-only row), a redeemer-armed record's consumption still yields its reverse RULE (the pair asserted together, since either alone passes an implementation that treats every record one way), the reply-written knock carries the distinct provenance and NOT the first-order one, and no surface renders a two-way claim on the strength of the minting side's record alone. Retirement row: the `they may reach you as well` sentence is gone from every surface, asserted by rendering.",
2026-08-28T09:54:47.2833053Z       "requiredStages": [],
2026-08-28T09:54:47.2833434Z       "stages": {
2026-08-28T09:54:47.2833835Z         "doc": {
2026-08-28T09:54:47.2834164Z           "complete": false,
2026-08-28T09:54:47.2834449Z           "evidence": []
2026-08-28T09:54:47.2834717Z         },
2026-08-28T09:54:47.2834988Z         "impl": {
2026-08-28T09:54:47.2835283Z           "complete": false,
2026-08-28T09:54:47.2835560Z           "evidence": []
2026-08-28T09:54:47.2835826Z         },
2026-08-28T09:54:47.2836089Z         "int": {
2026-08-28T09:54:47.2836385Z           "complete": false,
2026-08-28T09:54:47.2836675Z           "evidence": []
2026-08-28T09:54:47.2836934Z         },
2026-08-28T09:54:47.2837213Z         "unit": {
2026-08-28T09:54:47.2837511Z           "complete": false,
2026-08-28T09:54:47.2837802Z           "evidence": []
2026-08-28T09:54:47.2838064Z         }
2026-08-28T09:54:47.2838331Z       }
2026-08-28T09:54:47.2838589Z     },
2026-08-28T09:54:47.2838852Z     {
2026-08-28T09:54:47.2839280Z       "id": "REQ-KNOCK-MONIC-IMPART",
2026-08-28T09:54:47.2860700Z       "title": "A knock answer can impart a MONIC about whoever it admits: `spt knock approve <id> --monic <message>` writes the note at the approval, and `spt knock new-code --monic <message>` bakes one into a code that is imparted when the code is REDEEMED. The code path is deferred by necessity rather than by design — at mint there is nobody to write a classification about yet, and the redeemer's identity only becomes stamped-and-real at redemption. THE NOTE IS ABOUT A DAEMON-STAMPED ID, never a caller-supplied one: it is written about the same stamped knocker id an approval writes its whitelist entry for, so a note can no more be planted on an innocent peer than a grant can. A knocker with no endpoint id — a bare-terminal human, stamped as their node — CANNOT be classified: the note is refused loudly and the grant stands, because writing a classification under a node id would produce a record no delivery-edge lookup can ever match while reading back as though someone had been classified. AN EXISTING CLASSIFICATION IS KEPT. Both paths route through ONE shared impart primitive whose rule is that the owner's standing judgement outranks a judgement arriving with a grant — an approval must not silently rewrite what an agent already decided about a peer, and a note typed at code-mint hours earlier certainly must not — and the caller is told which happened so it prints the replace command instead of implying the note landed. An UNREADABLE record is not a classification, so imparting replaces a husk. THE NOTE RIDES THE GRANT AND NEVER CHANGES IT: it is imparted only AFTER the grant has committed, is skipped entirely on a refusal (a classification of a peer you did not admit), and a mind that cannot be opened costs a loud diagnostic rather than a retracted approval. Whose mind holds the judgement is RECORDED, not derived: a node-target code is minted by the engine room and a node has no mind, so the imprint carries its owner endpoint from the mint, and the redemption path never guesses. The code record's imprint field is ADDITIVE — a code minted before the field existed still reads, and a code with no note serializes without the key. Gate: impl — the `--monic` flag on approve (a NEW public flag; it existed only on new-code, where it was recorded and inert), the owner-carrying imprint on the code record, the shared impart primitive, and the impart calls at the approve and redeem sites after their commits; unit — imparting writes with knock provenance, KEEPS a standing judgement and reports what is held, replaces a husk, the imprint field reads with and without a note in the record bytes, and both answer surfaces parse the flag.",
2026-08-28T09:54:47.2861346Z       "requiredStages": [
2026-08-28T09:54:47.2861614Z         "doc",
2026-08-28T09:54:47.2861948Z         "impl",
2026-08-28T09:54:47.2862219Z         "unit",
2026-08-28T09:54:47.2862491Z         "int"
2026-08-28T09:54:47.2862763Z       ],
2026-08-28T09:54:47.2863029Z       "stages": {
2026-08-28T09:54:47.2863301Z         "doc": {
2026-08-28T09:54:47.2863596Z           "complete": true,
2026-08-28T09:54:47.2863875Z           "evidence": [
2026-08-28T09:54:47.2864133Z             {
2026-08-28T09:54:47.2864538Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.2864843Z               "line": 294
2026-08-28T09:54:47.2865100Z             }
2026-08-28T09:54:47.2865359Z           ]
2026-08-28T09:54:47.2865615Z         },
2026-08-28T09:54:47.2865872Z         "impl": {
2026-08-28T09:54:47.2866154Z           "complete": true,
2026-08-28T09:54:47.2866444Z           "evidence": [
2026-08-28T09:54:47.2866707Z             {
2026-08-28T09:54:47.2867083Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2867369Z               "line": 281
2026-08-28T09:54:47.2867627Z             },
2026-08-28T09:54:47.2867889Z             {
2026-08-28T09:54:47.2868266Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2868548Z               "line": 393
2026-08-28T09:54:47.2868807Z             },
2026-08-28T09:54:47.2869250Z             {
2026-08-28T09:54:47.2869602Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2869884Z               "line": 435
2026-08-28T09:54:47.2870151Z             },
2026-08-28T09:54:47.2870485Z             {
2026-08-28T09:54:47.2870847Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.2871124Z               "line": 917
2026-08-28T09:54:47.2871395Z             },
2026-08-28T09:54:47.2871655Z             {
2026-08-28T09:54:47.2871977Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2872263Z               "line": 17942
2026-08-28T09:54:47.2872522Z             },
2026-08-28T09:54:47.2872789Z             {
2026-08-28T09:54:47.2873108Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2873390Z               "line": 17987
2026-08-28T09:54:47.2873710Z             },
2026-08-28T09:54:47.2873982Z             {
2026-08-28T09:54:47.2874299Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2874582Z               "line": 18211
2026-08-28T09:54:47.2874854Z             },
2026-08-28T09:54:47.2875117Z             {
2026-08-28T09:54:47.2875445Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2875737Z               "line": 18646
2026-08-28T09:54:47.2876004Z             },
2026-08-28T09:54:47.2876272Z             {
2026-08-28T09:54:47.2876601Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2876877Z               "line": 19326
2026-08-28T09:54:47.2877147Z             }
2026-08-28T09:54:47.2877419Z           ]
2026-08-28T09:54:47.2877680Z         },
2026-08-28T09:54:47.2877949Z         "int": {
2026-08-28T09:54:47.2878239Z           "complete": true,
2026-08-28T09:54:47.2878526Z           "evidence": [
2026-08-28T09:54:47.2878788Z             {
2026-08-28T09:54:47.2879349Z               "path": "crates/spt/tests/knock_approve_not_hostage_e2e.rs",
2026-08-28T09:54:47.2879633Z               "line": 240
2026-08-28T09:54:47.2879924Z             },
2026-08-28T09:54:47.2880191Z             {
2026-08-28T09:54:47.2880648Z               "path": "crates/spt/tests/knock_approve_not_hostage_e2e.rs",
2026-08-28T09:54:47.2880929Z               "line": 257
2026-08-28T09:54:47.2881258Z             },
2026-08-28T09:54:47.2881526Z             {
2026-08-28T09:54:47.2881980Z               "path": "crates/spt/tests/knock_approve_not_hostage_e2e.rs",
2026-08-28T09:54:47.2882263Z               "line": 288
2026-08-28T09:54:47.2882528Z             },
2026-08-28T09:54:47.2882805Z             {
2026-08-28T09:54:47.2883259Z               "path": "crates/spt/tests/knock_approve_not_hostage_e2e.rs",
2026-08-28T09:54:47.2883535Z               "line": 301
2026-08-28T09:54:47.2883806Z             }
2026-08-28T09:54:47.2884068Z           ]
2026-08-28T09:54:47.2884402Z         },
2026-08-28T09:54:47.2884669Z         "unit": {
2026-08-28T09:54:47.2884977Z           "complete": true,
2026-08-28T09:54:47.2885253Z           "evidence": [
2026-08-28T09:54:47.2885520Z             {
2026-08-28T09:54:47.2885882Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2886164Z               "line": 1874
2026-08-28T09:54:47.2886435Z             },
2026-08-28T09:54:47.2886702Z             {
2026-08-28T09:54:47.2887156Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.2887442Z               "line": 1791
2026-08-28T09:54:47.2887712Z             },
2026-08-28T09:54:47.2887988Z             {
2026-08-28T09:54:47.2888303Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2888589Z               "line": 29099
2026-08-28T09:54:47.2888852Z             }
2026-08-28T09:54:47.2889247Z           ]
2026-08-28T09:54:47.2889509Z         }
2026-08-28T09:54:47.2889781Z       }
2026-08-28T09:54:47.2890043Z     },
2026-08-28T09:54:47.2890307Z     {
2026-08-28T09:54:47.2890608Z       "id": "REQ-KNOCK-MUTUAL",
2026-08-28T09:54:47.2913440Z       "title": "Two-way reach is ENCOURAGED but never imposed, and NOBODY WRITES ANOTHER ENDPOINT'S RULES — the principle this requirement exists for, unchanged through two amendments of its mechanism. AMENDED 2026-08-04 (USHER, releases#144 / ADR-0055), CORRECTING the 2026-08-01 DOORBELL W2 amendment rather than adding to it: two-way reach DECOMPOSES INTO TWO SOVEREIGN ACTS, each side opening only its own inbound, and each act is declared by the side that PERFORMS it. The requester declares theirs at the requesting verb (--send-receive pre-authorizes a rule on the requester's OWN endpoint, written by their own daemon at answer-receipt, keyed to the knock's correlation id and the node-proven answer, subject exactly the endpoint knocked, and CONSUMED EXACTLY ONCE: a replayed or duplicated answer must not write it twice, and an answer that never arrives leaves it unconsumed rather than dangling as an open grant). The RECEIVER declares nothing when accepting — accepting IS their own-side act — and REVERSE REACH IS ARMED BY THE OTHER SIDE'S OWN KNOCK-BACK, an ordinary knock carrying its own declaration, never a rider on an approval and never a grant written across the boundary. SUPERSEDED SPELLINGS, both of which this requirement once carried: \"one-directional approve stands as the default\" (a silent default nobody typed), and \"approving with the mutual flag performs approve-plus-counter-knock\" (a second grammar for the knock verb's own job — removed, not renamed, by ADR-0055). What survives every revision intact: auto-mutual stays BANNED, and so does a standing \"mutual mode\" setting. The forced-choice machinery now lives at the requesting seats and is specified by REQ-KNOCK-DIRECTIONALITY-SENDER. NOTIFICATIONS ARE NOW TWO, not three, and the reduction is a CONSEQUENCE of the counter-knock's removal rather than a separate decision: an approval notifies the knocker, and a code redemption notifies the code's minter. The third — a counter-knock's arrival notifying the original knocker — was produced by the counter-knock path and dies with it; a knock-back is an ordinary knock and lands inbox-only, which is the never-auto-surface default the other two are exceptions to. Nobody whose own act did not invite the notice is ever notified. Gate: doc — the CONTEXT.md mutual-whitelisting entry, carrying the two sovereign acts and the knock-back as the reverse's only instrument; impl — the pre-authorization record with its correlation-id keying and once-only consumption, and the two notifications; unit — a pre-authorization is consumed exactly once under a replayed answer, an unanswered knock leaves it unconsumed, the send-only stdout prints a reverse command that actually PARSES under the mandatory-flag grammar, and no third notification path exists.",
2026-08-28T09:54:47.2915034Z       "requiredStages": [
2026-08-28T09:54:47.2915311Z         "doc",
2026-08-28T09:54:47.2915583Z         "impl",
2026-08-28T09:54:47.2915912Z         "unit"
2026-08-28T09:54:47.2916174Z       ],
2026-08-28T09:54:47.2916462Z       "stages": {
2026-08-28T09:54:47.2916728Z         "doc": {
2026-08-28T09:54:47.2917023Z           "complete": true,
2026-08-28T09:54:47.2917305Z           "evidence": [
2026-08-28T09:54:47.2917553Z             {
2026-08-28T09:54:47.2917877Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.2918155Z               "line": 925
2026-08-28T09:54:47.2918435Z             }
2026-08-28T09:54:47.2918706Z           ]
2026-08-28T09:54:47.2919051Z         },
2026-08-28T09:54:47.2919330Z         "impl": {
2026-08-28T09:54:47.2919616Z           "complete": true,
2026-08-28T09:54:47.2919917Z           "evidence": [
2026-08-28T09:54:47.2920179Z             {
2026-08-28T09:54:47.2920547Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2920828Z               "line": 1374
2026-08-28T09:54:47.2921105Z             },
2026-08-28T09:54:47.2921377Z             {
2026-08-28T09:54:47.2921732Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2922016Z               "line": 1398
2026-08-28T09:54:47.2922288Z             },
2026-08-28T09:54:47.2922555Z             {
2026-08-28T09:54:47.2922903Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2923189Z               "line": 1411
2026-08-28T09:54:47.2923452Z             },
2026-08-28T09:54:47.2923727Z             {
2026-08-28T09:54:47.2924047Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2924399Z               "line": 16859
2026-08-28T09:54:47.2924665Z             },
2026-08-28T09:54:47.2924927Z             {
2026-08-28T09:54:47.2925247Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2925523Z               "line": 18371
2026-08-28T09:54:47.2925794Z             },
2026-08-28T09:54:47.2926061Z             {
2026-08-28T09:54:47.2926395Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2926686Z               "line": 18430
2026-08-28T09:54:47.2926952Z             },
2026-08-28T09:54:47.2927222Z             {
2026-08-28T09:54:47.2927542Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2927875Z               "line": 18448
2026-08-28T09:54:47.2928142Z             }
2026-08-28T09:54:47.2928499Z           ]
2026-08-28T09:54:47.2928781Z         },
2026-08-28T09:54:47.2929195Z         "int": {
2026-08-28T09:54:47.2929486Z           "complete": false,
2026-08-28T09:54:47.2929763Z           "evidence": []
2026-08-28T09:54:47.2930034Z         },
2026-08-28T09:54:47.2930315Z         "unit": {
2026-08-28T09:54:47.2930611Z           "complete": true,
2026-08-28T09:54:47.2930882Z           "evidence": [
2026-08-28T09:54:47.2931149Z             {
2026-08-28T09:54:47.2931511Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2931798Z               "line": 2795
2026-08-28T09:54:47.2932069Z             },
2026-08-28T09:54:47.2932330Z             {
2026-08-28T09:54:47.2932686Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2932968Z               "line": 2830
2026-08-28T09:54:47.2933230Z             },
2026-08-28T09:54:47.2933498Z             {
2026-08-28T09:54:47.2933827Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2934107Z               "line": 37221
2026-08-28T09:54:47.2934378Z             },
2026-08-28T09:54:47.2934646Z             {
2026-08-28T09:54:47.2934959Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2935324Z               "line": 37317
2026-08-28T09:54:47.2935592Z             }
2026-08-28T09:54:47.2935859Z           ]
2026-08-28T09:54:47.2936122Z         }
2026-08-28T09:54:47.2936388Z       }
2026-08-28T09:54:47.2936650Z     },
2026-08-28T09:54:47.2936907Z     {
2026-08-28T09:54:47.2937251Z       "id": "REQ-KNOCK-NOTIFY-INSTIGATOR",
2026-08-28T09:54:47.2971856Z       "title": "THE THREE CONSENTED KNOCK COURTESIES REACH THE PARTY THEY ARE OWED TO -- an approval notifies the KNOCKER, a redemption notifies the code's MINTER, and each is ADDRESSED to that endpoint rather than aimed at whoever the user was last seen at. Field origin (releases#149/#169): lia minted an invite code, it was redeemed, and lia was never told; the notification existed, landed on the right NODE, and could not surface. THREE STRUCTURAL FAULTS IN ONE SHAPE, written the same way at all four producing sites (local approve, cross-node approve, local redeem, cross-node redeem): the recipient rode the `from_id` slot because the row had NO ADDRESSEE FIELD, so the notif said the recipient issued it; the subnet was the empty string, which is not a member subnet, and BOTH surfacing paths walk member subnets only -- `resurface_at_boundary` iterates `policy.subnets` (built from real memberships) and first-fire admits candidates through `policy.visible(id, subnet)`, false for every endpoint at `\"\"` -- so the row was unreachable by construction; and they called `NotifStore::produce_scoped` DIRECTLY, bypassing the daemon's produce-and-fire front door, so nothing was delivered live either. THE FIX IS AN ADDRESSED NOTIF, NOT A LOUDER MISS (doyle Q1, ADR-0046 amendment 2): `NotifRow` grows an optional `to_id` (additive serde, the `SubscribeReq.code` precedent -- an N-1 peer parses an addressed row clean and reads it as unaddressed), honored at BOTH surfacing paths -- first-fire targets the ADDRESSEE and the address BEATS most-recently-active, with NO fallback to the MRA winner (an absent addressee yields NoTarget and the row waits for that endpoint's own next boundary), and a boundary resurface at any OTHER endpoint SKIPS the row with its own outcome rather than a suppression, because `not you` and `not now` are different facts. Merely giving the rows a real subnet was REJECTED as a fix: delivery would stay presence-MRA, so on a 14-endpoint node the approval notice still lands on a bystander. Re-homing the three onto the message spool was rejected too -- they were deliberately put on the notif spool against inbox delivery by the ratified W4 decision, and the spool would silently retire it. ONE PRODUCER FOR ALL FOUR SITES, with a REAL member subnet: the correlation subnet the exchange rode (the member subnet whose registry has seen the peer's node) where one is derivable, else the first member subnet the ADDRESSEE IS VISIBLE IN -- visibility is the condition both surfacing paths impose, so a subnet the recipient is hidden in would reproduce the unreachable row under a nicer name. THE APPROVAL COURTESY IS LIFTED AHEAD OF THE MUTUAL ARM: the cross-node producer sat after the `ReceiptOutcome::Consumed` arm, which only a `--mutual` knocker reaches, so a plain knock's receipt returned `Ignored` and the ORDINARY knocker -- the party who asked, with no other way to learn the answer -- was structurally un-notifiable. It is now produced on every APPROVAL, proven by the outbound knock row THIS node sent (matched on correlation id, the answering endpoint and the handshake-proven origin node) rather than by the pre-authorization, so a receipt matching none of our knocks notifies nobody and a guessed correlation id cannot become a spray channel; a DENIAL still notifies no one, since the ratified set does not extend to it. A REPLAYABLE arrival carries a coalesce key naming the EXCHANGE (`spt-core:knock-answered:<correlation-id>`) and not the kind -- two approvals are two facts and both stand, while two receipts for one knock are one fact said twice, so ADR-0046 decision 2's supersession leaves exactly one LIVE courtesy per knock instead of nagging. Gate: doc -- ADR-0046 amendment 2 stating the addressee, both honoring paths, the member-subnet rule and the lift; impl -- the `to_id` field, column and addressed produce front doors, the addressed first-fire target and the resurface skip, the shared courtesy producer and its subnet chooser, the outbound-knock proof seam, and all four producing sites moved onto it; unit -- per courtesy produce->fire->surface, an addressed row NEVER lands on a bystander (the 14-endpoints-on-a-box case), an absent addressee yields NoTarget rather than the MRA winner, a resurface elsewhere skips and the addressee's own boundary surfaces it, a plain (non-mutual) approval receipt produces the courtesy, a receipt matching no outbound knock produces nothing, and the subnet chooser refuses a subnet the addressee is hidden in.",
2026-08-28T09:54:47.2972512Z       "requiredStages": [
2026-08-28T09:54:47.2972789Z         "doc",
2026-08-28T09:54:47.2973061Z         "impl",
2026-08-28T09:54:47.2973328Z         "unit",
2026-08-28T09:54:47.2973596Z         "int"
2026-08-28T09:54:47.2973858Z       ],
2026-08-28T09:54:47.2974135Z       "stages": {
2026-08-28T09:54:47.2974404Z         "doc": {
2026-08-28T09:54:47.2974693Z           "complete": true,
2026-08-28T09:54:47.2974974Z           "evidence": [
2026-08-28T09:54:47.2975237Z             {
2026-08-28T09:54:47.2975814Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.2976091Z               "line": 175
2026-08-28T09:54:47.2976358Z             }
2026-08-28T09:54:47.2976624Z           ]
2026-08-28T09:54:47.2976896Z         },
2026-08-28T09:54:47.2977172Z         "impl": {
2026-08-28T09:54:47.2977456Z           "complete": true,
2026-08-28T09:54:47.2977728Z           "evidence": [
2026-08-28T09:54:47.2978005Z             {
2026-08-28T09:54:47.2978390Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2978663Z               "line": 72
2026-08-28T09:54:47.2978929Z             },
2026-08-28T09:54:47.2979302Z             {
2026-08-28T09:54:47.2979692Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.2980041Z               "line": 160
2026-08-28T09:54:47.2980309Z             },
2026-08-28T09:54:47.2980585Z             {
2026-08-28T09:54:47.2980971Z               "path": "crates/spt-daemon/src/knocknotif.rs",
2026-08-28T09:54:47.2981248Z               "line": 29
2026-08-28T09:54:47.2981511Z             },
2026-08-28T09:54:47.2981782Z             {
2026-08-28T09:54:47.2982164Z               "path": "crates/spt-daemon/src/knocknotif.rs",
2026-08-28T09:54:47.2982450Z               "line": 46
2026-08-28T09:54:47.2982724Z             },
2026-08-28T09:54:47.2982982Z             {
2026-08-28T09:54:47.2983427Z               "path": "crates/spt-daemon/src/knocknotif.rs",
2026-08-28T09:54:47.2983707Z               "line": 106
2026-08-28T09:54:47.2983978Z             },
2026-08-28T09:54:47.2984241Z             {
2026-08-28T09:54:47.2984594Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.2984879Z               "line": 61
2026-08-28T09:54:47.2985145Z             },
2026-08-28T09:54:47.2985421Z             {
2026-08-28T09:54:47.2985763Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.2986046Z               "line": 330
2026-08-28T09:54:47.2986336Z             },
2026-08-28T09:54:47.2986603Z             {
2026-08-28T09:54:47.2986956Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.2987389Z               "line": 411
2026-08-28T09:54:47.2987685Z             },
2026-08-28T09:54:47.2987947Z             {
2026-08-28T09:54:47.2988302Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.2988579Z               "line": 704
2026-08-28T09:54:47.2988841Z             },
2026-08-28T09:54:47.2989228Z             {
2026-08-28T09:54:47.2989580Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.2989852Z               "line": 750
2026-08-28T09:54:47.2990124Z             },
2026-08-28T09:54:47.2990393Z             {
2026-08-28T09:54:47.2991030Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.2991383Z               "line": 213
2026-08-28T09:54:47.2991640Z             },
2026-08-28T09:54:47.2991898Z             {
2026-08-28T09:54:47.2992260Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.2992542Z               "line": 369
2026-08-28T09:54:47.2992790Z             },
2026-08-28T09:54:47.2993100Z             {
2026-08-28T09:54:47.2993457Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.2993729Z               "line": 1250
2026-08-28T09:54:47.2994086Z             },
2026-08-28T09:54:47.2994349Z             {
2026-08-28T09:54:47.2994711Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.2994988Z               "line": 126
2026-08-28T09:54:47.2995265Z             },
2026-08-28T09:54:47.2995534Z             {
2026-08-28T09:54:47.2995890Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.2996176Z               "line": 222
2026-08-28T09:54:47.2996433Z             },
2026-08-28T09:54:47.2996700Z             {
2026-08-28T09:54:47.2997049Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.2997335Z               "line": 293
2026-08-28T09:54:47.2997606Z             },
2026-08-28T09:54:47.2997869Z             {
2026-08-28T09:54:47.2998194Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.2998473Z               "line": 16860
2026-08-28T09:54:47.2998742Z             }
2026-08-28T09:54:47.2999086Z           ]
2026-08-28T09:54:47.2999352Z         },
2026-08-28T09:54:47.2999619Z         "int": {
2026-08-28T09:54:47.2999920Z           "complete": true,
2026-08-28T09:54:47.3000220Z           "evidence": [
2026-08-28T09:54:47.3000488Z             {
2026-08-28T09:54:47.3000873Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.3001148Z               "line": 1497
2026-08-28T09:54:47.3001415Z             },
2026-08-28T09:54:47.3001677Z             {
2026-08-28T09:54:47.3002053Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.3002406Z               "line": 2745
2026-08-28T09:54:47.3002674Z             },
2026-08-28T09:54:47.3002941Z             {
2026-08-28T09:54:47.3003313Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.3003595Z               "line": 2797
2026-08-28T09:54:47.3003859Z             }
2026-08-28T09:54:47.3004126Z           ]
2026-08-28T09:54:47.3004388Z         },
2026-08-28T09:54:47.3004656Z         "unit": {
2026-08-28T09:54:47.3004942Z           "complete": true,
2026-08-28T09:54:47.3005238Z           "evidence": [
2026-08-28T09:54:47.3005562Z             {
2026-08-28T09:54:47.3005947Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.3006241Z               "line": 469
2026-08-28T09:54:47.3006507Z             },
2026-08-28T09:54:47.3006779Z             {
2026-08-28T09:54:47.3007161Z               "path": "crates/spt-daemon/src/answerop.rs",
2026-08-28T09:54:47.3007447Z               "line": 502
2026-08-28T09:54:47.3007713Z             },
2026-08-28T09:54:47.3007985Z             {
2026-08-28T09:54:47.3008368Z               "path": "crates/spt-daemon/src/knocknotif.rs",
2026-08-28T09:54:47.3008663Z               "line": 180
2026-08-28T09:54:47.3008933Z             },
2026-08-28T09:54:47.3009274Z             {
2026-08-28T09:54:47.3009661Z               "path": "crates/spt-daemon/src/knocknotif.rs",
2026-08-28T09:54:47.3009941Z               "line": 193
2026-08-28T09:54:47.3010208Z             },
2026-08-28T09:54:47.3010471Z             {
2026-08-28T09:54:47.3010867Z               "path": "crates/spt-daemon/src/knocknotif.rs",
2026-08-28T09:54:47.3011153Z               "line": 212
2026-08-28T09:54:47.3011419Z             },
2026-08-28T09:54:47.3011694Z             {
2026-08-28T09:54:47.3012042Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.3012322Z               "line": 943
2026-08-28T09:54:47.3012586Z             },
2026-08-28T09:54:47.3012919Z             {
2026-08-28T09:54:47.3013276Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.3013568Z               "line": 1003
2026-08-28T09:54:47.3013835Z             },
2026-08-28T09:54:47.3014097Z             {
2026-08-28T09:54:47.3014453Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.3014734Z               "line": 1045
2026-08-28T09:54:47.3015001Z             },
2026-08-28T09:54:47.3015259Z             {
2026-08-28T09:54:47.3015640Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3016080Z               "line": 639
2026-08-28T09:54:47.3016351Z             },
2026-08-28T09:54:47.3016621Z             {
2026-08-28T09:54:47.3016976Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3017267Z               "line": 1714
2026-08-28T09:54:47.3017534Z             },
2026-08-28T09:54:47.3017802Z             {
2026-08-28T09:54:47.3018187Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.3018483Z               "line": 735
2026-08-28T09:54:47.3018779Z             },
2026-08-28T09:54:47.3019103Z             {
2026-08-28T09:54:47.3019483Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.3019758Z               "line": 779
2026-08-28T09:54:47.3020026Z             }
2026-08-28T09:54:47.3020288Z           ]
2026-08-28T09:54:47.3020550Z         }
2026-08-28T09:54:47.3020812Z       }
2026-08-28T09:54:47.3021078Z     },
2026-08-28T09:54:47.3021340Z     {
2026-08-28T09:54:47.3021718Z       "id": "REQ-KNOCK-PRESCRIBED-REMEDY-HONORED",
2026-08-28T09:54:47.3045577Z       "title": "A REMEDY THE CLI PRESCRIBES IS ONE THE CLI HONORS. `spt knock list` prints, beside every waiting knock, the command that answers it; running exactly that command from exactly that seat must not then be refused by the approve path. The defect this closes was observed verbatim in the field (releases#66, flynn -> Librarian during the v0.49.0 verify): the listing prescribed `spt knock approve <id> --approve-requested`, and the same binary answered that invocation with `not approved — <surface> stays pending, which only the engine room can answer`. PRESCRIBE-THEN-REFUSE IS THE WORST OF THE THREE AVAILABLE BEHAVIOURS, and the reason is not tidiness: a printed command is read as authoritative — more so than prose, because it is copy-pasteable — so a wrong one spends the operator's trust in the surface that exists to be trusted, and it does so at the moment they are deciding whether to widen access. Refusing with an explanation would be honest; prescribing the honored form would be helpful; prescribing an unhonored form is neither, and it is indistinguishable from the tool being broken. THE FIX IS A SHARED PREDICATE, NOT A SECOND LITERAL. The listing must compose its remedy from THE SAME decision the approve path evaluates, so the two cannot drift apart again — the single-source discipline the surface table already carries for attributability, applied to the prescription. A remedy composed by re-typing what the approve path is believed to do is the same defect one refactor later. WHERE NO INVOCATION FROM THE LISTING SEAT WOULD SUCCEED, THE LISTING SAYS SO AND NAMES THE SEAT THAT CAN ANSWER, rather than printing a command that seat cannot run: the honest arm of a prescription is sometimes 'not by you', and that is information the operator can act on. THE PRESCRIPTION MUST NEVER RECOMMEND A WIDENING THE GRANT DOES NOT REQUIRE. Stated as its own constraint because it is the failure mode a naive reading of the field report produces: telling an operator to add the whole-machine acknowledgment for a grant that binds a single proven sender would trade a confusing refusal for a silent over-grant, which is strictly worse — a refusal costs a round trip, an unnecessary widening costs the access boundary. Gate: impl — the shared answerability predicate and the listing composing its remedy line from it; unit — a knock the listing seat can fully answer prescribes an invocation that the approve path accepts, a knock it cannot fully answer prescribes the form that WOULD succeed or names the seat that can answer instead of printing an unhonored command, no prescription recommends an acknowledgment the grant does not require, and the listing's prescription and the approve path's decision are asserted to be the same predicate rather than two agreeing literals.",
2026-08-28T09:54:47.3046167Z       "requiredStages": [
2026-08-28T09:54:47.3046443Z         "doc",
2026-08-28T09:54:47.3046714Z         "impl",
2026-08-28T09:54:47.3046982Z         "unit"
2026-08-28T09:54:47.3047249Z       ],
2026-08-28T09:54:47.3047683Z       "stages": {
2026-08-28T09:54:47.3047954Z         "doc": {
2026-08-28T09:54:47.3048259Z           "complete": true,
2026-08-28T09:54:47.3048547Z           "evidence": [
2026-08-28T09:54:47.3048806Z             {
2026-08-28T09:54:47.3049295Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.3049577Z               "line": 37
2026-08-28T09:54:47.3049840Z             }
2026-08-28T09:54:47.3050106Z           ]
2026-08-28T09:54:47.3050370Z         },
2026-08-28T09:54:47.3050647Z         "impl": {
2026-08-28T09:54:47.3050937Z           "complete": true,
2026-08-28T09:54:47.3051226Z           "evidence": [
2026-08-28T09:54:47.3051486Z             {
2026-08-28T09:54:47.3051853Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3052134Z               "line": 244
2026-08-28T09:54:47.3052392Z             },
2026-08-28T09:54:47.3052668Z             {
2026-08-28T09:54:47.3053021Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3053321Z               "line": 268
2026-08-28T09:54:47.3053585Z             },
2026-08-28T09:54:47.3053869Z             {
2026-08-28T09:54:47.3054249Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3054530Z               "line": 702
2026-08-28T09:54:47.3054793Z             },
2026-08-28T09:54:47.3055049Z             {
2026-08-28T09:54:47.3055417Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3055683Z               "line": 759
2026-08-28T09:54:47.3056123Z             },
2026-08-28T09:54:47.3056386Z             {
2026-08-28T09:54:47.3056751Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3057032Z               "line": 771
2026-08-28T09:54:47.3057294Z             },
2026-08-28T09:54:47.3057561Z             {
2026-08-28T09:54:47.3057894Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3058181Z               "line": 17049
2026-08-28T09:54:47.3058443Z             },
2026-08-28T09:54:47.3058716Z             {
2026-08-28T09:54:47.3059169Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3059590Z               "line": 17352
2026-08-28T09:54:47.3059856Z             },
2026-08-28T09:54:47.3060132Z             {
2026-08-28T09:54:47.3060466Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3060743Z               "line": 17609
2026-08-28T09:54:47.3061005Z             },
2026-08-28T09:54:47.3061287Z             {
2026-08-28T09:54:47.3061607Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3061886Z               "line": 17687
2026-08-28T09:54:47.3062161Z             },
2026-08-28T09:54:47.3062427Z             {
2026-08-28T09:54:47.3062742Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3063023Z               "line": 17800
2026-08-28T09:54:47.3063290Z             },
2026-08-28T09:54:47.3063567Z             {
2026-08-28T09:54:47.3063881Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3064159Z               "line": 17821
2026-08-28T09:54:47.3064425Z             },
2026-08-28T09:54:47.3064689Z             {
2026-08-28T09:54:47.3065023Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3065299Z               "line": 18008
2026-08-28T09:54:47.3065566Z             },
2026-08-28T09:54:47.3065824Z             {
2026-08-28T09:54:47.3066148Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3066429Z               "line": 18109
2026-08-28T09:54:47.3066763Z             },
2026-08-28T09:54:47.3067035Z             {
2026-08-28T09:54:47.3067364Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3067660Z               "line": 18165
2026-08-28T09:54:47.3067922Z             },
2026-08-28T09:54:47.3068179Z             {
2026-08-28T09:54:47.3068498Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3068779Z               "line": 18558
2026-08-28T09:54:47.3069128Z             }
2026-08-28T09:54:47.3069398Z           ]
2026-08-28T09:54:47.3069673Z         },
2026-08-28T09:54:47.3069997Z         "int": {
2026-08-28T09:54:47.3070297Z           "complete": false,
2026-08-28T09:54:47.3070578Z           "evidence": []
2026-08-28T09:54:47.3070851Z         },
2026-08-28T09:54:47.3071118Z         "unit": {
2026-08-28T09:54:47.3071419Z           "complete": true,
2026-08-28T09:54:47.3071695Z           "evidence": [
2026-08-28T09:54:47.3071966Z             {
2026-08-28T09:54:47.3072327Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3072611Z               "line": 3397
2026-08-28T09:54:47.3073002Z             },
2026-08-28T09:54:47.3073283Z             {
2026-08-28T09:54:47.3073670Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3073956Z               "line": 3630
2026-08-28T09:54:47.3074213Z             },
2026-08-28T09:54:47.3074571Z             {
2026-08-28T09:54:47.3074975Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3075259Z               "line": 3651
2026-08-28T09:54:47.3075525Z             },
2026-08-28T09:54:47.3075797Z             {
2026-08-28T09:54:47.3076174Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3076465Z               "line": 3672
2026-08-28T09:54:47.3076732Z             },
2026-08-28T09:54:47.3076989Z             {
2026-08-28T09:54:47.3077357Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.3077637Z               "line": 3703
2026-08-28T09:54:47.3082107Z             },
2026-08-28T09:54:47.3082407Z             {
2026-08-28T09:54:47.3082863Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3083151Z               "line": 36964
2026-08-28T09:54:47.3083419Z             },
2026-08-28T09:54:47.3083686Z             {
2026-08-28T09:54:47.3084015Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3084302Z               "line": 37534
2026-08-28T09:54:47.3084560Z             }
2026-08-28T09:54:47.3084826Z           ]
2026-08-28T09:54:47.3085093Z         }
2026-08-28T09:54:47.3085473Z       }
2026-08-28T09:54:47.3085910Z     },
2026-08-28T09:54:47.3086283Z     {
2026-08-28T09:54:47.3086725Z       "id": "REQ-KNOCK-PRESCRIBES-FORK-PAIR",
2026-08-28T09:54:47.3103690Z       "title": "THE KNOCK PRESCRIPTION PRESCRIBES THE PAIR WHERE THE PAIR IS NEEDED: when a pending knock asks for `FORK` without `DISCOVER` and the knocker's machine would still be refused `DISCOVER` on the target, `knock list` prescribes `spt knock approve <id> --surfaces FORK,DISCOVER` beside the form line, naming why -- the knocker would be granted an operation it cannot reach. Prescribed ONLY where the binary would otherwise refuse (doyle Q3), from the SAME predicate REQ-ACL-FORK-WITHOUT-DISCOVER-CONSEQUENCE answers, so the two statements about one question cannot drift; the rule an as-requested approval WOULD write is BUILT and handed to that predicate rather than described, which is the shape `approval_form` already established after a hand-written second copy of an approval classifier went stale in the field. IT RIDES BESIDE THE FORM LINE, NEVER REPLACING IT: the form line says what the SEAT must pass for the approval to be honored, this says what the approval must GRANT to be usable, and an operator who pasted the form line and stopped would write the exact grant that filed the request. `--approve-requested` IS NOT TAUGHT TO WIDEN: it means exactly what was asked for, and quietly granting a surface nobody requested would make that flag a liar at every other site that uses it -- so the prescription is an explicit `--surfaces` invocation the operator can read before pasting. Silent when the request already names `DISCOVER`, when it is blanket (which covers every surface), when it names no `FORK`, or when the knocker's machine can already resolve the target. Gate: doc -- the CONTEXT.md fork-pair entry, prescription half; impl -- the prescription composer over the built rule and the shared verdict, and its `knock list` call site below the form line; unit -- a FORK-only knock from a machine that cannot resolve gets the paired invocation with DISCOVER appended, the same knock from a machine that CAN resolve gets nothing, a FORK+DISCOVER request gets nothing, a blanket request gets nothing, and the composed command parses as the approve verb's own `--surfaces` form.",
2026-08-28T09:54:47.3104159Z       "requiredStages": [
2026-08-28T09:54:47.3104425Z         "doc",
2026-08-28T09:54:47.3104697Z         "impl",
2026-08-28T09:54:47.3104963Z         "unit",
2026-08-28T09:54:47.3105231Z         "int"
2026-08-28T09:54:47.3105488Z       ],
2026-08-28T09:54:47.3105770Z       "stages": {
2026-08-28T09:54:47.3106033Z         "doc": {
2026-08-28T09:54:47.3106324Z           "complete": true,
2026-08-28T09:54:47.3106608Z           "evidence": [
2026-08-28T09:54:47.3106862Z             {
2026-08-28T09:54:47.3107187Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.3107482Z               "line": 883
2026-08-28T09:54:47.3107746Z             }
2026-08-28T09:54:47.3108008Z           ]
2026-08-28T09:54:47.3108261Z         },
2026-08-28T09:54:47.3108523Z         "impl": {
2026-08-28T09:54:47.3108823Z           "complete": true,
2026-08-28T09:54:47.3109300Z           "evidence": [
2026-08-28T09:54:47.3109562Z             {
2026-08-28T09:54:47.3109891Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3110177Z               "line": 17659
2026-08-28T09:54:47.3110463Z             },
2026-08-28T09:54:47.3110719Z             {
2026-08-28T09:54:47.3111044Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3111325Z               "line": 17686
2026-08-28T09:54:47.3111667Z             }
2026-08-28T09:54:47.3111927Z           ]
2026-08-28T09:54:47.3112191Z         },
2026-08-28T09:54:47.3112462Z         "int": {
2026-08-28T09:54:47.3112744Z           "complete": true,
2026-08-28T09:54:47.3113025Z           "evidence": [
2026-08-28T09:54:47.3113286Z             {
2026-08-28T09:54:47.3113654Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:47.3113935Z               "line": 891
2026-08-28T09:54:47.3114202Z             }
2026-08-28T09:54:47.3114468Z           ]
2026-08-28T09:54:47.3114729Z         },
2026-08-28T09:54:47.3115058Z         "unit": {
2026-08-28T09:54:47.3115343Z           "complete": true,
2026-08-28T09:54:47.3115630Z           "evidence": [
2026-08-28T09:54:47.3115891Z             {
2026-08-28T09:54:47.3116221Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3116497Z               "line": 35898
2026-08-28T09:54:47.3116778Z             }
2026-08-28T09:54:47.3117044Z           ]
2026-08-28T09:54:47.3117309Z         }
2026-08-28T09:54:47.3117577Z       }
2026-08-28T09:54:47.3117839Z     },
2026-08-28T09:54:47.3118100Z     {
2026-08-28T09:54:47.3118454Z       "id": "REQ-KNOCK-REDEEM-MUTUAL-RECEIPT",
2026-08-28T09:54:47.3138644Z       "title": "VOCABULARY CORRECTED 2026-08-04 (ADR-0055, releases#144): the flag is --send-receive, its retired spelling was --mutual; the requirement itself is UNCHANGED and survives the ratification intact, since redeem is a REQUESTING verb and keeps its directionality declaration. `redeem --send-receive` ARMS THE REDEEMER'S OWN SIDE AND THE NODE-PROVEN `REDEEMED` REPLY CONSUMES IT. Unlike the knock case the receipt ALREADY EXISTS on this route -- the proven reply arrives back at the redeemer -- and is simply not wired to the flag, which is why this is materially cheaper than the answer-receipt build and not covered by it. ADR-0054's governing clause is the spec, verbatim: `--send-receive` stays redeemer-local, consumed once by the node-proven `REDEEMED` reply. As shipped the cross-node route arms NOTHING and refuses with a general rule -- that `--send-receive` arms the minter's side and is set at mint -- WHICH THE LOCAL ROUTE FALSIFIES by arming the redeemer's own side and consuming it in the same invocation: the refusal is keyed on the ROUTE but explains itself on the axis of flag ownership, so it is wrong wherever it is read. THE SUBJECT COMES FROM THE REPLY, NEVER FROM A LOCAL GUESS -- the redeemer holds no code record, so the counterpart identity and the surfaces are exactly what the proven reply carried, which is what the store's already-shipped empty-subject-means-whoever-answered resolution exists for. THE INTENTION IS RECORDED BEFORE THE OUTCOME IS KNOWN, so the three outcomes can be told apart on the record and not merely in a rendering: REDEEMED consumes, REFUSED disarms, and UNCONFIRMED NEITHER -- no proof, no open, and no false close either; the armed record survives the silence and expires with itself rather than being read as an answer. Gate: impl -- the arm on the redeemer's own store ahead of the send, keyed in the CODE keyspace, and the three-way consume/disarm/leave on the outcome; unit -- REDEEMED consumes exactly once and writes the reverse rule naming the subject THE REPLY carried (asserted against a reply whose target differs from anything the redeemer could have guessed locally, so a local-guess implementation fails the row), REFUSED leaves NO armed record, UNCONFIRMED leaves the record ARMED and unconsumed -- the three asserted on one fixture, since any two alone pass an implementation that collapses the third into a neighbour -- and a replayed REDEEMED reply writes the reverse rule no second time. Retirement row: the shipped cross-node refusal message is GONE from every surface that carried it, asserted by rendering the surfaces rather than by reading the source.",
2026-08-28T09:54:47.3139240Z       "requiredStages": [
2026-08-28T09:54:47.3139506Z         "doc",
2026-08-28T09:54:47.3139783Z         "impl",
2026-08-28T09:54:47.3140046Z         "unit",
2026-08-28T09:54:47.3140379Z         "int"
2026-08-28T09:54:47.3140637Z       ],
2026-08-28T09:54:47.3140910Z       "stages": {
2026-08-28T09:54:47.3141184Z         "doc": {
2026-08-28T09:54:47.3141470Z           "complete": true,
2026-08-28T09:54:47.3141751Z           "evidence": [
2026-08-28T09:54:47.3142013Z             {
2026-08-28T09:54:47.3142482Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.3142763Z               "line": 233
2026-08-28T09:54:47.3143029Z             }
2026-08-28T09:54:47.3143295Z           ]
2026-08-28T09:54:47.3143565Z         },
2026-08-28T09:54:47.3143889Z         "impl": {
2026-08-28T09:54:47.3144180Z           "complete": true,
2026-08-28T09:54:47.3144462Z           "evidence": [
2026-08-28T09:54:47.3144720Z             {
2026-08-28T09:54:47.3145077Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3145359Z               "line": 1048
2026-08-28T09:54:47.3145630Z             },
2026-08-28T09:54:47.3145892Z             {
2026-08-28T09:54:47.3146253Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3146536Z               "line": 1440
2026-08-28T09:54:47.3146880Z             },
2026-08-28T09:54:47.3147272Z             {
2026-08-28T09:54:47.3147710Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3147997Z               "line": 1481
2026-08-28T09:54:47.3148264Z             },
2026-08-28T09:54:47.3148527Z             {
2026-08-28T09:54:47.3148849Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3149238Z               "line": 18751
2026-08-28T09:54:47.3149504Z             },
2026-08-28T09:54:47.3149761Z             {
2026-08-28T09:54:47.3150090Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3150367Z               "line": 18872
2026-08-28T09:54:47.3150634Z             },
2026-08-28T09:54:47.3150896Z             {
2026-08-28T09:54:47.3151220Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3151587Z               "line": 19001
2026-08-28T09:54:47.3151860Z             },
2026-08-28T09:54:47.3152141Z             {
2026-08-28T09:54:47.3152464Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3152751Z               "line": 19110
2026-08-28T09:54:47.3153018Z             },
2026-08-28T09:54:47.3153294Z             {
2026-08-28T09:54:47.3153613Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3153903Z               "line": 19126
2026-08-28T09:54:47.3154173Z             },
2026-08-28T09:54:47.3154436Z             {
2026-08-28T09:54:47.3154816Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3155112Z               "line": 19145
2026-08-28T09:54:47.3155380Z             },
2026-08-28T09:54:47.3155651Z             {
2026-08-28T09:54:47.3155990Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3156267Z               "line": 1469
2026-08-28T09:54:47.3156539Z             },
2026-08-28T09:54:47.3156803Z             {
2026-08-28T09:54:47.3157130Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3157522Z               "line": 1552
2026-08-28T09:54:47.3157828Z             }
2026-08-28T09:54:47.3158089Z           ]
2026-08-28T09:54:47.3158346Z         },
2026-08-28T09:54:47.3158599Z         "int": {
2026-08-28T09:54:47.3158881Z           "complete": true,
2026-08-28T09:54:47.3159233Z           "evidence": [
2026-08-28T09:54:47.3159490Z             {
2026-08-28T09:54:47.3159931Z               "path": "crates/spt/tests/knock_mutual_cross_node_e2e.rs",
2026-08-28T09:54:47.3160208Z               "line": 439
2026-08-28T09:54:47.3160470Z             }
2026-08-28T09:54:47.3160733Z           ]
2026-08-28T09:54:47.3160994Z         },
2026-08-28T09:54:47.3161266Z         "unit": {
2026-08-28T09:54:47.3161556Z           "complete": true,
2026-08-28T09:54:47.3161843Z           "evidence": [
2026-08-28T09:54:47.3162114Z             {
2026-08-28T09:54:47.3162466Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3162749Z               "line": 3009
2026-08-28T09:54:47.3163092Z             },
2026-08-28T09:54:47.3163358Z             {
2026-08-28T09:54:47.3163711Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3163997Z               "line": 3075
2026-08-28T09:54:47.3164256Z             },
2026-08-28T09:54:47.3164516Z             {
2026-08-28T09:54:47.3164876Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3165239Z               "line": 3148
2026-08-28T09:54:47.3165521Z             },
2026-08-28T09:54:47.3165835Z             {
2026-08-28T09:54:47.3166150Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3166508Z               "line": 29716
2026-08-28T09:54:47.3166780Z             },
2026-08-28T09:54:47.3167031Z             {
2026-08-28T09:54:47.3167349Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3167629Z               "line": 29764
2026-08-28T09:54:47.3167896Z             }
2026-08-28T09:54:47.3168163Z           ]
2026-08-28T09:54:47.3168421Z         }
2026-08-28T09:54:47.3168692Z       }
2026-08-28T09:54:47.3169041Z     },
2026-08-28T09:54:47.3169308Z     {
2026-08-28T09:54:47.3169637Z       "id": "REQ-KNOCK-REDEEM-SERVE-INTENT",
2026-08-28T09:54:47.3184488Z       "title": "THE SERVE SIDE EXECUTES THE MINT'S STANDING INTENT, NEVER THE NODE-SOVEREIGN LEVER. A redemption arriving over the wire is answered with the authority recorded AT MINT -- owner-agent for an endpoint code, engine room for a node code, both already enforced where the code is minted -- and never `SameNodeUser`: no human is present at a wire redemption, and borrowing the node-sovereign authority would falsify the audit trail by recording a machine's act as a person's. SUBJECT BINDING MIRRORS THE APPROVAL PATH'S OWN SPLIT rather than restating it: an ATTRIBUTABLE surface binds the stamped redeemer as a sender endpoint, a NON-ATTRIBUTABLE one binds the handshake-proven origin NODE -- which is real widening, and therefore `--admit-node` ARRIVES ON `new-code`, is REFUSED for a non-attributable bake without it, PERSISTS on the code record, and is CITED when the redemption executes. That is the mechanism the glossary's 'same widening acknowledgment as an approve' promised and never had. A BARE-TERMINAL REDEEMER binds the narrow node-plus-origin-user subject, exactly as a human's knock does. Gate: doc -- the entry stating whose authority answers a wire redemption and what binds; impl -- the mint-recorded authority, the acknowledgment on the code record and the shared subject split; unit -- an endpoint code answering under owner-agent and a node code under engine-room authority with NEITHER answering under same-node-user, a non-attributable bake refused without the acknowledgment and accepted with it, the acknowledgment surviving a store round trip and being cited at redemption, and an attributable surface binding the redeemer while a non-attributable one binds the node -- the pair asserted together, since either alone passes an implementation that binds everything the same way.",
2026-08-28T09:54:47.3184921Z       "requiredStages": [
2026-08-28T09:54:47.3185193Z         "doc",
2026-08-28T09:54:47.3185465Z         "impl",
2026-08-28T09:54:47.3185732Z         "unit"
2026-08-28T09:54:47.3185996Z       ],
2026-08-28T09:54:47.3186268Z       "stages": {
2026-08-28T09:54:47.3186544Z         "doc": {
2026-08-28T09:54:47.3186830Z           "complete": true,
2026-08-28T09:54:47.3187117Z           "evidence": [
2026-08-28T09:54:47.3187379Z             {
2026-08-28T09:54:47.3187689Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.3187976Z               "line": 915
2026-08-28T09:54:47.3188239Z             }
2026-08-28T09:54:47.3188508Z           ]
2026-08-28T09:54:47.3188768Z         },
2026-08-28T09:54:47.3189130Z         "impl": {
2026-08-28T09:54:47.3189407Z           "complete": true,
2026-08-28T09:54:47.3189712Z           "evidence": [
2026-08-28T09:54:47.3189965Z             {
2026-08-28T09:54:47.3190360Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3190646Z               "line": 49
2026-08-28T09:54:47.3190980Z             },
2026-08-28T09:54:47.3191249Z             {
2026-08-28T09:54:47.3191602Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3191884Z               "line": 464
2026-08-28T09:54:47.3192150Z             },
2026-08-28T09:54:47.3192441Z             {
2026-08-28T09:54:47.3192804Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3193081Z               "line": 632
2026-08-28T09:54:47.3193343Z             },
2026-08-28T09:54:47.3193620Z             {
2026-08-28T09:54:47.3193946Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3194305Z               "line": 16954
2026-08-28T09:54:47.3194571Z             },
2026-08-28T09:54:47.3194829Z             {
2026-08-28T09:54:47.3195153Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3195430Z               "line": 18570
2026-08-28T09:54:47.3195697Z             },
2026-08-28T09:54:47.3196007Z             {
2026-08-28T09:54:47.3196329Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3196614Z               "line": 18675
2026-08-28T09:54:47.3196876Z             },
2026-08-28T09:54:47.3197142Z             {
2026-08-28T09:54:47.3197457Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3197743Z               "line": 18726
2026-08-28T09:54:47.3198001Z             },
2026-08-28T09:54:47.3198263Z             {
2026-08-28T09:54:47.3198588Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3198861Z               "line": 19318
2026-08-28T09:54:47.3199210Z             }
2026-08-28T09:54:47.3199477Z           ]
2026-08-28T09:54:47.3199739Z         },
2026-08-28T09:54:47.3200014Z         "int": {
2026-08-28T09:54:47.3200339Z           "complete": false,
2026-08-28T09:54:47.3200620Z           "evidence": []
2026-08-28T09:54:47.3200887Z         },
2026-08-28T09:54:47.3201158Z         "unit": {
2026-08-28T09:54:47.3201445Z           "complete": true,
2026-08-28T09:54:47.3201800Z           "evidence": [
2026-08-28T09:54:47.3202067Z             {
2026-08-28T09:54:47.3202448Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3202734Z               "line": 745
2026-08-28T09:54:47.3203002Z             },
2026-08-28T09:54:47.3203264Z             {
2026-08-28T09:54:47.3203650Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3203933Z               "line": 1094
2026-08-28T09:54:47.3204194Z             },
2026-08-28T09:54:47.3204463Z             {
2026-08-28T09:54:47.3204889Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3205175Z               "line": 1126
2026-08-28T09:54:47.3205441Z             },
2026-08-28T09:54:47.3205708Z             {
2026-08-28T09:54:47.3206066Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3206343Z               "line": 2379
2026-08-28T09:54:47.3206609Z             },
2026-08-28T09:54:47.3206875Z             {
2026-08-28T09:54:47.3207232Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3207513Z               "line": 2414
2026-08-28T09:54:47.3207785Z             },
2026-08-28T09:54:47.3208037Z             {
2026-08-28T09:54:47.3208371Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3208647Z               "line": 29142
2026-08-28T09:54:47.3208905Z             },
2026-08-28T09:54:47.3209262Z             {
2026-08-28T09:54:47.3209580Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3209855Z               "line": 29309
2026-08-28T09:54:47.3210104Z             },
2026-08-28T09:54:47.3210371Z             {
2026-08-28T09:54:47.3210690Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3210976Z               "line": 29548
2026-08-28T09:54:47.3211243Z             },
2026-08-28T09:54:47.3211500Z             {
2026-08-28T09:54:47.3211824Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3212105Z               "line": 30222
2026-08-28T09:54:47.3212383Z             }
2026-08-28T09:54:47.3212731Z           ]
2026-08-28T09:54:47.3213009Z         }
2026-08-28T09:54:47.3213270Z       }
2026-08-28T09:54:47.3213543Z     },
2026-08-28T09:54:47.3213805Z     {
2026-08-28T09:54:47.3214125Z       "id": "REQ-KNOCK-REDEEM-WIRE",
2026-08-28T09:54:47.3243748Z       "title": "REDEMPTION TRAVELS AS ITS OWN KIND-TAGGED WIRE FAMILY, never a field on `KnockRecord`. Extending the knock record was refused on the record and the reason is the decisive one: UNKNOWN FIELDS DECODE FINE, so an older minter would ACCEPT a redemption as an ordinary knock -- pending in its inbox, no auto-approve, the code unconsumed, a knock-shaped ack returning -- and MISREAD IS WORSE THAN DROPPED. A new kind means an N-1 daemon resolves it to the unknown family and DROPS IT CLEAN, which is the honest failure. THE REDEEMER'S IDENTITY IS DAEMON-STAMPED at the proven-sender tier and never caller-supplied, the same seam the knocker stamp already rests on. THE OUTCOME IS A TRIPLE AND THE THIRD MEMBER IS LOAD-BEARING: REDEEMED (the granted surfaces, the one-directional sentence and the reverse command), REDEEM_REFUSED (ONE anti-oracle message covering unknown, expired, consumed-by-ANOTHER-EXCHANGE AND rate-limited alike -- WHICH budget or which reason a caller exhausted is itself the oracle), and REDEEM_UNCONFIRMED (no answer at all -- an older node or an unreachable one), which must NEVER collapse into refused: silence is not a decision, and a redeemer told 'refused' would stop trying a code that was never seen. THE REDEEMER RENDERS FROM THE REPLY, not from its own store, because redemption executes on the MINTING node and the redeemer holds no code record -- so the granted surfaces, the target and the acknowledgment citation ride the REDEEMED reply, while REFUSED CARRIES NOTHING AT ALL and UNCONFIRMED CLAIMS NOTHING (a refusal carrying a target would be the oracle the single message exists to prevent). THE RATE LIMIT IS THE RECEIVING NODE'S OWN, enforced against its own store and clock, and it SHARES ONE BUCKET with knock arrivals from that origin: both are attempts at the same door. A REPEAT OF THE EXCHANGE THAT ALREADY SPENT THE CODE IS ECHOED, NOT REFUSED (releases#193): the receiving node records WHICH wire exchange consumed each code -- the handshake-proven origin, the stamped redeemer and that presentation's own correlation id, plus the `reverse_requested` its first reply carried, which is the one field a later reply cannot recompute once the due is consumed -- and a presentation matching all three is answered with the SAME REDEEMED payload, reply-only: no second rule, no second minter courtesy, no second monic. This is the promise the seam's replay comment already made -- a replayed REDEEMED finds nothing unconsumed and writes nothing -- and the claim arm contradicted: measured on the two-host ladder, two dispatcher PROCESSES on one node each served one redemption, the winner consumed it and notified the minter, and the LOSER's refusal reached the presenter 88 ms ahead of the winner's REDEEMED -- so a redeemer was told 'nothing was decided and nothing was spent' about a grant written in their own name, which is the misread the outcome triple exists to prevent. The single anti-oracle message is UNCHANGED for every other cause, byte for byte, and the oracle does not widen: an echo requires proof of the exchange, which a guesser holding only the code string does not have. The dispatcher-exclusion half -- why two serve loops can exist at all -- is NOT this requirement's (releases#194). Gate: doc -- the networking entry naming the family, its tag and the outcome triple; impl -- the record, the reply, the classifier arm and the serve side; unit -- the record classifies into its own family and is never read as a message feed, an N-1 receiver drops it clean, the three outcomes are distinct with silence never rendering as refusal, refused and rate-limited emit the IDENTICAL message, and a refused reply carries no target.",
2026-08-28T09:54:47.3244346Z       "requiredStages": [
2026-08-28T09:54:47.3244628Z         "doc",
2026-08-28T09:54:47.3244899Z         "impl",
2026-08-28T09:54:47.3245247Z         "unit"
2026-08-28T09:54:47.3245510Z       ],
2026-08-28T09:54:47.3245795Z       "stages": {
2026-08-28T09:54:47.3246062Z         "doc": {
2026-08-28T09:54:47.3246362Z           "complete": true,
2026-08-28T09:54:47.3246638Z           "evidence": [
2026-08-28T09:54:47.3246911Z             {
2026-08-28T09:54:47.3247220Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.3247497Z               "line": 910
2026-08-28T09:54:47.3247773Z             }
2026-08-28T09:54:47.3248060Z           ]
2026-08-28T09:54:47.3248326Z         },
2026-08-28T09:54:47.3248664Z         "impl": {
2026-08-28T09:54:47.3249040Z           "complete": true,
2026-08-28T09:54:47.3249319Z           "evidence": [
2026-08-28T09:54:47.3249609Z             {
2026-08-28T09:54:47.3249997Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3250273Z               "line": 166
2026-08-28T09:54:47.3250539Z             },
2026-08-28T09:54:47.3250806Z             {
2026-08-28T09:54:47.3251183Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3251465Z               "line": 259
2026-08-28T09:54:47.3251731Z             },
2026-08-28T09:54:47.3251997Z             {
2026-08-28T09:54:47.3252367Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3252654Z               "line": 1085
2026-08-28T09:54:47.3252916Z             },
2026-08-28T09:54:47.3253183Z             {
2026-08-28T09:54:47.3253551Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3253847Z               "line": 1727
2026-08-28T09:54:47.3254109Z             },
2026-08-28T09:54:47.3254378Z             {
2026-08-28T09:54:47.3254748Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3255029Z               "line": 34
2026-08-28T09:54:47.3255301Z             },
2026-08-28T09:54:47.3255568Z             {
2026-08-28T09:54:47.3255945Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3256293Z               "line": 48
2026-08-28T09:54:47.3256565Z             },
2026-08-28T09:54:47.3256836Z             {
2026-08-28T09:54:47.3257212Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3257494Z               "line": 115
2026-08-28T09:54:47.3257761Z             },
2026-08-28T09:54:47.3258028Z             {
2026-08-28T09:54:47.3258410Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3258701Z               "line": 171
2026-08-28T09:54:47.3259063Z             },
2026-08-28T09:54:47.3259396Z             {
2026-08-28T09:54:47.3259774Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3260056Z               "line": 253
2026-08-28T09:54:47.3260327Z             },
2026-08-28T09:54:47.3260591Z             {
2026-08-28T09:54:47.3260966Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3261253Z               "line": 313
2026-08-28T09:54:47.3261568Z             },
2026-08-28T09:54:47.3261840Z             {
2026-08-28T09:54:47.3262212Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3262491Z               "line": 342
2026-08-28T09:54:47.3262751Z             },
2026-08-28T09:54:47.3263013Z             {
2026-08-28T09:54:47.3263361Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.3263642Z               "line": 453
2026-08-28T09:54:47.3263905Z             },
2026-08-28T09:54:47.3264172Z             {
2026-08-28T09:54:47.3264519Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.3264797Z               "line": 486
2026-08-28T09:54:47.3265068Z             },
2026-08-28T09:54:47.3265327Z             {
2026-08-28T09:54:47.3265671Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.3265957Z               "line": 593
2026-08-28T09:54:47.3266228Z             },
2026-08-28T09:54:47.3266491Z             {
2026-08-28T09:54:47.3266872Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3267226Z               "line": 67
2026-08-28T09:54:47.3267492Z             },
2026-08-28T09:54:47.3267763Z             {
2026-08-28T09:54:47.3268139Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3268416Z               "line": 79
2026-08-28T09:54:47.3268679Z             },
2026-08-28T09:54:47.3269017Z             {
2026-08-28T09:54:47.3269412Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3269699Z               "line": 88
2026-08-28T09:54:47.3269975Z             },
2026-08-28T09:54:47.3270236Z             {
2026-08-28T09:54:47.3270677Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3270955Z               "line": 93
2026-08-28T09:54:47.3271226Z             },
2026-08-28T09:54:47.3271484Z             {
2026-08-28T09:54:47.3271879Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3272161Z               "line": 171
2026-08-28T09:54:47.3272429Z             },
2026-08-28T09:54:47.3272696Z             {
2026-08-28T09:54:47.3273051Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3273331Z               "line": 483
2026-08-28T09:54:47.3273597Z             },
2026-08-28T09:54:47.3273868Z             {
2026-08-28T09:54:47.3274231Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3274522Z               "line": 1103
2026-08-28T09:54:47.3274789Z             },
2026-08-28T09:54:47.3275056Z             {
2026-08-28T09:54:47.3275418Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3275698Z               "line": 1608
2026-08-28T09:54:47.3275969Z             },
2026-08-28T09:54:47.3276236Z             {
2026-08-28T09:54:47.3276589Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3276875Z               "line": 1623
2026-08-28T09:54:47.3277136Z             },
2026-08-28T09:54:47.3277408Z             {
2026-08-28T09:54:47.3277791Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3278076Z               "line": 18744
2026-08-28T09:54:47.3278342Z             },
2026-08-28T09:54:47.3278609Z             {
2026-08-28T09:54:47.3278934Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3279305Z               "line": 18923
2026-08-28T09:54:47.3279572Z             },
2026-08-28T09:54:47.3279835Z             {
2026-08-28T09:54:47.3280164Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3280436Z               "line": 18941
2026-08-28T09:54:47.3280706Z             },
2026-08-28T09:54:47.3281033Z             {
2026-08-28T09:54:47.3281376Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3281658Z               "line": 1438
2026-08-28T09:54:47.3281924Z             },
2026-08-28T09:54:47.3282191Z             {
2026-08-28T09:54:47.3282525Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3282821Z               "line": 1633
2026-08-28T09:54:47.3283083Z             },
2026-08-28T09:54:47.3283346Z             {
2026-08-28T09:54:47.3283677Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3283958Z               "line": 1740
2026-08-28T09:54:47.3284225Z             }
2026-08-28T09:54:47.3284486Z           ]
2026-08-28T09:54:47.3284748Z         },
2026-08-28T09:54:47.3285001Z         "int": {
2026-08-28T09:54:47.3285316Z           "complete": false,
2026-08-28T09:54:47.3285594Z           "evidence": []
2026-08-28T09:54:47.3285871Z         },
2026-08-28T09:54:47.3286140Z         "unit": {
2026-08-28T09:54:47.3286428Z           "complete": true,
2026-08-28T09:54:47.3286705Z           "evidence": [
2026-08-28T09:54:47.3286971Z             {
2026-08-28T09:54:47.3287353Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3287625Z               "line": 2429
2026-08-28T09:54:47.3287893Z             },
2026-08-28T09:54:47.3288150Z             {
2026-08-28T09:54:47.3288521Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3288803Z               "line": 2482
2026-08-28T09:54:47.3289255Z             },
2026-08-28T09:54:47.3289522Z             {
2026-08-28T09:54:47.3289952Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3290232Z               "line": 489
2026-08-28T09:54:47.3290499Z             },
2026-08-28T09:54:47.3290761Z             {
2026-08-28T09:54:47.3291128Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3291412Z               "line": 535
2026-08-28T09:54:47.3291675Z             },
2026-08-28T09:54:47.3291941Z             {
2026-08-28T09:54:47.3292309Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3292652Z               "line": 674
2026-08-28T09:54:47.3292919Z             },
2026-08-28T09:54:47.3293187Z             {
2026-08-28T09:54:47.3293558Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3293836Z               "line": 816
2026-08-28T09:54:47.3294104Z             },
2026-08-28T09:54:47.3294374Z             {
2026-08-28T09:54:47.3294751Z               "path": "crates/spt-daemon/src/redeemop.rs",
2026-08-28T09:54:47.3295027Z               "line": 873
2026-08-28T09:54:47.3295290Z             },
2026-08-28T09:54:47.3295552Z             {
2026-08-28T09:54:47.3295919Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.3296200Z               "line": 1970
2026-08-28T09:54:47.3296454Z             },
2026-08-28T09:54:47.3296743Z             {
2026-08-28T09:54:47.3297123Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3297405Z               "line": 269
2026-08-28T09:54:47.3297705Z             },
2026-08-28T09:54:47.3297957Z             {
2026-08-28T09:54:47.3298349Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3298625Z               "line": 291
2026-08-28T09:54:47.3298891Z             },
2026-08-28T09:54:47.3299236Z             {
2026-08-28T09:54:47.3299615Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3299973Z               "line": 313
2026-08-28T09:54:47.3300245Z             },
2026-08-28T09:54:47.3300512Z             {
2026-08-28T09:54:47.3300884Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3301166Z               "line": 353
2026-08-28T09:54:47.3301427Z             },
2026-08-28T09:54:47.3301698Z             {
2026-08-28T09:54:47.3302076Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3302353Z               "line": 424
2026-08-28T09:54:47.3302620Z             },
2026-08-28T09:54:47.3303011Z             {
2026-08-28T09:54:47.3303526Z               "path": "crates/spt-net/src/net/redeemmsg.rs",
2026-08-28T09:54:47.3303813Z               "line": 454
2026-08-28T09:54:47.3304081Z             },
2026-08-28T09:54:47.3304343Z             {
2026-08-28T09:54:47.3304698Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3304982Z               "line": 2601
2026-08-28T09:54:47.3305249Z             },
2026-08-28T09:54:47.3305511Z             {
2026-08-28T09:54:47.3305864Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3306146Z               "line": 2644
2026-08-28T09:54:47.3306417Z             },
2026-08-28T09:54:47.3306690Z             {
2026-08-28T09:54:47.3307024Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3307312Z               "line": 29666
2026-08-28T09:54:47.3307582Z             },
2026-08-28T09:54:47.3307854Z             {
2026-08-28T09:54:47.3308183Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3308459Z               "line": 3046
2026-08-28T09:54:47.3308727Z             }
2026-08-28T09:54:47.3309084Z           ]
2026-08-28T09:54:47.3309346Z         }
2026-08-28T09:54:47.3309609Z       }
2026-08-28T09:54:47.3309872Z     },
2026-08-28T09:54:47.3310132Z     {
2026-08-28T09:54:47.3310471Z       "id": "REQ-KNOCK-UNRESOLVED-REFUSES",
2026-08-28T09:54:47.3333630Z       "title": "A KNOCK THAT RESOLVED NOWHERE REFUSES LOUDLY AND RECORDS NOTHING, and a knock that lands in the sender's OWN inbox says so. Operator-ruled 2026-08-03 (releases#145): if `spt knock` cannot reach endpoints on nodes lacking a DISCOVER rule, it must directly report that it cannot find the endpoint. The defect was one site with two halves. First, the wire leg's NotFound outcome fell through to the LOCAL landing unconditionally, ten lines under a comment naming the exact hazard it then committed — 'a local-only record would leave the operator believing they asked when nobody was told' — so a target that existed on no reachable node was written into the SENDER's own store and reported with the fully positive 'It is waiting in their inbox', exit 0. Field case: ball-b@ENLYZEAM knocked lia@HFENDULEAM and got a positive stdout while lia's node held zero knock rows; both nodes were members of one CLOSED subnet, where endpoint-tier discovery is deny-default BY DESIGN, so resolution NotFounded correctly and the whole defect is the CLI's answer to it. Second, the LOCAL and remote-QUEUED landings rendered an IDENTICAL closing sentence, so the operator could not tell 'their node has it' from 'this machine recorded it in hope'. THE LOCAL LANDING SURVIVES ONLY FOR A TARGET VERIFIED TO EXIST HERE — it exists for a LOCAL endpoint carrying no registry row (unregistered or asleep), and the question that separates that from a target existing nowhere is whether the target is an endpoint on this machine, asked with the same predicate `--for` already asks of the knocker. THE REFUSAL NAMES THE REMEDY THAT ACTUALLY REACHES AN UNDISCOVERABLE ENDPOINT: the knock-code (mint on their machine, redeem here), because in a closed subnet the bare knock is not merely failing, it is the wrong mechanism — and the prescribed invocations must be forms the binary HONORS (REQ-KNOCK-PRESCRIBED-REMEDY-HONORED applies to a refusal's advice exactly as it applies to a listing's). Gate: impl — the landing decision as a PURE classifier over the outcome plus the target's locality, the locality predicate, and one composer rendering every landing's line; unit — a NotFound at a non-local target refuses while a NotFound at a local endpoint still lands, the landing classifier and the wire-refusal renderer partition the outcome enum with no variant covered twice or missed, and the three landing lines are RENDERED and asserted distinct (the identical-sentence half is invisible to any test that does not render); int — the real binary knocking a target that exists nowhere exits nonzero, names KNOCK_NOTFOUND and leaves the store with no row, beside a local endpoint on the same home landing and exiting 0 so the refusal is discriminating rather than a verb that always refuses.",
2026-08-28T09:54:47.3334287Z       "requiredStages": [
2026-08-28T09:54:47.3334563Z         "impl",
2026-08-28T09:54:47.3334836Z         "unit",
2026-08-28T09:54:47.3335103Z         "int"
2026-08-28T09:54:47.3335374Z       ],
2026-08-28T09:54:47.3335640Z       "stages": {
2026-08-28T09:54:47.3335912Z         "doc": {
2026-08-28T09:54:47.3336208Z           "complete": false,
2026-08-28T09:54:47.3336610Z           "evidence": []
2026-08-28T09:54:47.3336996Z         },
2026-08-28T09:54:47.3337388Z         "impl": {
2026-08-28T09:54:47.3337689Z           "complete": true,
2026-08-28T09:54:47.3337965Z           "evidence": [
2026-08-28T09:54:47.3338232Z             {
2026-08-28T09:54:47.3338556Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3338841Z               "line": 17190
2026-08-28T09:54:47.3339205Z             },
2026-08-28T09:54:47.3339472Z             {
2026-08-28T09:54:47.3339796Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3340217Z               "line": 17229
2026-08-28T09:54:47.3340522Z             },
2026-08-28T09:54:47.3340817Z             {
2026-08-28T09:54:47.3341142Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3341418Z               "line": 17259
2026-08-28T09:54:47.3341675Z             },
2026-08-28T09:54:47.3341923Z             {
2026-08-28T09:54:47.3342342Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3342762Z               "line": 17292
2026-08-28T09:54:47.3343091Z             }
2026-08-28T09:54:47.3343377Z           ]
2026-08-28T09:54:47.3343649Z         },
2026-08-28T09:54:47.3343910Z         "int": {
2026-08-28T09:54:47.3344199Z           "complete": true,
2026-08-28T09:54:47.3344485Z           "evidence": [
2026-08-28T09:54:47.3344742Z             {
2026-08-28T09:54:47.3345195Z               "path": "crates/spt/tests/knock_notfound_refuses_e2e.rs",
2026-08-28T09:54:47.3345462Z               "line": 58
2026-08-28T09:54:47.3345725Z             }
2026-08-28T09:54:47.3345992Z           ]
2026-08-28T09:54:47.3346444Z         },
2026-08-28T09:54:47.3346782Z         "unit": {
2026-08-28T09:54:47.3347113Z           "complete": true,
2026-08-28T09:54:47.3347395Z           "evidence": [
2026-08-28T09:54:47.3347653Z             {
2026-08-28T09:54:47.3347977Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3348253Z               "line": 29988
2026-08-28T09:54:47.3348525Z             },
2026-08-28T09:54:47.3348787Z             {
2026-08-28T09:54:47.3349203Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3349525Z               "line": 30014
2026-08-28T09:54:47.3349784Z             },
2026-08-28T09:54:47.3350056Z             {
2026-08-28T09:54:47.3350371Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3350652Z               "line": 30063
2026-08-28T09:54:47.3350915Z             },
2026-08-28T09:54:47.3351187Z             {
2026-08-28T09:54:47.3351506Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3351789Z               "line": 30147
2026-08-28T09:54:47.3352070Z             }
2026-08-28T09:54:47.3352339Z           ]
2026-08-28T09:54:47.3352606Z         }
2026-08-28T09:54:47.3352869Z       }
2026-08-28T09:54:47.3353131Z     },
2026-08-28T09:54:47.3353389Z     {
2026-08-28T09:54:47.3353695Z       "id": "REQ-KNOCK-VERBS",
2026-08-28T09:54:47.3365371Z       "title": "Knocking is one origin-classified verb family under `spt knock ...` — no user-flavored parallel commands and no second namespace. Agent-invoked, the knocker is the session-proven self endpoint and is never caller-supplied; user-invoked from a bare terminal with no perch, the knock requests the deliberately NARROW `subject <invoking-node>, origin user` ('the humans on my node') rather than a bare node entry, so the commonest approval admits humans only, with an explicit flag to knock on behalf of a local endpoint the sending daemon VERIFIES exists. Target-side minting of an invite code is self-sovereign for an endpoint's own agent; the node-target form is engine-room-only. Every form's stdout states plainly what was created, granted or activated — subject, surfaces, scope, expiry — because the grant a user cannot read is the grant they did not mean. Gate: doc — the CONTEXT.md knock-initiation entry and the public CLI reference; impl — the verb family with invocation-time origin classification and the local-endpoint verification; unit — an agent invocation stamps itself and cannot supply another knocker, a bare-terminal invocation produces the narrow node+user subject rather than a bare node subject, an unknown local endpoint is refused at send, and every form's stdout names subject, surfaces and scope.",
2026-08-28T09:54:47.3366005Z       "requiredStages": [
2026-08-28T09:54:47.3366258Z         "doc",
2026-08-28T09:54:47.3366535Z         "impl",
2026-08-28T09:54:47.3366812Z         "unit",
2026-08-28T09:54:47.3367118Z         "int"
2026-08-28T09:54:47.3367408Z       ],
2026-08-28T09:54:47.3367689Z       "stages": {
2026-08-28T09:54:47.3367954Z         "doc": {
2026-08-28T09:54:47.3368243Z           "complete": true,
2026-08-28T09:54:47.3368520Z           "evidence": [
2026-08-28T09:54:47.3368787Z             {
2026-08-28T09:54:47.3369292Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:47.3369568Z               "line": 3
2026-08-28T09:54:47.3369830Z             }
2026-08-28T09:54:47.3370107Z           ]
2026-08-28T09:54:47.3370366Z         },
2026-08-28T09:54:47.3370725Z         "impl": {
2026-08-28T09:54:47.3371015Z           "complete": true,
2026-08-28T09:54:47.3371306Z           "evidence": [
2026-08-28T09:54:47.3371563Z             {
2026-08-28T09:54:47.3371950Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3372227Z               "line": 137
2026-08-28T09:54:47.3372493Z             },
2026-08-28T09:54:47.3372764Z             {
2026-08-28T09:54:47.3373137Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3373426Z               "line": 250
2026-08-28T09:54:47.3373688Z             },
2026-08-28T09:54:47.3374041Z             {
2026-08-28T09:54:47.3374418Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3374709Z               "line": 1079
2026-08-28T09:54:47.3374976Z             },
2026-08-28T09:54:47.3375242Z             {
2026-08-28T09:54:47.3375619Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3375902Z               "line": 1626
2026-08-28T09:54:47.3376175Z             },
2026-08-28T09:54:47.3376437Z             {
2026-08-28T09:54:47.3376785Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.3377072Z               "line": 346
2026-08-28T09:54:47.3377424Z             },
2026-08-28T09:54:47.3377678Z             {
2026-08-28T09:54:47.3378030Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.3378307Z               "line": 623
2026-08-28T09:54:47.3378566Z             },
2026-08-28T09:54:47.3378864Z             {
2026-08-28T09:54:47.3379357Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:47.3379638Z               "line": 55
2026-08-28T09:54:47.3379905Z             },
2026-08-28T09:54:47.3380171Z             {
2026-08-28T09:54:47.3380520Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:47.3380796Z               "line": 208
2026-08-28T09:54:47.3381067Z             },
2026-08-28T09:54:47.3381398Z             {
2026-08-28T09:54:47.3381722Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3382004Z               "line": 2454
2026-08-28T09:54:47.3382276Z             },
2026-08-28T09:54:47.3382548Z             {
2026-08-28T09:54:47.3382867Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3383144Z               "line": 16549
2026-08-28T09:54:47.3383407Z             },
2026-08-28T09:54:47.3383673Z             {
2026-08-28T09:54:47.3383991Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3384272Z               "line": 16563
2026-08-28T09:54:47.3384615Z             },
2026-08-28T09:54:47.3384878Z             {
2026-08-28T09:54:47.3385198Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3385483Z               "line": 16781
2026-08-28T09:54:47.3385793Z             },
2026-08-28T09:54:47.3386043Z             {
2026-08-28T09:54:47.3386355Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3386634Z               "line": 17125
2026-08-28T09:54:47.3386906Z             },
2026-08-28T09:54:47.3387187Z             {
2026-08-28T09:54:47.3387511Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3387788Z               "line": 17320
2026-08-28T09:54:47.3388056Z             },
2026-08-28T09:54:47.3388331Z             {
2026-08-28T09:54:47.3388660Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3389041Z               "line": 17546
2026-08-28T09:54:47.3389316Z             },
2026-08-28T09:54:47.3389593Z             {
2026-08-28T09:54:47.3389907Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3390198Z               "line": 17729
2026-08-28T09:54:47.3390465Z             },
2026-08-28T09:54:47.3390736Z             {
2026-08-28T09:54:47.3391056Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3391333Z               "line": 17763
2026-08-28T09:54:47.3391604Z             },
2026-08-28T09:54:47.3391864Z             {
2026-08-28T09:54:47.3396829Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3397266Z               "line": 18470
2026-08-28T09:54:47.3397533Z             },
2026-08-28T09:54:47.3397795Z             {
2026-08-28T09:54:47.3398272Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3398687Z               "line": 536
2026-08-28T09:54:47.3399127Z             },
2026-08-28T09:54:47.3399399Z             {
2026-08-28T09:54:47.3399749Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3400033Z               "line": 788
2026-08-28T09:54:47.3400295Z             }
2026-08-28T09:54:47.3400566Z           ]
2026-08-28T09:54:47.3400830Z         },
2026-08-28T09:54:47.3401187Z         "int": {
2026-08-28T09:54:47.3401473Z           "complete": true,
2026-08-28T09:54:47.3401759Z           "evidence": [
2026-08-28T09:54:47.3402032Z             {
2026-08-28T09:54:47.3402419Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.3402701Z               "line": 1036
2026-08-28T09:54:47.3402963Z             },
2026-08-28T09:54:47.3403229Z             {
2026-08-28T09:54:47.3403607Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.3403892Z               "line": 2008
2026-08-28T09:54:47.3404149Z             }
2026-08-28T09:54:47.3404417Z           ]
2026-08-28T09:54:47.3404683Z         },
2026-08-28T09:54:47.3404951Z         "unit": {
2026-08-28T09:54:47.3405241Z           "complete": true,
2026-08-28T09:54:47.3405522Z           "evidence": [
2026-08-28T09:54:47.3405789Z             {
2026-08-28T09:54:47.3406166Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.3406442Z               "line": 2304
2026-08-28T09:54:47.3406713Z             },
2026-08-28T09:54:47.3406981Z             {
2026-08-28T09:54:47.3407361Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:47.3407635Z               "line": 141
2026-08-28T09:54:47.3407903Z             },
2026-08-28T09:54:47.3408165Z             {
2026-08-28T09:54:47.3408607Z               "path": "crates/spt-net/src/net/knockmsg.rs",
2026-08-28T09:54:47.3409038Z               "line": 195
2026-08-28T09:54:47.3409401Z             },
2026-08-28T09:54:47.3409668Z             {
2026-08-28T09:54:47.3410030Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3410309Z               "line": 24577
2026-08-28T09:54:47.3410608Z             },
2026-08-28T09:54:47.3410888Z             {
2026-08-28T09:54:47.3411222Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3411528Z               "line": 29934
2026-08-28T09:54:47.3411866Z             },
2026-08-28T09:54:47.3412171Z             {
2026-08-28T09:54:47.3412530Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.3412809Z               "line": 2121
2026-08-28T09:54:47.3413079Z             }
2026-08-28T09:54:47.3413360Z           ]
2026-08-28T09:54:47.3413628Z         }
2026-08-28T09:54:47.3413885Z       }
2026-08-28T09:54:47.3414148Z     },
2026-08-28T09:54:47.3414409Z     {
2026-08-28T09:54:47.3414763Z       "id": "REQ-LIST-JSON-LIVENESS-PARITY",
2026-08-28T09:54:47.3433006Z       "title": "GATEWAY-LIVENESS (flynn field bug 2026-07-09, RCA reader-divergence root): `spt endpoint list` (human) and `endpoint list --json` MUST report an IDENTICAL status for a locally-hosted endpoint — especially a pid-alive, status-ABSENT gateway (no psyche_init). ROOT (todlando RCA STEP-1, doyle-verified): the --json builder (crates/spt/src/cli.rs cmd_endpoint_list) emits each subnet row's status straight from resource_projection (spt-net registry.rs:566, passes instance.status through verbatim :592 — the persisted WAN snapshot, a lagged gossip that can carry a stale/crash-time Suspended) and NEVER applies the self-owned reconcile the human/picker path applies (reconcile_self_owned, crates/spt/src/picker/data.rs:160 via gather_endpoints :112). So a pid-alive self-owned gateway reads Suspended on --json but ONLINE on human (roster::enumerate spt/src/roster.rs:38 -> is_perch_alive pid-fallback spt-store/liveness.rs:136); the adapter suspend-poll (parse_endpoint_status over endpoint list --json --show-all) reads the divergent --json status -> self-suspends a pid-alive gateway. Candidates REFUTED: resource_projection does NOT re-derive liveness (copies instance.status, only skips !routable :582); render is a faithful {:?}. advertised_status (registryhost.rs:822) DOES compute Active via pid-fallback (live advertise fine) — the bug is the READER showing the un-reconciled snapshot. FIX (doyle-ruled): apply the self-owned reconcile in the cli --json builder (SAME spt/picker consumer layer as gather_endpoints, NOT lifted into resource_projection which inverts the dep spt-net->perch), reading LOCAL perch truth (is_perch_alive/unbound -> Active/Offline, mirroring the picker's local_rows). Do NOT force status=online (DEFECT B latent — seed-#5 orphan-listener false-ONLINE risk). Gate: a pid-alive locally-hosted gateway (status-absent, no psyche_init) reads the SAME non-Suspended status on human AND --json. Field-verify flynn (mobile-gw). Kin REQ-PICKER-3 + REQ-PRESENCE-LIVENESS-TRUTH + seed-#5 orphan-listener false-ONLINE.",
2026-08-28T09:54:47.3433563Z       "requiredStages": [
2026-08-28T09:54:47.3433839Z         "impl",
2026-08-28T09:54:47.3434119Z         "int"
2026-08-28T09:54:47.3434381Z       ],
2026-08-28T09:54:47.3434653Z       "stages": {
2026-08-28T09:54:47.3434919Z         "doc": {
2026-08-28T09:54:47.3435210Z           "complete": false,
2026-08-28T09:54:47.3435491Z           "evidence": []
2026-08-28T09:54:47.3435754Z         },
2026-08-28T09:54:47.3436020Z         "impl": {
2026-08-28T09:54:47.3436331Z           "complete": true,
2026-08-28T09:54:47.3436609Z           "evidence": [
2026-08-28T09:54:47.3436878Z             {
2026-08-28T09:54:47.3437207Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3437489Z               "line": 6405
2026-08-28T09:54:47.3437755Z             }
2026-08-28T09:54:47.3438017Z           ]
2026-08-28T09:54:47.3438289Z         },
2026-08-28T09:54:47.3438552Z         "int": {
2026-08-28T09:54:47.3438913Z           "complete": true,
2026-08-28T09:54:47.3439273Z           "evidence": [
2026-08-28T09:54:47.3439536Z             {
2026-08-28T09:54:47.3439992Z               "path": "crates/spt/tests/list_json_liveness_parity_e2e.rs",
2026-08-28T09:54:47.3440274Z               "line": 114
2026-08-28T09:54:47.3440551Z             }
2026-08-28T09:54:47.3440813Z           ]
2026-08-28T09:54:47.3441081Z         },
2026-08-28T09:54:47.3441344Z         "unit": {
2026-08-28T09:54:47.3441648Z           "complete": false,
2026-08-28T09:54:47.3441932Z           "evidence": []
2026-08-28T09:54:47.3442259Z         }
2026-08-28T09:54:47.3442602Z       }
2026-08-28T09:54:47.3442864Z     },
2026-08-28T09:54:47.3443127Z     {
2026-08-28T09:54:47.3443518Z       "id": "REQ-LISTEN-PRESERVES-HOSTING-TOPOLOGY",
2026-08-28T09:54:47.3466275Z       "title": "`api listen` must not ASSERT hosting topology it does not know. (hertz v0.39.0 field RCA 2026-07-21, doyle re-grounded at source.) OBSERVED: the published adapter sequence `api bind` then identity-preserving `api listen --session-id` produces a self-contradictory live record — controlled=true AND controllable=false on a broker-hosted PTY endpoint — which controlled-precedence masks blue while attached and which a DETACH then unmasks as amber HARNESS ONLY. Detach is not the root; it only reveals the bad stamp. SOURCE: api/startup.rs passes controllable=Some(false) UNCONDITIONALLY on the relay/listen path (~191-195, reasoning 'the harness owns the process, so there is no broker PTY'), and establish_perch resolves controllable = controllable.or_else(|| prior…) (~379) — explicit wins, so that Some(false) OVERWRITES the Some(true) an earlier `api bind` EARNED. The carry-forward discipline that protects cwd/adapter/rest_state does not protect this field precisely BECAUSE the listen path is not silent about it. The defect is an ASSUMPTION about hosting authority made by a path that does not know the answer. FIX (preferred): represent LISTENER CUSTODY separately from PTY HOSTING AUTHORITY, so establishing a listener says nothing about who owns the session surface. Merely preserving controllable=true when a broker-hosted session with that session_id exists is weaker — it leaves listen guessing rather than removing the guess. Gate: impl — listen no longer asserts hosting topology for a session it does not host; unit — the stamp resolution table over (prior controllable, listen path, broker-hosted session present); int — bind -> listen -> control -> detach ends at alive=true, controlled=false, controllable=true, display ONLINE. TITLE AMENDMENT 2026-07-27 (doyle ruling, todlando build; rides the build PR per registry-mints-ride-build-PRs): THE REQ PRESERVES A **LIVING** HOSTING ARRANGEMENT ACROSS LISTENER RE-BINDS; IT DOES NOT RESURRECT A DEAD ONE'S CAPABILITY STAMP. FIELD CASE: emphasys rendered ONLINE for 25+ minutes with BOTH recorded pids dead, because its listener-only wake re-bind INHERITED a controllable=Some(true) earned in an earlier broker-PTY life, and the reconcile sweep exempts Some(true) rows from relay-death convergence (livehost.rs) — so an expired capability stamp ROUTED a liveness proof and the row was exempt from EVERY liveness model. The carry-forward is now scoped: Some(true) survives a listener re-bind unless the prior record's RELAY pid is provably Gone. Liveness of the arrangement is judged via the relay-role pid (REQ-PID-ROLE-EVIDENCE), the first record-internal key that actually measures it — NOT via 'earning pid alive', which was falsified pre-build: for a BrokerPty row the record holds no pid of the hosting life at all, only the announcing CLI's.",
2026-08-28T09:54:47.3466861Z       "requiredStages": [
2026-08-28T09:54:47.3467138Z         "impl",
2026-08-28T09:54:47.3467406Z         "unit",
2026-08-28T09:54:47.3467668Z         "int"
2026-08-28T09:54:47.3467936Z       ],
2026-08-28T09:54:47.3468212Z       "stages": {
2026-08-28T09:54:47.3468477Z         "doc": {
2026-08-28T09:54:47.3468772Z           "complete": false,
2026-08-28T09:54:47.3469212Z           "evidence": []
2026-08-28T09:54:47.3469508Z         },
2026-08-28T09:54:47.3469784Z         "impl": {
2026-08-28T09:54:47.3470074Z           "complete": true,
2026-08-28T09:54:47.3470356Z           "evidence": [
2026-08-28T09:54:47.3470674Z             {
2026-08-28T09:54:47.3471212Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.3471488Z               "line": 956
2026-08-28T09:54:47.3471755Z             },
2026-08-28T09:54:47.3472084Z             {
2026-08-28T09:54:47.3472447Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.3472913Z               "line": 690
2026-08-28T09:54:47.3473209Z             },
2026-08-28T09:54:47.3473489Z             {
2026-08-28T09:54:47.3473849Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3474149Z               "line": 233
2026-08-28T09:54:47.3474441Z             },
2026-08-28T09:54:47.3474741Z             {
2026-08-28T09:54:47.3475094Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3475379Z               "line": 690
2026-08-28T09:54:47.3475639Z             }
2026-08-28T09:54:47.3475905Z           ]
2026-08-28T09:54:47.3476227Z         },
2026-08-28T09:54:47.3476487Z         "int": {
2026-08-28T09:54:47.3476787Z           "complete": true,
2026-08-28T09:54:47.3477064Z           "evidence": [
2026-08-28T09:54:47.3477327Z             {
2026-08-28T09:54:47.3477779Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:47.3478056Z               "line": 410
2026-08-28T09:54:47.3478318Z             },
2026-08-28T09:54:47.3478590Z             {
2026-08-28T09:54:47.3479022Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3479309Z               "line": 1413
2026-08-28T09:54:47.3479591Z             },
2026-08-28T09:54:47.3479853Z             {
2026-08-28T09:54:47.3480210Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3480487Z               "line": 1554
2026-08-28T09:54:47.3480764Z             }
2026-08-28T09:54:47.3481037Z           ]
2026-08-28T09:54:47.3481382Z         },
2026-08-28T09:54:47.3481652Z         "unit": {
2026-08-28T09:54:47.3481938Z           "complete": true,
2026-08-28T09:54:47.3482228Z           "evidence": [
2026-08-28T09:54:47.3482491Z             {
2026-08-28T09:54:47.3482857Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.3483135Z               "line": 11243
2026-08-28T09:54:47.3483401Z             },
2026-08-28T09:54:47.3483665Z             {
2026-08-28T09:54:47.3484041Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.3484325Z               "line": 1412
2026-08-28T09:54:47.3484648Z             },
2026-08-28T09:54:47.3484925Z             {
2026-08-28T09:54:47.3485277Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3485559Z               "line": 1254
2026-08-28T09:54:47.3485822Z             },
2026-08-28T09:54:47.3486088Z             {
2026-08-28T09:54:47.3486432Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3486720Z               "line": 1314
2026-08-28T09:54:47.3486990Z             },
2026-08-28T09:54:47.3487257Z             {
2026-08-28T09:54:47.3487614Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3487883Z               "line": 1974
2026-08-28T09:54:47.3488159Z             },
2026-08-28T09:54:47.3488413Z             {
2026-08-28T09:54:47.3488770Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3489183Z               "line": 2028
2026-08-28T09:54:47.3489446Z             }
2026-08-28T09:54:47.3489703Z           ]
2026-08-28T09:54:47.3489965Z         }
2026-08-28T09:54:47.3490250Z       }
2026-08-28T09:54:47.3490508Z     },
2026-08-28T09:54:47.3490775Z     {
2026-08-28T09:54:47.3491133Z       "id": "REQ-LISTEN-SEED-CONSUME-AFTER-BIND",
2026-08-28T09:54:47.3501331Z       "title": "F-034 leg b (perri/hertz field finding 2026-07-09, hertz's HEADLINE): `api listen` must NOT consume the consume-once ephemeral seed on a PRE-BIND refusal — validate (adapter resolvable, home/subnet) and BIND first, THEN consume the seed. ROOT: today `api listen` burns the consume-once seed BEFORE it validates home/subnet, so on a multi-subnet node HOME_REFUSED (needs --subnet) fires AFTER the seed is already gone → the corrected retry (adding --subnet) on the SAME pid hits NO_SEED, a dead end (plausibly ADAPTER_UNRESOLVED burns it the same way). A refusal that never bound must leave the seed intact for the corrected retry. Same EFFECT-BEFORE-IRREVERSIBLE-CONSUME ordering class as F-032 (commune commit-before-delete) — the irreversible consume must follow the successful effect, never precede a refusal. Gate: a pre-bind refusal (HOME_REFUSED on a multi-subnet node without --subnet; ADAPTER_UNRESOLVED) leaves the seed CONSUMABLE — the corrected retry on the same pid binds (no NO_SEED); a SUCCESSFUL bind still consumes the seed exactly once (no double-bind). Files: the api-listen bind path (seed consume ordering). Kin F-032 [[spt-core-findings-backlog]].",
2026-08-28T09:54:47.3501837Z       "requiredStages": [
2026-08-28T09:54:47.3502128Z         "doc",
2026-08-28T09:54:47.3502398Z         "impl",
2026-08-28T09:54:47.3502667Z         "unit",
2026-08-28T09:54:47.3502934Z         "int"
2026-08-28T09:54:47.3503202Z       ],
2026-08-28T09:54:47.3503469Z       "stages": {
2026-08-28T09:54:47.3503746Z         "doc": {
2026-08-28T09:54:47.3504036Z           "complete": true,
2026-08-28T09:54:47.3504316Z           "evidence": [
2026-08-28T09:54:47.3504584Z             {
2026-08-28T09:54:47.3504981Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:47.3505274Z               "line": 113
2026-08-28T09:54:47.3505544Z             }
2026-08-28T09:54:47.3505811Z           ]
2026-08-28T09:54:47.3506074Z         },
2026-08-28T09:54:47.3506346Z         "impl": {
2026-08-28T09:54:47.3506637Z           "complete": true,
2026-08-28T09:54:47.3506922Z           "evidence": [
2026-08-28T09:54:47.3507198Z             {
2026-08-28T09:54:47.3507557Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3507908Z               "line": 147
2026-08-28T09:54:47.3508177Z             },
2026-08-28T09:54:47.3508439Z             {
2026-08-28T09:54:47.3508802Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3509165Z               "line": 410
2026-08-28T09:54:47.3509436Z             }
2026-08-28T09:54:47.3509698Z           ]
2026-08-28T09:54:47.3509946Z         },
2026-08-28T09:54:47.3510210Z         "int": {
2026-08-28T09:54:47.3510506Z           "complete": true,
2026-08-28T09:54:47.3510789Z           "evidence": [
2026-08-28T09:54:47.3511100Z             {
2026-08-28T09:54:47.3511572Z               "path": "crates/spt/tests/listen_seed_retry_e2e.rs",
2026-08-28T09:54:47.3511862Z               "line": 66
2026-08-28T09:54:47.3512135Z             }
2026-08-28T09:54:47.3512393Z           ]
2026-08-28T09:54:47.3512668Z         },
2026-08-28T09:54:47.3512938Z         "unit": {
2026-08-28T09:54:47.3513232Z           "complete": true,
2026-08-28T09:54:47.3513518Z           "evidence": [
2026-08-28T09:54:47.3513786Z             {
2026-08-28T09:54:47.3514138Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3514420Z               "line": 2606
2026-08-28T09:54:47.3514692Z             },
2026-08-28T09:54:47.3514960Z             {
2026-08-28T09:54:47.3515322Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3515599Z               "line": 2922
2026-08-28T09:54:47.3515868Z             },
2026-08-28T09:54:47.3516137Z             {
2026-08-28T09:54:47.3516500Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3516781Z               "line": 3020
2026-08-28T09:54:47.3517048Z             },
2026-08-28T09:54:47.3517429Z             {
2026-08-28T09:54:47.3517783Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3518064Z               "line": 3057
2026-08-28T09:54:47.3518325Z             },
2026-08-28T09:54:47.3518670Z             {
2026-08-28T09:54:47.3519105Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3519391Z               "line": 3089
2026-08-28T09:54:47.3519652Z             }
2026-08-28T09:54:47.3519921Z           ]
2026-08-28T09:54:47.3520187Z         }
2026-08-28T09:54:47.3520446Z       }
2026-08-28T09:54:47.3520718Z     },
2026-08-28T09:54:47.3520975Z     {
2026-08-28T09:54:47.3521326Z       "id": "REQ-LISTEN-SESSION-ID-FALLBACK",
2026-08-28T09:54:47.3532072Z       "title": "F-034 leg c (perri/hertz field finding 2026-07-09): a session that goes live LATE (hours after SessionStart, or after a daemon restart) must still be able to bind — the ephemeral SessionStart seed ('consumed within seconds') is GONE by then and nothing re-fires it until the NEXT SessionStart, so even `api listen --parent-pid <correct claude pid>` hits NO_SEED. Design assumption 're-fired on the next SessionStart if needed' does not hold for long-lived sessions. FIX (perri-recommended, cleanest): `api listen --session-id <sid>` fallback that binds from the session-id when the pid has no live seed — removes the ephemeral-seed dependency entirely (the adapter already knows the sid; the skill passes it, and can then DROP its manual re-seed step). Alternative (option 1, less clean): re-fire the seed on daemon restart. Gate: a session with NO live seed (expired / post-daemon-restart) binds via `listen --session-id <sid>` (no NO_SEED); the sid-bind carries the same identity/auth the seed-bind would (session_id custody — kin REQ-PSYCHE-SID-CUSTODY / the sid-symmetric-auth pattern). Files: api-listen bind path (sid-fallback seam), clap --session-id flag (plain doc-comment). hertz/perri live-verify; if it lands the adapter skill drops the re-seed step.",
2026-08-28T09:54:47.3532540Z       "requiredStages": [
2026-08-28T09:54:47.3532806Z         "doc",
2026-08-28T09:54:47.3533082Z         "impl",
2026-08-28T09:54:47.3533345Z         "unit",
2026-08-28T09:54:47.3533622Z         "int"
2026-08-28T09:54:47.3533880Z       ],
2026-08-28T09:54:47.3534164Z       "stages": {
2026-08-28T09:54:47.3534500Z         "doc": {
2026-08-28T09:54:47.3534845Z           "complete": true,
2026-08-28T09:54:47.3535126Z           "evidence": [
2026-08-28T09:54:47.3535382Z             {
2026-08-28T09:54:47.3535803Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:47.3536084Z               "line": 96
2026-08-28T09:54:47.3536351Z             }
2026-08-28T09:54:47.3536617Z           ]
2026-08-28T09:54:47.3536883Z         },
2026-08-28T09:54:47.3537153Z         "impl": {
2026-08-28T09:54:47.3537454Z           "complete": true,
2026-08-28T09:54:47.3537735Z           "evidence": [
2026-08-28T09:54:47.3538064Z             {
2026-08-28T09:54:47.3538426Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3538745Z               "line": 476
2026-08-28T09:54:47.3539103Z             },
2026-08-28T09:54:47.3539356Z             {
2026-08-28T09:54:47.3539720Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3539997Z               "line": 962
2026-08-28T09:54:47.3540264Z             }
2026-08-28T09:54:47.3540530Z           ]
2026-08-28T09:54:47.3540783Z         },
2026-08-28T09:54:47.3541078Z         "int": {
2026-08-28T09:54:47.3541365Z           "complete": true,
2026-08-28T09:54:47.3541655Z           "evidence": [
2026-08-28T09:54:47.3541913Z             {
2026-08-28T09:54:47.3542374Z               "path": "crates/spt/tests/listen_seed_retry_e2e.rs",
2026-08-28T09:54:47.3542656Z               "line": 166
2026-08-28T09:54:47.3542924Z             }
2026-08-28T09:54:47.3543205Z           ]
2026-08-28T09:54:47.3543467Z         },
2026-08-28T09:54:47.3543739Z         "unit": {
2026-08-28T09:54:47.3544025Z           "complete": true,
2026-08-28T09:54:47.3544310Z           "evidence": [
2026-08-28T09:54:47.3544571Z             {
2026-08-28T09:54:47.3544941Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3545222Z               "line": 2947
2026-08-28T09:54:47.3545556Z             },
2026-08-28T09:54:47.3545833Z             {
2026-08-28T09:54:47.3546190Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3546477Z               "line": 2970
2026-08-28T09:54:47.3546744Z             },
2026-08-28T09:54:47.3547017Z             {
2026-08-28T09:54:47.3547364Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.3547653Z               "line": 2990
2026-08-28T09:54:47.3547913Z             },
2026-08-28T09:54:47.3548184Z             {
2026-08-28T09:54:47.3548504Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3548843Z               "line": 25255
2026-08-28T09:54:47.3549192Z             }
2026-08-28T09:54:47.3549458Z           ]
2026-08-28T09:54:47.3549730Z         }
2026-08-28T09:54:47.3549992Z       }
2026-08-28T09:54:47.3550248Z     },
2026-08-28T09:54:47.3550504Z     {
2026-08-28T09:54:47.3550862Z       "id": "REQ-LIVE-AGENT-NO-INJECT-DELIVERY",
2026-08-28T09:54:47.3572463Z       "title": "F-033 RE-SCOPED (doyle re-ruling 2026-07-10 after the #82 gate falsified the original premise — the hosting-mode class split is BINDING context): 'state:live_agent has a self-delivery reader' CONFLATED two hosting modes. (A) HARNESS-hosted live agents (api listen path) DO deliver via adapter channels only — and are ALREADY structurally excluded from inject: bind_from_seed stamps controllable=Some(false), no broker PTY exists. (B) SPT-HOSTED/CONTROLLED live agents' inject leg IS their delivery reader (broker PTY + translation binary — doyle's own endpoint is field proof: ENDPOINT_INJECT + IDLE_PARKED_DRAIN alongside hook-poll); the original blanket state:live_agent exclusion broke REQ-MSG-IDLE-EDGE-DRAIN + the v0.14.3 LAW on both CI platforms and was REVERTED (predicate stays controllable-gated). perri's adapter-channels-only model (F-dupmsg-adapter-confirm.md) holds for class (A) only — do not re-seed the conflation. The F-033 DUPLICATE mechanism (hook-poll + idle-inject both delivering one row, operator spool row 156) is closed structurally by REQ-CARRIER-CLAIM-EXCLUSIVE's atomic cross-carrier take. REMAINING LEGS OF THIS REQ: (a) unit — a harness-hosted live agent (controllable Some(false)/None, no broker PTY) can never route through try_spt_hosted_inject (evidence may TAG the existing is_spt_hosted_no_relay non-controllable case rather than duplicate it); (b) VERIFICATION (report-before-fix, DELIVERED to doyle 2026-07-10): the no-translation-binary raw payload+CR path is PROVABLY DEAD (broker dispatch_endpoint_input: no-binary -> loud spool, never a PTY write — v0.14.3 holds); the operator's typed-unsubmitted garbage is PINNED to the Layer-2 echo-verify RE-DRIVE (broker.rs inject worker) force-enabled host-wide by ambient SPT_INJECT_VERIFY_ECHO in the daemon's inherited dev-shell env (default-OFF declared capability turned on globally — the F-036 env-inheritance class): a false verify-miss RETYPES the whole sequence into the input field. Fix LANDED on the W4 branch (doyle-accepted echo-scrub 2026-07-10): SPT_INJECT_VERIFY_ECHO/SPT_INJECT_FORCE_ECHO_MISS folded into the W1 daemon-startup env scrub (spt_runtime::INJECT_ECHO_ENV_VARS; startup-only, role-spawn builder untouched so explicit per-spawn declaration stays the production on-switch) — evidence rides REQ-HAZARD-DAEMON-IDENTITY-ENV-SANITIZE (the F-036 class REQ). Residual-class RULED (doyle 2026-07-10): this REQ covers the harness-hosted-never-inject predicate leg (unit) + the echo-scrub itself (impl, dual-tagged) — stages [impl,unit].",
2026-08-28T09:54:47.3573055Z       "requiredStages": [
2026-08-28T09:54:47.3573335Z         "impl",
2026-08-28T09:54:47.3573613Z         "unit"
2026-08-28T09:54:47.3573886Z       ],
2026-08-28T09:54:47.3574165Z       "stages": {
2026-08-28T09:54:47.3574431Z         "doc": {
2026-08-28T09:54:47.3574727Z           "complete": false,
2026-08-28T09:54:47.3575013Z           "evidence": []
2026-08-28T09:54:47.3575285Z         },
2026-08-28T09:54:47.3575552Z         "impl": {
2026-08-28T09:54:47.3575848Z           "complete": true,
2026-08-28T09:54:47.3576195Z           "evidence": [
2026-08-28T09:54:47.3576461Z             {
2026-08-28T09:54:47.3576850Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.3577137Z               "line": 59
2026-08-28T09:54:47.3577404Z             }
2026-08-28T09:54:47.3577691Z           ]
2026-08-28T09:54:47.3578071Z         },
2026-08-28T09:54:47.3578457Z         "int": {
2026-08-28T09:54:47.3578772Z           "complete": false,
2026-08-28T09:54:47.3579138Z           "evidence": []
2026-08-28T09:54:47.3579403Z         },
2026-08-28T09:54:47.3579661Z         "unit": {
2026-08-28T09:54:47.3580043Z           "complete": true,
2026-08-28T09:54:47.3580324Z           "evidence": [
2026-08-28T09:54:47.3580591Z             {
2026-08-28T09:54:47.3580963Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:47.3581240Z               "line": 273
2026-08-28T09:54:47.3581512Z             }
2026-08-28T09:54:47.3581767Z           ]
2026-08-28T09:54:47.3582036Z         }
2026-08-28T09:54:47.3582295Z       }
2026-08-28T09:54:47.3582561Z     },
2026-08-28T09:54:47.3582829Z     {
2026-08-28T09:54:47.3583201Z       "id": "REQ-LIVEHOST-RECONCILE-TRIAL-SILENT",
2026-08-28T09:54:47.3597467Z       "title": "SEED (DEFERRED investigation, doyle 2026-07-09 — UPDATE-WEDGE follow-up): determine WHY the trial/rollback brain's livehost reconcile loop did NOT drive the broker controller-reap (nor re-host the live agents) during the ~30s field update-trial window, when livehost polls `query_live_session_endpoints()` → `brain.sessions()` (KIND_SESSIONS) UNCONDITIONALLY every `LIVE_RECONCILE_INTERVAL_MS`=5000ms (livehost.rs:1026). CONTEXT (surfaced building the counter-54 rig): livehost's 5s KIND_SESSIONS poll drives the SAME broker `reap_dead_controller` sweep the fix drives — so it would otherwise reap the 15s-matured wedge by ~T20 < the 30s trial and SELF-HEAL. It didn't (field froze 30s → rollback), so the field trial-brain livehost was silent/delayed (PIN Q2: no `DAEMON_RESTART_RESUME` under gen-1/gen-2; the 30s kill landed before/around livehost's first reconcile tick). The counter-54 fix (REQ-UPDATE-TRIAL-DRAIN-DRIVE) puts a RELIABLE 500ms reap-driver in run_brain's CORE heartbeat loop, making the wedge-reap INDEPENDENT of livehost — so this does NOT block counter-54. But the livehost silence is a latent anomaly with a SECOND consequence: live-agent HARNESS re-hosting was also delayed ~30s (a separate freeze contributor). Investigate: does `spawn_live_host`'s reconcile thread start promptly on a trial-brain boot, or is its first tick delayed past the trial window? Does its brain conn / `query_live_session_endpoints` block against the swap/wedge state? Register concrete REQ(s) once the mechanism is pinned. RELATED: [[REQ-BRAIN-UPDATE-RESTART-CLEAN-CLOSE]] (if the outgoing brain's black-holed conns perturb the new brain's livehost conn setup).",
2026-08-28T09:54:47.3597981Z       "requiredStages": [],
2026-08-28T09:54:47.3598257Z       "stages": {
2026-08-28T09:54:47.3598525Z         "doc": {
2026-08-28T09:54:47.3598835Z           "complete": false,
2026-08-28T09:54:47.3599220Z           "evidence": []
2026-08-28T09:54:47.3599493Z         },
2026-08-28T09:54:47.3599765Z         "impl": {
2026-08-28T09:54:47.3600056Z           "complete": false,
2026-08-28T09:54:47.3600344Z           "evidence": []
2026-08-28T09:54:47.3600609Z         },
2026-08-28T09:54:47.3600881Z         "int": {
2026-08-28T09:54:47.3601310Z           "complete": false,
2026-08-28T09:54:47.3601620Z           "evidence": []
2026-08-28T09:54:47.3601882Z         },
2026-08-28T09:54:47.3602154Z         "unit": {
2026-08-28T09:54:47.3602454Z           "complete": false,
2026-08-28T09:54:47.3602731Z           "evidence": []
2026-08-28T09:54:47.3602997Z         }
2026-08-28T09:54:47.3603266Z       }
2026-08-28T09:54:47.3603523Z     },
2026-08-28T09:54:47.3603781Z     {
2026-08-28T09:54:47.3604110Z       "id": "REQ-LIVENESS-ORACLE-SOUND",
2026-08-28T09:54:47.3642067Z       "title": "TEARDOWN-AUTHORITY W2 (todlando W1 gate-round-0 finding, doyle-scoped from the LANDED W1 code 2026-07-19): 'does this pid still exist' has ONE answer in spt-core and it is derived from the OS process table. TODAY spt-daemon/src/broker.rs session_is_zombie computes wrapper_alive from spt_store::proc::is_process_alive, which probes OpenProcess on Windows — and OpenProcess keeps SUCCEEDING for a TERMINATED process while any parent holds an open handle, which the broker ALWAYS does (Arc<PtySession>) for every PTY child it spawned. A correctly-reaped harness therefore reads ALIVE, flipping zombie_verdict off its PRIMARY class (Some(false) = dead root + surviving record = always a zombie) onto the conditional arm, which additionally demands adapter_labeled && past_grace && !has_live_descendants. CONSEQUENCE, live today: a dead-root session that is NOT adapter-labeled is claimed LIVE indefinitely — `endpoint run`'s dup-guard refuses ENDPOINT_ALREADY_LIVE over an already-dead tree and cmd_rest's Suspend alive_hint forces from=alive on the same false claim (both via has_live_session_honest, cli.rs:2014 and :3805). REQ-ENDPOINT-CYCLE-HONEST exists to give the cycle verbs ONE liveness authority; after W1 there are TWO and they disagree by construction (teardown.rs::root_provably_gone asks the table and is right; session_is_zombie asks is_process_alive and is wrong). THE DISCRIMINATOR (binding, and it makes the audit checkable rather than 20 judgement calls): is_process_alive is unsound EXACTLY when the ASKER — or a live ancestor — still holds an open HANDLE to the target; dropping a Child closes it, so a spawner that DROPS is honest and one that RETAINS is not. Hence the dangerous shape is asking 'is it GONE' about a process you OWN, and the SAME CALL IS SOUND IN THE CLI AND UNSOUND IN THE DAEMON FOR THE SAME PID — soundness is a property of the asker, not the call. REJECTED ALTERNATIVE, recorded in ADR-0045 Amendment 1 so it is not re-proposed: proc::reap_if_child before the probe fails twice — it is a NO-OP on Windows (#[cfg(windows)] let _ = pid), and decisively the broker holds the handle BY CONSTRUCTION for every pid this predicate is ever asked about, so no handle-based probe can EVER be sound at this site. FIX: (a) add a sound probe as a NAMED SIBLING whose name is the question — process_exists(pid) over process_table() — and state on is_process_alive's own doc which question it answers and which it does not, pointing at the sibling (the behavior was documented VERBATIM in legacy_resident_sweep_e2e.rs since 2026 and never reached proc.rs or zombie_verdict: written where DISCOVERED, not where CONSUMED); (b) route session_is_zombie's wrapper_alive through it, leaving zombie_verdict PURE and UNCHANGED (it was fed a lie, it is not wrong); (c) an EMPTY table is NO KNOWLEDGE — it must resolve to None (zombie_verdict(None) already means 'never guess') and must NEVER manufacture Some(false), which would mass-classify every live session a zombie = the W1 blocker inverted at broker scope; (d) AUDIT, do not mass-migrate, the remaining callers using the discriminator — roster.rs/api/startup.rs/api/auth.rs are already adjudicated SOUND (the asker never spawned the target); cli.rs purge psyche-quiesce is RIGHT ANSWER FOR A FRAGILE REASON (sound only because the CLI asks and the DAEMON spawned the psyche — it goes unsound SILENTLY if that check ever moves into the daemon) and gets a comment naming the asker as what makes it safe; the daemon-side population (livehost.rs, shellhost.rs, shellwake.rs, lifecycle.rs, in-daemon is_perch_alive) is adjudicated one verdict per site (sound/unsound/unreachable), fixing only unsound AND reachable and REPORTING the verdicts even where left — if unsound-and-reachable exceeds a handful, STOP and escalate to doyle rather than widening this wave. Gate: doc — KNOWN-HAZARDS 7.50 + ADR-0045 Amendment 1; impl — process_exists + the caveat on is_process_alive + wrapper_alive routed + the adjudicated fixes; unit — the empty-table arm resolves to None (never Some(false)), a handle-held corpse classifies as a zombie, and zombie_verdict's existing pure table is extended with the previously-unreachable case (dead root + not adapter-labeled + within grace); int — manufacture the REAL handle-held-corpse condition (broker retains a handle to a killed PTY child) and assert the session classifies zombie + the run dup-guard does NOT refuse over it; Windows-only if it cannot be made on Linux, and the test NAME says so.",
2026-08-28T09:54:47.3642902Z       "requiredStages": [
2026-08-28T09:54:47.3643168Z         "doc",
2026-08-28T09:54:47.3643441Z         "impl",
2026-08-28T09:54:47.3643703Z         "unit",
2026-08-28T09:54:47.3643971Z         "int"
2026-08-28T09:54:47.3644238Z       ],
2026-08-28T09:54:47.3644572Z       "stages": {
2026-08-28T09:54:47.3644839Z         "doc": {
2026-08-28T09:54:47.3645142Z           "complete": true,
2026-08-28T09:54:47.3645426Z           "evidence": [
2026-08-28T09:54:47.3645688Z             {
2026-08-28T09:54:47.3646031Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.3646313Z               "line": 821
2026-08-28T09:54:47.3646580Z             }
2026-08-28T09:54:47.3646848Z           ]
2026-08-28T09:54:47.3647115Z         },
2026-08-28T09:54:47.3647401Z         "impl": {
2026-08-28T09:54:47.3647691Z           "complete": true,
2026-08-28T09:54:47.3647976Z           "evidence": [
2026-08-28T09:54:47.3648233Z             {
2026-08-28T09:54:47.3648605Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.3648877Z               "line": 336
2026-08-28T09:54:47.3649234Z             },
2026-08-28T09:54:47.3649497Z             {
2026-08-28T09:54:47.3649917Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.3650335Z               "line": 7997
2026-08-28T09:54:47.3650710Z             },
2026-08-28T09:54:47.3650992Z             {
2026-08-28T09:54:47.3651429Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:47.3651711Z               "line": 564
2026-08-28T09:54:47.3651969Z             },
2026-08-28T09:54:47.3652237Z             {
2026-08-28T09:54:47.3652599Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:47.3652886Z               "line": 247
2026-08-28T09:54:47.3653296Z             },
2026-08-28T09:54:47.3653563Z             {
2026-08-28T09:54:47.3654106Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.3654391Z               "line": 312
2026-08-28T09:54:47.3654664Z             }
2026-08-28T09:54:47.3654926Z           ]
2026-08-28T09:54:47.3655194Z         },
2026-08-28T09:54:47.3655457Z         "int": {
2026-08-28T09:54:47.3655745Z           "complete": true,
2026-08-28T09:54:47.3656024Z           "evidence": [
2026-08-28T09:54:47.3656291Z             {
2026-08-28T09:54:47.3656687Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:47.3657036Z               "line": 420
2026-08-28T09:54:47.3657307Z             }
2026-08-28T09:54:47.3657569Z           ]
2026-08-28T09:54:47.3657846Z         },
2026-08-28T09:54:47.3658108Z         "unit": {
2026-08-28T09:54:47.3658404Z           "complete": true,
2026-08-28T09:54:47.3658690Z           "evidence": [
2026-08-28T09:54:47.3659042Z             {
2026-08-28T09:54:47.3659419Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.3659704Z               "line": 9762
2026-08-28T09:54:47.3659977Z             },
2026-08-28T09:54:47.3660244Z             {
2026-08-28T09:54:47.3660621Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.3660905Z               "line": 9785
2026-08-28T09:54:47.3661165Z             },
2026-08-28T09:54:47.3661450Z             {
2026-08-28T09:54:47.3661799Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.3662080Z               "line": 691
2026-08-28T09:54:47.3662342Z             },
2026-08-28T09:54:47.3662610Z             {
2026-08-28T09:54:47.3662948Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.3663229Z               "line": 731
2026-08-28T09:54:47.3663511Z             },
2026-08-28T09:54:47.3663777Z             {
2026-08-28T09:54:47.3664128Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.3664476Z               "line": 838
2026-08-28T09:54:47.3664748Z             }
2026-08-28T09:54:47.3665010Z           ]
2026-08-28T09:54:47.3665276Z         }
2026-08-28T09:54:47.3665539Z       }
2026-08-28T09:54:47.3665810Z     },
2026-08-28T09:54:47.3666074Z     {
2026-08-28T09:54:47.3666442Z       "id": "REQ-LOCK-TOUCHING-LANE-PROCEDURE",
2026-08-28T09:54:47.3684469Z       "title": "A lane that changes `Cargo.lock` follows a written procedure whose review step reads EDGES, not just the package set. (INFRA-REGISTER IR-4 part 2; hertz 2026-08-03.) THE HUMAN HALF of REQ-CI-LOAD-BEARING-PATCH-PIN: the guard catches a pin that lapsed, and this catches the re-resolve that lapses it — a `cargo update` with no `-p` re-resolves the whole graph, so a one-crate intent ships as an unreviewed graph move. THE SPECIMEN IS IN THIS TREE: at acaaa4f the `[[package]]` SET was identical before and after — no block added, none removed, not one `name`/`version` line in the diff — while EIGHT blocks had their `windows-sys` edge moved from 0.61.2 to 0.59.0 (consumer counts 18→10 and 5→13; both version blocks survive, so even a version-presence check reads clean). The commit message states 'changed one package and left 132 dependencies untouched', which is true of the set and false of the edges: the reviewer who counts blocks is told nothing happened. Hence the rule states BOTH reads as separate steps, because the cheap one alone is the one that lies. TOOLCHAIN DRIFT IS THE OTHER READING of a surprising diff — two resolutions of the same manifests that disagree are evidence about the resolvers, not about the dependencies, so the procedure sends the author to the golden toolchain-version print (REQ-CI-TOOLCHAIN-VERSION-PRINT) before shipping either lock rather than picking the diff they like. A HAND-EDITED LOCK IS ALLOWED and given a mechanical acceptance test — `cargo check --workspace --locked` — where `--locked` is the load-bearing half: without it cargo silently repairs the file it was asked to verify, which is the same class as running `cargo run` against a build-file mutation you are trying to measure. Gate: doc = the `Lock-touching lanes` section of docs/GOLDEN-CI.md (targeted update, the two-read review with its specimen, the drift stop-condition, the `--locked` acceptance test, and the `xtask check` pin guard as the lane's own preflight). Kin REQ-CI-LOAD-BEARING-PATCH-PIN (mechanical half), REQ-CI-TOOLCHAIN-VERSION-PRINT (the comparison this procedure sends you to).",
2026-08-28T09:54:47.3684982Z       "requiredStages": [
2026-08-28T09:54:47.3685253Z         "doc"
2026-08-28T09:54:47.3685520Z       ],
2026-08-28T09:54:47.3685845Z       "stages": {
2026-08-28T09:54:47.3686111Z         "doc": {
2026-08-28T09:54:47.3686402Z           "complete": true,
2026-08-28T09:54:47.3686692Z           "evidence": [
2026-08-28T09:54:47.3686949Z             {
2026-08-28T09:54:47.3687269Z               "path": "docs/GOLDEN-CI.md",
2026-08-28T09:54:47.3687548Z               "line": 99
2026-08-28T09:54:47.3687820Z             }
2026-08-28T09:54:47.3688077Z           ]
2026-08-28T09:54:47.3688334Z         },
2026-08-28T09:54:47.3688596Z         "impl": {
2026-08-28T09:54:47.3688897Z           "complete": false,
2026-08-28T09:54:47.3689779Z           "evidence": []
2026-08-28T09:54:47.3690427Z         },
2026-08-28T09:54:47.3690994Z         "int": {
2026-08-28T09:54:47.3691610Z           "complete": false,
2026-08-28T09:54:47.3692292Z           "evidence": []
2026-08-28T09:54:47.3692951Z         },
2026-08-28T09:54:47.3693523Z         "unit": {
2026-08-28T09:54:47.3694148Z           "complete": false,
2026-08-28T09:54:47.3694859Z           "evidence": []
2026-08-28T09:54:47.3695514Z         }
2026-08-28T09:54:47.3696209Z       }
2026-08-28T09:54:47.3697020Z     },
2026-08-28T09:54:47.3697838Z     {
2026-08-28T09:54:47.3698594Z       "id": "REQ-MANIFEST-1",
2026-08-28T09:54:47.3699744Z       "title": "Per-adapter manifest with adapter_name and min_spt_core_version",
2026-08-28T09:54:47.3700992Z       "requiredStages": [
2026-08-28T09:54:47.3701659Z         "doc",
2026-08-28T09:54:47.3702556Z         "impl",
2026-08-28T09:54:47.3703179Z         "unit"
2026-08-28T09:54:47.3703773Z       ],
2026-08-28T09:54:47.3704340Z       "stages": {
2026-08-28T09:54:47.3704945Z         "doc": {
2026-08-28T09:54:47.3705566Z           "complete": true,
2026-08-28T09:54:47.3706248Z           "evidence": [
2026-08-28T09:54:47.3706887Z             {
2026-08-28T09:54:47.3707512Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.3708295Z               "line": 19
2026-08-28T09:54:47.3709202Z             }
2026-08-28T09:54:47.3709885Z           ]
2026-08-28T09:54:47.3710452Z         },
2026-08-28T09:54:47.3711014Z         "impl": {
2026-08-28T09:54:47.3711642Z           "complete": true,
2026-08-28T09:54:47.3712333Z           "evidence": [
2026-08-28T09:54:47.3712972Z             {
2026-08-28T09:54:47.3713682Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3714547Z               "line": 18
2026-08-28T09:54:47.3715200Z             }
2026-08-28T09:54:47.3715783Z           ]
2026-08-28T09:54:47.3716354Z         },
2026-08-28T09:54:47.3716924Z         "int": {
2026-08-28T09:54:47.3717539Z           "complete": false,
2026-08-28T09:54:47.3718249Z           "evidence": []
2026-08-28T09:54:47.3718898Z         },
2026-08-28T09:54:47.3719558Z         "unit": {
2026-08-28T09:54:47.3720177Z           "complete": true,
2026-08-28T09:54:47.3720864Z           "evidence": [
2026-08-28T09:54:47.3721497Z             {
2026-08-28T09:54:47.3722197Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3723075Z               "line": 1537
2026-08-28T09:54:47.3723751Z             },
2026-08-28T09:54:47.3724331Z             {
2026-08-28T09:54:47.3725026Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3725895Z               "line": 2012
2026-08-28T09:54:47.3726539Z             },
2026-08-28T09:54:47.3727128Z             {
2026-08-28T09:54:47.3727818Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3728890Z               "line": 2024
2026-08-28T09:54:47.3729652Z             },
2026-08-28T09:54:47.3730226Z             {
2026-08-28T09:54:47.3730918Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3731819Z               "line": 2035
2026-08-28T09:54:47.3732471Z             },
2026-08-28T09:54:47.3733053Z             {
2026-08-28T09:54:47.3733744Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3734626Z               "line": 2052
2026-08-28T09:54:47.3735262Z             },
2026-08-28T09:54:47.3735839Z             {
2026-08-28T09:54:47.3736621Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3737493Z               "line": 2066
2026-08-28T09:54:47.3738148Z             },
2026-08-28T09:54:47.3738735Z             {
2026-08-28T09:54:47.3739526Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3740382Z               "line": 2182
2026-08-28T09:54:47.3741026Z             },
2026-08-28T09:54:47.3741650Z             {
2026-08-28T09:54:47.3742351Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3743308Z               "line": 2197
2026-08-28T09:54:47.3743966Z             },
2026-08-28T09:54:47.3744558Z             {
2026-08-28T09:54:47.3745258Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3746128Z               "line": 2348
2026-08-28T09:54:47.3746791Z             },
2026-08-28T09:54:47.3747377Z             {
2026-08-28T09:54:47.3748072Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3753625Z               "line": 2359
2026-08-28T09:54:47.3754355Z             }
2026-08-28T09:54:47.3754937Z           ]
2026-08-28T09:54:47.3755503Z         }
2026-08-28T09:54:47.3756064Z       }
2026-08-28T09:54:47.3756622Z     },
2026-08-28T09:54:47.3757170Z     {
2026-08-28T09:54:47.3757765Z       "id": "REQ-MANIFEST-2",
2026-08-28T09:54:47.3759918Z       "title": "Adapter profiles — sparse leaf-replace overlays (shipped + local), composite <adapter>:<profile> addressing, shadow-refusal, tighten-only consent floors",
2026-08-28T09:54:47.3761807Z       "requiredStages": [
2026-08-28T09:54:47.3762479Z         "doc",
2026-08-28T09:54:47.3763066Z         "impl",
2026-08-28T09:54:47.3763662Z         "unit"
2026-08-28T09:54:47.3764233Z       ],
2026-08-28T09:54:47.3764790Z       "stages": {
2026-08-28T09:54:47.3765396Z         "doc": {
2026-08-28T09:54:47.3766016Z           "complete": true,
2026-08-28T09:54:47.3766704Z           "evidence": [
2026-08-28T09:54:47.3767420Z             {
2026-08-28T09:54:47.3768049Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.3768775Z               "line": 78
2026-08-28T09:54:47.3769510Z             }
2026-08-28T09:54:47.3770091Z           ]
2026-08-28T09:54:47.3770659Z         },
2026-08-28T09:54:47.3771226Z         "impl": {
2026-08-28T09:54:47.3771854Z           "complete": true,
2026-08-28T09:54:47.3772724Z           "evidence": [
2026-08-28T09:54:47.3773359Z             {
2026-08-28T09:54:47.3774070Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3774965Z               "line": 94
2026-08-28T09:54:47.3775604Z             },
2026-08-28T09:54:47.3776185Z             {
2026-08-28T09:54:47.3776877Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3777775Z               "line": 15
2026-08-28T09:54:47.3778414Z             },
2026-08-28T09:54:47.3779081Z             {
2026-08-28T09:54:47.3779800Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3780661Z               "line": 82
2026-08-28T09:54:47.3781310Z             },
2026-08-28T09:54:47.3781892Z             {
2026-08-28T09:54:47.3782581Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3783457Z               "line": 100
2026-08-28T09:54:47.3784106Z             },
2026-08-28T09:54:47.3784693Z             {
2026-08-28T09:54:47.3785377Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3786351Z               "line": 200
2026-08-28T09:54:47.3786985Z             },
2026-08-28T09:54:47.3787569Z             {
2026-08-28T09:54:47.3788264Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3789228Z               "line": 588
2026-08-28T09:54:47.3789881Z             },
2026-08-28T09:54:47.3790460Z             {
2026-08-28T09:54:47.3791141Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3792013Z               "line": 614
2026-08-28T09:54:47.3792667Z             },
2026-08-28T09:54:47.3793248Z             {
2026-08-28T09:54:47.3794022Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3794894Z               "line": 768
2026-08-28T09:54:47.3795558Z             },
2026-08-28T09:54:47.3796142Z             {
2026-08-28T09:54:47.3796839Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3797711Z               "line": 793
2026-08-28T09:54:47.3798361Z             },
2026-08-28T09:54:47.3799019Z             {
2026-08-28T09:54:47.3799705Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3800569Z               "line": 816
2026-08-28T09:54:47.3801214Z             },
2026-08-28T09:54:47.3801787Z             {
2026-08-28T09:54:47.3802478Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3803341Z               "line": 831
2026-08-28T09:54:47.3803982Z             },
2026-08-28T09:54:47.3804559Z             {
2026-08-28T09:54:47.3805207Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3806012Z               "line": 20548
2026-08-28T09:54:47.3806683Z             },
2026-08-28T09:54:47.3807266Z             {
2026-08-28T09:54:47.3807894Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3808704Z               "line": 20562
2026-08-28T09:54:47.3809441Z             },
2026-08-28T09:54:47.3810024Z             {
2026-08-28T09:54:47.3810728Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3811552Z               "line": 20596
2026-08-28T09:54:47.3812222Z             }
2026-08-28T09:54:47.3812803Z           ]
2026-08-28T09:54:47.3813362Z         },
2026-08-28T09:54:47.3813930Z         "int": {
2026-08-28T09:54:47.3814547Z           "complete": false,
2026-08-28T09:54:47.3815247Z           "evidence": []
2026-08-28T09:54:47.3815895Z         },
2026-08-28T09:54:47.3816468Z         "unit": {
2026-08-28T09:54:47.3817092Z           "complete": true,
2026-08-28T09:54:47.3817787Z           "evidence": [
2026-08-28T09:54:47.3818489Z             {
2026-08-28T09:54:47.3819279Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.3820148Z               "line": 1794
2026-08-28T09:54:47.3820792Z             },
2026-08-28T09:54:47.3821379Z             {
2026-08-28T09:54:47.3822112Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3822977Z               "line": 228
2026-08-28T09:54:47.3823631Z             },
2026-08-28T09:54:47.3824381Z             {
2026-08-28T09:54:47.3825087Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3825969Z               "line": 289
2026-08-28T09:54:47.3826623Z             },
2026-08-28T09:54:47.3827194Z             {
2026-08-28T09:54:47.3827875Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3828738Z               "line": 330
2026-08-28T09:54:47.3829592Z             },
2026-08-28T09:54:47.3830170Z             {
2026-08-28T09:54:47.3830872Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3831773Z               "line": 342
2026-08-28T09:54:47.3832412Z             },
2026-08-28T09:54:47.3832994Z             {
2026-08-28T09:54:47.3833677Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3834529Z               "line": 353
2026-08-28T09:54:47.3835287Z             },
2026-08-28T09:54:47.3835944Z             {
2026-08-28T09:54:47.3836625Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3837630Z               "line": 362
2026-08-28T09:54:47.3838279Z             },
2026-08-28T09:54:47.3838846Z             {
2026-08-28T09:54:47.3839599Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3840465Z               "line": 378
2026-08-28T09:54:47.3841098Z             },
2026-08-28T09:54:47.3841680Z             {
2026-08-28T09:54:47.3842362Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3843299Z               "line": 461
2026-08-28T09:54:47.3843946Z             },
2026-08-28T09:54:47.3844537Z             {
2026-08-28T09:54:47.3845291Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3846159Z               "line": 1167
2026-08-28T09:54:47.3846828Z             },
2026-08-28T09:54:47.3847414Z             {
2026-08-28T09:54:47.3848106Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3849077Z               "line": 1191
2026-08-28T09:54:47.3849721Z             },
2026-08-28T09:54:47.3850313Z             {
2026-08-28T09:54:47.3851007Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3851891Z               "line": 1217
2026-08-28T09:54:47.3852560Z             },
2026-08-28T09:54:47.3853146Z             {
2026-08-28T09:54:47.3853846Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3854720Z               "line": 1236
2026-08-28T09:54:47.3855378Z             },
2026-08-28T09:54:47.3855956Z             {
2026-08-28T09:54:47.3856653Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3857521Z               "line": 1267
2026-08-28T09:54:47.3858170Z             },
2026-08-28T09:54:47.3858756Z             {
2026-08-28T09:54:47.3859531Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:47.3860400Z               "line": 592
2026-08-28T09:54:47.3861053Z             },
2026-08-28T09:54:47.3861646Z             {
2026-08-28T09:54:47.3862346Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:47.3863172Z               "line": 1018
2026-08-28T09:54:47.3863835Z             },
2026-08-28T09:54:47.3864425Z             {
2026-08-28T09:54:47.3865062Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3865862Z               "line": 31672
2026-08-28T09:54:47.3866516Z             },
2026-08-28T09:54:47.3867123Z             {
2026-08-28T09:54:47.3867752Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3868568Z               "line": 32758
2026-08-28T09:54:47.3869378Z             }
2026-08-28T09:54:47.3869955Z           ]
2026-08-28T09:54:47.3870522Z         }
2026-08-28T09:54:47.3871079Z       }
2026-08-28T09:54:47.3871646Z     },
2026-08-28T09:54:47.3872206Z     {
2026-08-28T09:54:47.3872802Z       "id": "REQ-MANIFEST-3",
2026-08-28T09:54:47.3875135Z       "title": "Adapter strings — [strings] KV tree, dot-path get-string resolving through the profile leaf-replace overlay, set-string editing a local profile's [strings] only; data-only (nothing executes a string)",
2026-08-28T09:54:47.3877380Z       "requiredStages": [
2026-08-28T09:54:47.3878031Z         "doc",
2026-08-28T09:54:47.3878608Z         "impl",
2026-08-28T09:54:47.3879280Z         "unit"
2026-08-28T09:54:47.3879862Z       ],
2026-08-28T09:54:47.3880423Z       "stages": {
2026-08-28T09:54:47.3881025Z         "doc": {
2026-08-28T09:54:47.3881630Z           "complete": true,
2026-08-28T09:54:47.3882308Z           "evidence": [
2026-08-28T09:54:47.3882938Z             {
2026-08-28T09:54:47.3883557Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.3884307Z               "line": 84
2026-08-28T09:54:47.3884946Z             }
2026-08-28T09:54:47.3885521Z           ]
2026-08-28T09:54:47.3886081Z         },
2026-08-28T09:54:47.3886653Z         "impl": {
2026-08-28T09:54:47.3887278Z           "complete": true,
2026-08-28T09:54:47.3887968Z           "evidence": [
2026-08-28T09:54:47.3888600Z             {
2026-08-28T09:54:47.3889397Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3890347Z               "line": 104
2026-08-28T09:54:47.3891013Z             },
2026-08-28T09:54:47.3891590Z             {
2026-08-28T09:54:47.3892272Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3893147Z               "line": 118
2026-08-28T09:54:47.3893803Z             },
2026-08-28T09:54:47.3894384Z             {
2026-08-28T09:54:47.3895071Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3895957Z               "line": 149
2026-08-28T09:54:47.3896603Z             },
2026-08-28T09:54:47.3897190Z             {
2026-08-28T09:54:47.3897934Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3898836Z               "line": 638
2026-08-28T09:54:47.3899600Z             },
2026-08-28T09:54:47.3900190Z             {
2026-08-28T09:54:47.3900883Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3902039Z               "line": 730
2026-08-28T09:54:47.3902721Z             },
2026-08-28T09:54:47.3903308Z             {
2026-08-28T09:54:47.3903953Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3904750Z               "line": 20611
2026-08-28T09:54:47.3905379Z             },
2026-08-28T09:54:47.3905947Z             {
2026-08-28T09:54:47.3906574Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3907383Z               "line": 20659
2026-08-28T09:54:47.3908060Z             }
2026-08-28T09:54:47.3908619Z           ]
2026-08-28T09:54:47.3909275Z         },
2026-08-28T09:54:47.3909835Z         "int": {
2026-08-28T09:54:47.3910446Z           "complete": false,
2026-08-28T09:54:47.3911143Z           "evidence": []
2026-08-28T09:54:47.3911787Z         },
2026-08-28T09:54:47.3912351Z         "unit": {
2026-08-28T09:54:47.3912966Z           "complete": true,
2026-08-28T09:54:47.3913635Z           "evidence": [
2026-08-28T09:54:47.3914267Z             {
2026-08-28T09:54:47.3914967Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3915935Z               "line": 388
2026-08-28T09:54:47.3916579Z             },
2026-08-28T09:54:47.3917173Z             {
2026-08-28T09:54:47.3917877Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.3918735Z               "line": 446
2026-08-28T09:54:47.3919470Z             },
2026-08-28T09:54:47.3920057Z             {
2026-08-28T09:54:47.3920749Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.3921616Z               "line": 1291
2026-08-28T09:54:47.3922361Z             },
2026-08-28T09:54:47.3922945Z             {
2026-08-28T09:54:47.3923580Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.3924394Z               "line": 31765
2026-08-28T09:54:47.3925054Z             }
2026-08-28T09:54:47.3925641Z           ]
2026-08-28T09:54:47.3926204Z         }
2026-08-28T09:54:47.3926757Z       }
2026-08-28T09:54:47.3927310Z     },
2026-08-28T09:54:47.3927870Z     {
2026-08-28T09:54:47.3928461Z       "id": "REQ-MANIFEST-4",
2026-08-28T09:54:47.3931070Z       "title": "Keyword hints — [[hints]] {keywords (literal/regex), text}; spt api hint --session emits at most one matched hint per message, once per session (seen-set), declaration-order first match; profiles overlay [[hints]] by leaf-replace",
2026-08-28T09:54:47.3933564Z       "requiredStages": [
2026-08-28T09:54:47.3934231Z         "doc",
2026-08-28T09:54:47.3934818Z         "impl",
2026-08-28T09:54:47.3935402Z         "unit"
2026-08-28T09:54:47.3935967Z       ],
2026-08-28T09:54:47.3936526Z       "stages": {
2026-08-28T09:54:47.3937140Z         "doc": {
2026-08-28T09:54:47.3937751Z           "complete": true,
2026-08-28T09:54:47.3938444Z           "evidence": [
2026-08-28T09:54:47.3939158Z             {
2026-08-28T09:54:47.3939774Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.3940514Z               "line": 95
2026-08-28T09:54:47.3941153Z             }
2026-08-28T09:54:47.3941748Z           ]
2026-08-28T09:54:47.3942383Z         },
2026-08-28T09:54:47.3943003Z         "impl": {
2026-08-28T09:54:47.3943698Z           "complete": true,
2026-08-28T09:54:47.3944386Z           "evidence": [
2026-08-28T09:54:47.3945020Z             {
2026-08-28T09:54:47.3945722Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3946589Z               "line": 112
2026-08-28T09:54:47.3947243Z             },
2026-08-28T09:54:47.3947824Z             {
2026-08-28T09:54:47.3948522Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3949475Z               "line": 291
2026-08-28T09:54:47.3950129Z             },
2026-08-28T09:54:47.3950706Z             {
2026-08-28T09:54:47.3951454Z               "path": "crates/spt-store/src/matchrule.rs",
2026-08-28T09:54:47.3952328Z               "line": 28
2026-08-28T09:54:47.3953040Z             },
2026-08-28T09:54:47.3953926Z             {
2026-08-28T09:54:47.3954601Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:47.3955446Z               "line": 121
2026-08-28T09:54:47.3956099Z             },
2026-08-28T09:54:47.3956688Z             {
2026-08-28T09:54:47.3957373Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.3958219Z               "line": 974
2026-08-28T09:54:47.3958867Z             },
2026-08-28T09:54:47.3959546Z             {
2026-08-28T09:54:47.3960231Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.3961090Z               "line": 999
2026-08-28T09:54:47.3961716Z             }
2026-08-28T09:54:47.3962393Z           ]
2026-08-28T09:54:47.3963017Z         },
2026-08-28T09:54:47.3963595Z         "int": {
2026-08-28T09:54:47.3964201Z           "complete": false,
2026-08-28T09:54:47.3964891Z           "evidence": []
2026-08-28T09:54:47.3965535Z         },
2026-08-28T09:54:47.3966091Z         "unit": {
2026-08-28T09:54:47.3966702Z           "complete": true,
2026-08-28T09:54:47.3967385Z           "evidence": [
2026-08-28T09:54:47.3968014Z             {
2026-08-28T09:54:47.3968807Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3969826Z               "line": 2132
2026-08-28T09:54:47.3970533Z             },
2026-08-28T09:54:47.3971167Z             {
2026-08-28T09:54:47.3971903Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.3972886Z               "line": 2165
2026-08-28T09:54:47.3973601Z             },
2026-08-28T09:54:47.3974298Z             {
2026-08-28T09:54:47.3975364Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.3976781Z               "line": 1906
2026-08-28T09:54:47.3978001Z             }
2026-08-28T09:54:47.3978904Z           ]
2026-08-28T09:54:47.3979892Z         }
2026-08-28T09:54:47.3980769Z       }
2026-08-28T09:54:47.3981771Z     },
2026-08-28T09:54:47.3982619Z     {
2026-08-28T09:54:47.3983548Z       "id": "REQ-MANIFEST-5",
2026-08-28T09:54:47.3992264Z       "title": "File-backed adapter [strings] (M12-W3-T3.1): a [strings] dot-path value MAY be an inline-table FILE POINTER `key = { file = \"rel/path\" }` resolved to the file's contents at get-string time, keeping large bodies (skill-instructions, hint text) out of the manifest. A value-position table with a `file` key IS the pointer form (reserved — cannot double as data). Per-adapter aux storage `adapters/<adapter>/strings/`; pointers resolve relative to it with CONTAINMENT (reject `..`/absolute escaping the dir). UPDATE-SAFETY: a LOCAL profile's file-pointers resolve relative to the user-owned local-profile dir (NOT adapter-shipped strings/, which adapter updates overwrite), or the local profile inlines. Validate-at-register (fail-fast on a bad/escaping/missing pointer) + LAZY read at get-string (live file edits reflect, no re-register) + skip-diagnostics on missing-at-read (no hard-crash, mirrors [digest]). Rides the same leaf-replace profile overlay as the rest of [strings].",
2026-08-28T09:54:47.4000806Z       "requiredStages": [
2026-08-28T09:54:47.4001497Z         "doc",
2026-08-28T09:54:47.4002087Z         "impl",
2026-08-28T09:54:47.4002692Z         "unit"
2026-08-28T09:54:47.4003279Z       ],
2026-08-28T09:54:47.4003965Z       "stages": {
2026-08-28T09:54:47.4004576Z         "doc": {
2026-08-28T09:54:47.4005192Z           "complete": true,
2026-08-28T09:54:47.4005884Z           "evidence": [
2026-08-28T09:54:47.4006513Z             {
2026-08-28T09:54:47.4007140Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4012290Z               "line": 86
2026-08-28T09:54:47.4012999Z             }
2026-08-28T09:54:47.4013590Z           ]
2026-08-28T09:54:47.4014159Z         },
2026-08-28T09:54:47.4014742Z         "impl": {
2026-08-28T09:54:47.4015369Z           "complete": true,
2026-08-28T09:54:47.4016152Z           "evidence": [
2026-08-28T09:54:47.4016791Z             {
2026-08-28T09:54:47.4017496Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.4018359Z               "line": 137
2026-08-28T09:54:47.4019136Z             }
2026-08-28T09:54:47.4019722Z           ]
2026-08-28T09:54:47.4020287Z         },
2026-08-28T09:54:47.4020839Z         "int": {
2026-08-28T09:54:47.4021468Z           "complete": false,
2026-08-28T09:54:47.4022156Z           "evidence": []
2026-08-28T09:54:47.4022812Z         },
2026-08-28T09:54:47.4023377Z         "unit": {
2026-08-28T09:54:47.4023988Z           "complete": true,
2026-08-28T09:54:47.4024675Z           "evidence": [
2026-08-28T09:54:47.4025312Z             {
2026-08-28T09:54:47.4026002Z               "path": "crates/spt-runtime/src/profile.rs",
2026-08-28T09:54:47.4026869Z               "line": 421
2026-08-28T09:54:47.4027513Z             },
2026-08-28T09:54:47.4028103Z             {
2026-08-28T09:54:47.4028799Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4029772Z               "line": 1364
2026-08-28T09:54:47.4030415Z             },
2026-08-28T09:54:47.4030998Z             {
2026-08-28T09:54:47.4031671Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4032534Z               "line": 1393
2026-08-28T09:54:47.4033277Z             },
2026-08-28T09:54:47.4033866Z             {
2026-08-28T09:54:47.4034557Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4035434Z               "line": 1433
2026-08-28T09:54:47.4036075Z             },
2026-08-28T09:54:47.4036667Z             {
2026-08-28T09:54:47.4037353Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4038226Z               "line": 1448
2026-08-28T09:54:47.4038879Z             }
2026-08-28T09:54:47.4039589Z           ]
2026-08-28T09:54:47.4040142Z         }
2026-08-28T09:54:47.4040781Z       }
2026-08-28T09:54:47.4041330Z     },
2026-08-28T09:54:47.4041883Z     {
2026-08-28T09:54:47.4042470Z       "id": "REQ-MANIFEST-6",
2026-08-28T09:54:47.4049185Z       "title": "Cross-adapter fallback target addressing (M12-W3-T3.2): a cross-adapter fallback target is addressed as `<adapter>:<profile>` (not just a bare adapter_name), resolved through the one composite-addressing resolver (registry::resolve_option) at every adapter-option read site so a fallback may select a shipped/local profile (e.g. a `ccs` profile). CONTEXT.md §cross-adapter-fallback reconciled (\"ccs is a profile; cross-adapter fallback may target <adapter>:<profile>\"). Contract-only this milestone: the node-wide fallback SETTING + its rate-limit invocation are deferred to the consuming milestone (the runtime path does not exist yet); this REQ guarantees the ADDRESSING resolves.",
2026-08-28T09:54:47.4055483Z       "requiredStages": [
2026-08-28T09:54:47.4056151Z         "doc",
2026-08-28T09:54:47.4056733Z         "unit"
2026-08-28T09:54:47.4057319Z       ],
2026-08-28T09:54:47.4057886Z       "stages": {
2026-08-28T09:54:47.4058479Z         "doc": {
2026-08-28T09:54:47.4059179Z           "complete": true,
2026-08-28T09:54:47.4059869Z           "evidence": [
2026-08-28T09:54:47.4060503Z             {
2026-08-28T09:54:47.4061114Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4061850Z               "line": 174
2026-08-28T09:54:47.4062508Z             }
2026-08-28T09:54:47.4063080Z           ]
2026-08-28T09:54:47.4063733Z         },
2026-08-28T09:54:47.4064301Z         "impl": {
2026-08-28T09:54:47.4064919Z           "complete": false,
2026-08-28T09:54:47.4065776Z           "evidence": []
2026-08-28T09:54:47.4066486Z         },
2026-08-28T09:54:47.4067054Z         "int": {
2026-08-28T09:54:47.4067672Z           "complete": false,
2026-08-28T09:54:47.4068357Z           "evidence": []
2026-08-28T09:54:47.4069105Z         },
2026-08-28T09:54:47.4069672Z         "unit": {
2026-08-28T09:54:47.4070283Z           "complete": true,
2026-08-28T09:54:47.4070954Z           "evidence": [
2026-08-28T09:54:47.4071669Z             {
2026-08-28T09:54:47.4072376Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4073263Z               "line": 1470
2026-08-28T09:54:47.4073926Z             }
2026-08-28T09:54:47.4074508Z           ]
2026-08-28T09:54:47.4075070Z         }
2026-08-28T09:54:47.4075623Z       }
2026-08-28T09:54:47.4076173Z     },
2026-08-28T09:54:47.4076741Z     {
2026-08-28T09:54:47.4077332Z       "id": "REQ-MANIFEST-7",
2026-08-28T09:54:47.4086239Z       "title": "Adapter-declared shortcut basename (M12-W2 follow-on): an optional `[adapter] shortcut_basename` manifest field names the basename the picker bakes into the generated `<basename>-<id>` launcher shortcut (REQ-RUN-SHORTCUT). Absent ⇒ the harness-agnostic default `spt` (→ `spt-<id>`); an adapter sets it to brand its shortcuts (claude-spt → `cc` → `cc-<id>`), so the Claude-Code-ness lives in the PUBLISHED adapter manifest, never hardcoded in spt-core. The picker reads it from the RESOLVED manifest of the selected adapter (registry::resolve_option), falling back to `spt` when absent/empty/unresolvable. Additive + N-1-safe (serde-default Option, omitted from serialization when absent; old manifests parse clean); manifest.schema.json regenerated from the derive (ADR-0001, CI drift-gated). Documented in docs/MANIFEST.md `[adapter]` section + the claude-spt worked example — the adapter-author contract perri builds spt-claude-code against.",
2026-08-28T09:54:47.4094712Z       "requiredStages": [
2026-08-28T09:54:47.4095376Z         "doc",
2026-08-28T09:54:47.4095952Z         "impl",
2026-08-28T09:54:47.4096553Z         "unit"
2026-08-28T09:54:47.4096814Z       ],
2026-08-28T09:54:47.4097085Z       "stages": {
2026-08-28T09:54:47.4097342Z         "doc": {
2026-08-28T09:54:47.4097637Z           "complete": true,
2026-08-28T09:54:47.4097913Z           "evidence": [
2026-08-28T09:54:47.4098209Z             {
2026-08-28T09:54:47.4098529Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.4099105Z               "line": 58
2026-08-28T09:54:47.4099371Z             }
2026-08-28T09:54:47.4099613Z           ]
2026-08-28T09:54:47.4099899Z         },
2026-08-28T09:54:47.4100160Z         "impl": {
2026-08-28T09:54:47.4100461Z           "complete": true,
2026-08-28T09:54:47.4100743Z           "evidence": [
2026-08-28T09:54:47.4101000Z             {
2026-08-28T09:54:47.4101377Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.4101653Z               "line": 89
2026-08-28T09:54:47.4101916Z             }
2026-08-28T09:54:47.4102182Z           ]
2026-08-28T09:54:47.4102439Z         },
2026-08-28T09:54:47.4102705Z         "int": {
2026-08-28T09:54:47.4102992Z           "complete": false,
2026-08-28T09:54:47.4103274Z           "evidence": []
2026-08-28T09:54:47.4103532Z         },
2026-08-28T09:54:47.4103809Z         "unit": {
2026-08-28T09:54:47.4104090Z           "complete": true,
2026-08-28T09:54:47.4104369Z           "evidence": [
2026-08-28T09:54:47.4104634Z             {
2026-08-28T09:54:47.4105010Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.4105296Z               "line": 2365
2026-08-28T09:54:47.4105559Z             }
2026-08-28T09:54:47.4105822Z           ]
2026-08-28T09:54:47.4106084Z         }
2026-08-28T09:54:47.4106342Z       }
2026-08-28T09:54:47.4106594Z     },
2026-08-28T09:54:47.4106856Z     {
2026-08-28T09:54:47.4107160Z       "id": "REQ-MANIFEST-8",
2026-08-28T09:54:47.4113653Z       "title": "[adapter] host_binaries declares the harness executable basenames a kind=\"harness\" adapter hosts agents inside (e.g. host_binaries = [\"claude\"]); bind-time pid→exe-basename match (case-insensitive, .exe-stripped) over the seed's parent_pid selects the candidate adapter set; zero matches → a friendly error naming the binary + the --adapter escape hatch. Additive + N-1-safe: optional Vec<String>, #[serde(default, skip_serializing_if = \"Vec::is_empty\")] (omitted-serialized like shortcut_basename, old manifests parse clean); manifest.schema.json regenerated from the derive (ADR-0001, CI drift-gated). The match-key for ADR-0021 adapter-agnostic bind-time resolution. (v0.9.0)",
2026-08-28T09:54:47.4114044Z       "requiredStages": [
2026-08-28T09:54:47.4114307Z         "doc",
2026-08-28T09:54:47.4114587Z         "impl",
2026-08-28T09:54:47.4114853Z         "unit",
2026-08-28T09:54:47.4115118Z         "int"
2026-08-28T09:54:47.4115396Z       ],
2026-08-28T09:54:47.4115667Z       "stages": {
2026-08-28T09:54:47.4115953Z         "doc": {
2026-08-28T09:54:47.4116240Z           "complete": true,
2026-08-28T09:54:47.4116524Z           "evidence": [
2026-08-28T09:54:47.4116781Z             {
2026-08-28T09:54:47.4117092Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4117373Z               "line": 218
2026-08-28T09:54:47.4117636Z             },
2026-08-28T09:54:47.4117901Z             {
2026-08-28T09:54:47.4118215Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.4118491Z               "line": 69
2026-08-28T09:54:47.4118757Z             }
2026-08-28T09:54:47.4119106Z           ]
2026-08-28T09:54:47.4119373Z         },
2026-08-28T09:54:47.4119644Z         "impl": {
2026-08-28T09:54:47.4119940Z           "complete": true,
2026-08-28T09:54:47.4120216Z           "evidence": [
2026-08-28T09:54:47.4120482Z             {
2026-08-28T09:54:47.4120857Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.4121219Z               "line": 228
2026-08-28T09:54:47.4121487Z             },
2026-08-28T09:54:47.4121754Z             {
2026-08-28T09:54:47.4122101Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.4122384Z               "line": 456
2026-08-28T09:54:47.4122656Z             }
2026-08-28T09:54:47.4122918Z           ]
2026-08-28T09:54:47.4123187Z         },
2026-08-28T09:54:47.4123450Z         "int": {
2026-08-28T09:54:47.4123746Z           "complete": true,
2026-08-28T09:54:47.4124022Z           "evidence": [
2026-08-28T09:54:47.4124290Z             {
2026-08-28T09:54:47.4124718Z               "path": "crates/spt/tests/live_resolve_e2e.rs",
2026-08-28T09:54:47.4124999Z               "line": 18
2026-08-28T09:54:47.4125262Z             }
2026-08-28T09:54:47.4125523Z           ]
2026-08-28T09:54:47.4125782Z         },
2026-08-28T09:54:47.4126050Z         "unit": {
2026-08-28T09:54:47.4126336Z           "complete": true,
2026-08-28T09:54:47.4126613Z           "evidence": [
2026-08-28T09:54:47.4126880Z             {
2026-08-28T09:54:47.4127252Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.4127538Z               "line": 2383
2026-08-28T09:54:47.4127805Z             },
2026-08-28T09:54:47.4128063Z             {
2026-08-28T09:54:47.4128437Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.4128707Z               "line": 322
2026-08-28T09:54:47.4129056Z             },
2026-08-28T09:54:47.4129317Z             {
2026-08-28T09:54:47.4129695Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.4129971Z               "line": 338
2026-08-28T09:54:47.4130238Z             },
2026-08-28T09:54:47.4130505Z             {
2026-08-28T09:54:47.4130871Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:47.4131150Z               "line": 351
2026-08-28T09:54:47.4131413Z             },
2026-08-28T09:54:47.4131675Z             {
2026-08-28T09:54:47.4132018Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.4132305Z               "line": 583
2026-08-28T09:54:47.4132638Z             },
2026-08-28T09:54:47.4132891Z             {
2026-08-28T09:54:47.4133240Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.4133516Z               "line": 597
2026-08-28T09:54:47.4133780Z             }
2026-08-28T09:54:47.4134038Z           ]
2026-08-28T09:54:47.4134301Z         }
2026-08-28T09:54:47.4134558Z       }
2026-08-28T09:54:47.4134826Z     },
2026-08-28T09:54:47.4135088Z     {
2026-08-28T09:54:47.4135408Z       "id": "REQ-MANIFEST-NODE-KEY",
2026-08-28T09:54:47.4148034Z       "title": "A new session-scoped manifest fill key `{node}` resolves to THIS node's advertised label — available wherever the session-scoped keys ({id}/{session_id}/{session_name}) populate: BOTH topologies' spawn-prep catalogs (harnesshost.rs:111-118 self-spawn guaranteed-fill + lifecycle.rs:280 base lifecycle keys, at minimum [session.self] and [session.resume]) AND lazy [strings] eligibility (ADR-0029 family). VALUE (design-true per CONTEXT §node label / REQ-SUBNET-3): the node's ADVERTISED LABEL — the same value node_label_display renders — read from the label store (NodeLabel, registry.rs:118/220, OS-hostname default re-checked at daemon startup), NOT the pubkey and NOT a fresh gethostname at fill time when the store already holds the refreshed label; fall back to the OS hostname only if no label is known. perri's concrete use: templating `--remote-control {id}--{node}` in the claude-spt launch/resume commands. CAVEAT (documented in the manifest.md key-table row AND here): SINGLE-TOKEN fills only — tokenize-then-fill (REQ post-F-009) cannot produce a space-carrying argv element, so composite display names like `<id> @ <node>` remain adapter-shim territory (claude-spt v0.10.3's launch shim stays the reference for those); {node} COMPLEMENTS the shim for tokenizable args, it does not replace it. Origin: perri fill-catalog-gap finding 2026-07-02, operator-promoted into BUILD-F023-WANIDLE (additive, independent of the delivery legs). (NODEKEY-FOLD)",
2026-08-28T09:54:47.4148530Z       "requiredStages": [
2026-08-28T09:54:47.4148796Z         "doc",
2026-08-28T09:54:47.4149150Z         "impl",
2026-08-28T09:54:47.4149415Z         "unit"
2026-08-28T09:54:47.4149675Z       ],
2026-08-28T09:54:47.4149947Z       "stages": {
2026-08-28T09:54:47.4150214Z         "doc": {
2026-08-28T09:54:47.4150501Z           "complete": true,
2026-08-28T09:54:47.4150777Z           "evidence": [
2026-08-28T09:54:47.4151043Z             {
2026-08-28T09:54:47.4151349Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.4151702Z               "line": 186
2026-08-28T09:54:47.4151962Z             }
2026-08-28T09:54:47.4152218Z           ]
2026-08-28T09:54:47.4152500Z         },
2026-08-28T09:54:47.4152767Z         "impl": {
2026-08-28T09:54:47.4153067Z           "complete": true,
2026-08-28T09:54:47.4153344Z           "evidence": [
2026-08-28T09:54:47.4153605Z             {
2026-08-28T09:54:47.4154026Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4154313Z               "line": 681
2026-08-28T09:54:47.4154584Z             },
2026-08-28T09:54:47.4154849Z             {
2026-08-28T09:54:47.4155225Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.4155506Z               "line": 487
2026-08-28T09:54:47.4155774Z             },
2026-08-28T09:54:47.4156041Z             {
2026-08-28T09:54:47.4156427Z               "path": "crates/spt-store/src/hostlabel.rs",
2026-08-28T09:54:47.4156698Z               "line": 29
2026-08-28T09:54:47.4156976Z             }
2026-08-28T09:54:47.4157284Z           ]
2026-08-28T09:54:47.4157545Z         },
2026-08-28T09:54:47.4157811Z         "int": {
2026-08-28T09:54:47.4158126Z           "complete": false,
2026-08-28T09:54:47.4158412Z           "evidence": []
2026-08-28T09:54:47.4158674Z         },
2026-08-28T09:54:47.4159042Z         "unit": {
2026-08-28T09:54:47.4159332Z           "complete": true,
2026-08-28T09:54:47.4159628Z           "evidence": [
2026-08-28T09:54:47.4159885Z             {
2026-08-28T09:54:47.4160359Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.4160645Z               "line": 489
2026-08-28T09:54:47.4160921Z             },
2026-08-28T09:54:47.4161184Z             {
2026-08-28T09:54:47.4161594Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.4161880Z               "line": 514
2026-08-28T09:54:47.4162142Z             },
2026-08-28T09:54:47.4162405Z             {
2026-08-28T09:54:47.4162778Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.4163065Z               "line": 2148
2026-08-28T09:54:47.4163394Z             },
2026-08-28T09:54:47.4163656Z             {
2026-08-28T09:54:47.4164032Z               "path": "crates/spt-store/src/hostlabel.rs",
2026-08-28T09:54:47.4164318Z               "line": 79
2026-08-28T09:54:47.4164582Z             }
2026-08-28T09:54:47.4164843Z           ]
2026-08-28T09:54:47.4165110Z         }
2026-08-28T09:54:47.4165381Z       }
2026-08-28T09:54:47.4165648Z     },
2026-08-28T09:54:47.4165916Z     {
2026-08-28T09:54:47.4166235Z       "id": "REQ-MANIFEST-SUBST",
2026-08-28T09:54:47.4174244Z       "title": "Manifest substitution primitives for resolve-not-execute (ADR-0029, supersedes a rejected `spt api run-hook`): (1) two adapter-static substitution keys `{adapter_dir}` (the registry record's precise source_dir — install dir, survives updates, the dir bare-program resolution uses) and `{adapter_name}`, available wherever command/string substitution runs; (2) lazy substitution INSIDE `[strings]` values at `get-string` read time, scoped to those adapter-static keys ONLY (session-scoped {id}/{session_id}/… are NOT available — get-string carries no session; a get-string --session-id is a deferred larger change). Invariant preserved: spt-core never executes a string — it substitutes and returns; the adapter's own wrapper executes the result (e.g. a CC hook dispatcher get-strings its packed binary once per session into an env var, then runs it per-hook, so hook logic rides `spt adapter update`). (v0.16.0)",
2026-08-28T09:54:47.4174654Z       "requiredStages": [
2026-08-28T09:54:47.4174926Z         "doc",
2026-08-28T09:54:47.4175198Z         "impl",
2026-08-28T09:54:47.4175462Z         "unit"
2026-08-28T09:54:47.4175714Z       ],
2026-08-28T09:54:47.4175992Z       "stages": {
2026-08-28T09:54:47.4176256Z         "doc": {
2026-08-28T09:54:47.4176533Z           "complete": true,
2026-08-28T09:54:47.4176828Z           "evidence": [
2026-08-28T09:54:47.4177086Z             {
2026-08-28T09:54:47.4177467Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.4177748Z               "line": 170
2026-08-28T09:54:47.4178021Z             },
2026-08-28T09:54:47.4178285Z             {
2026-08-28T09:54:47.4178588Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.4178864Z               "line": 327
2026-08-28T09:54:47.4179198Z             },
2026-08-28T09:54:47.4179498Z             {
2026-08-28T09:54:47.4180047Z               "path": "docs/adr/0029-adapter-update-arc-resolve-not-execute.md",
2026-08-28T09:54:47.4180329Z               "line": 3
2026-08-28T09:54:47.4180597Z             }
2026-08-28T09:54:47.4180850Z           ]
2026-08-28T09:54:47.4181114Z         },
2026-08-28T09:54:47.4181379Z         "impl": {
2026-08-28T09:54:47.4181671Z           "complete": true,
2026-08-28T09:54:47.4181952Z           "evidence": [
2026-08-28T09:54:47.4182215Z             {
2026-08-28T09:54:47.4182576Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:47.4182863Z               "line": 267
2026-08-28T09:54:47.4183135Z             },
2026-08-28T09:54:47.4183392Z             {
2026-08-28T09:54:47.4183777Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.4184051Z               "line": 145
2026-08-28T09:54:47.4184318Z             },
2026-08-28T09:54:47.4184575Z             {
2026-08-28T09:54:47.4184957Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4185242Z               "line": 656
2026-08-28T09:54:47.4185515Z             },
2026-08-28T09:54:47.4185858Z             {
2026-08-28T09:54:47.4186235Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4186520Z               "line": 669
2026-08-28T09:54:47.4186782Z             },
2026-08-28T09:54:47.4187050Z             {
2026-08-28T09:54:47.4187422Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:47.4187708Z               "line": 680
2026-08-28T09:54:47.4187979Z             },
2026-08-28T09:54:47.4188243Z             {
2026-08-28T09:54:47.4188637Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.4189044Z               "line": 374
2026-08-28T09:54:47.4189326Z             },
2026-08-28T09:54:47.4189588Z             {
2026-08-28T09:54:47.4189969Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.4190255Z               "line": 486
2026-08-28T09:54:47.4190527Z             },
2026-08-28T09:54:47.4190805Z             {
2026-08-28T09:54:47.4191166Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.4191453Z               "line": 729
2026-08-28T09:54:47.4191722Z             },
2026-08-28T09:54:47.4191987Z             {
2026-08-28T09:54:47.4192359Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.4192640Z               "line": 792
2026-08-28T09:54:47.4192903Z             }
2026-08-28T09:54:47.4193169Z           ]
2026-08-28T09:54:47.4193447Z         },
2026-08-28T09:54:47.4193724Z         "int": {
2026-08-28T09:54:47.4194024Z           "complete": false,
2026-08-28T09:54:47.4194308Z           "evidence": []
2026-08-28T09:54:47.4194611Z         },
2026-08-28T09:54:47.4194878Z         "unit": {
2026-08-28T09:54:47.4195168Z           "complete": true,
2026-08-28T09:54:47.4195455Z           "evidence": [
2026-08-28T09:54:47.4195717Z             {
2026-08-28T09:54:47.4196094Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.4196432Z               "line": 1564
2026-08-28T09:54:47.4196708Z             }
2026-08-28T09:54:47.4196972Z           ]
2026-08-28T09:54:47.4197243Z         }
2026-08-28T09:54:47.4197509Z       }
2026-08-28T09:54:47.4197775Z     },
2026-08-28T09:54:47.4198038Z     {
2026-08-28T09:54:47.4198329Z       "id": "REQ-MESH-1",
2026-08-28T09:54:47.4204441Z       "title": "Membership proof (seed-proof): symmetric current-epoch seed-knowledge replaces is_trusted at EVERY inbound gate (registry apply, WAN receive, sync, notif, connection accept). MK = HKDF(seed, domain ‖ subnet_id ‖ seed_epoch); mutual channel-bound challenge-response at connect (transcript binds both handshake-proven node pubkeys, both nonces, subnet_id, seed_epoch, role); verified once per connection, cached on the broker ConnEntry, kept warm via QUIC keep-alive so re-proof is restart/partition/rotation-only. Exact-epoch match (re-seed is the sole N-1 exception). SECURITY INVARIANTS: channel-bound (no cross-connection replay), mutual, accepts a member it never paired (the mesh property).",
2026-08-28T09:54:47.4204830Z       "requiredStages": [
2026-08-28T09:54:47.4205099Z         "impl",
2026-08-28T09:54:47.4205358Z         "unit",
2026-08-28T09:54:47.4205619Z         "int"
2026-08-28T09:54:47.4205887Z       ],
2026-08-28T09:54:47.4206140Z       "stages": {
2026-08-28T09:54:47.4206411Z         "doc": {
2026-08-28T09:54:47.4206701Z           "complete": false,
2026-08-28T09:54:47.4206979Z           "evidence": []
2026-08-28T09:54:47.4207245Z         },
2026-08-28T09:54:47.4207514Z         "impl": {
2026-08-28T09:54:47.4207808Z           "complete": true,
2026-08-28T09:54:47.4208093Z           "evidence": [
2026-08-28T09:54:47.4208360Z             {
2026-08-28T09:54:47.4208738Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.4209109Z               "line": 1701
2026-08-28T09:54:47.4209372Z             },
2026-08-28T09:54:47.4209638Z             {
2026-08-28T09:54:47.4210028Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4210307Z               "line": 38
2026-08-28T09:54:47.4210646Z             },
2026-08-28T09:54:47.4210907Z             {
2026-08-28T09:54:47.4211300Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4211580Z               "line": 169
2026-08-28T09:54:47.4211851Z             },
2026-08-28T09:54:47.4212114Z             {
2026-08-28T09:54:47.4212506Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4212785Z               "line": 215
2026-08-28T09:54:47.4213050Z             },
2026-08-28T09:54:47.4213318Z             {
2026-08-28T09:54:47.4213694Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.4214056Z               "line": 63
2026-08-28T09:54:47.4214319Z             },
2026-08-28T09:54:47.4214586Z             {
2026-08-28T09:54:47.4214991Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4215272Z               "line": 24
2026-08-28T09:54:47.4215537Z             },
2026-08-28T09:54:47.4215832Z             {
2026-08-28T09:54:47.4216365Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4216632Z               "line": 142
2026-08-28T09:54:47.4216905Z             },
2026-08-28T09:54:47.4217157Z             {
2026-08-28T09:54:47.4217572Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4217891Z               "line": 162
2026-08-28T09:54:47.4218219Z             }
2026-08-28T09:54:47.4218486Z           ]
2026-08-28T09:54:47.4218744Z         },
2026-08-28T09:54:47.4219112Z         "int": {
2026-08-28T09:54:47.4219392Z           "complete": true,
2026-08-28T09:54:47.4219684Z           "evidence": [
2026-08-28T09:54:47.4219942Z             {
2026-08-28T09:54:47.4220337Z               "path": "crates/spt-daemon/tests/seedproofx.rs",
2026-08-28T09:54:47.4220617Z               "line": 68
2026-08-28T09:54:47.4220881Z             },
2026-08-28T09:54:47.4221143Z             {
2026-08-28T09:54:47.4221616Z               "path": "crates/spt-daemon/tests/seedproofx.rs",
2026-08-28T09:54:47.4221902Z               "line": 94
2026-08-28T09:54:47.4222170Z             },
2026-08-28T09:54:47.4222441Z             {
2026-08-28T09:54:47.4222829Z               "path": "crates/spt-daemon/tests/seedproofx.rs",
2026-08-28T09:54:47.4223119Z               "line": 118
2026-08-28T09:54:47.4223383Z             },
2026-08-28T09:54:47.4223658Z             {
2026-08-28T09:54:47.4224054Z               "path": "crates/spt-daemon/tests/seedproofx.rs",
2026-08-28T09:54:47.4224334Z               "line": 135
2026-08-28T09:54:47.4224659Z             }
2026-08-28T09:54:47.4224922Z           ]
2026-08-28T09:54:47.4225193Z         },
2026-08-28T09:54:47.4225461Z         "unit": {
2026-08-28T09:54:47.4225747Z           "complete": true,
2026-08-28T09:54:47.4226018Z           "evidence": [
2026-08-28T09:54:47.4226286Z             {
2026-08-28T09:54:47.4226669Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.4226945Z               "line": 626
2026-08-28T09:54:47.4227206Z             },
2026-08-28T09:54:47.4227465Z             {
2026-08-28T09:54:47.4227860Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4228127Z               "line": 376
2026-08-28T09:54:47.4228389Z             },
2026-08-28T09:54:47.4228648Z             {
2026-08-28T09:54:47.4229165Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4229447Z               "line": 412
2026-08-28T09:54:47.4229709Z             },
2026-08-28T09:54:47.4229976Z             {
2026-08-28T09:54:47.4230376Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4230653Z               "line": 427
2026-08-28T09:54:47.4230911Z             },
2026-08-28T09:54:47.4231172Z             {
2026-08-28T09:54:47.4231571Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4231843Z               "line": 438
2026-08-28T09:54:47.4232110Z             },
2026-08-28T09:54:47.4232372Z             {
2026-08-28T09:54:47.4232858Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4233144Z               "line": 449
2026-08-28T09:54:47.4233412Z             },
2026-08-28T09:54:47.4233674Z             {
2026-08-28T09:54:47.4234077Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4234357Z               "line": 460
2026-08-28T09:54:47.4234619Z             },
2026-08-28T09:54:47.4234890Z             {
2026-08-28T09:54:47.4235297Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4235582Z               "line": 496
2026-08-28T09:54:47.4235897Z             },
2026-08-28T09:54:47.4236168Z             {
2026-08-28T09:54:47.4236563Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4236852Z               "line": 519
2026-08-28T09:54:47.4237123Z             },
2026-08-28T09:54:47.4237385Z             {
2026-08-28T09:54:47.4237796Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4238081Z               "line": 546
2026-08-28T09:54:47.4238349Z             }
2026-08-28T09:54:47.4238611Z           ]
2026-08-28T09:54:47.4238879Z         }
2026-08-28T09:54:47.4239231Z       }
2026-08-28T09:54:47.4239488Z     },
2026-08-28T09:54:47.4239750Z     {
2026-08-28T09:54:47.4240041Z       "id": "REQ-MESH-2",
2026-08-28T09:54:47.4247645Z       "title": "Member roster: node-level union-merge grow-set (per member: pubkey, label, machine_id, last-known address, last-seen — NOT the seed), the discovery directory the mesh dials by. Seeded IN FULL at pairing (seed-holder hands joiner the whole current roster, incl. offline members — folds in deferred pairing-time hostname capture + post-join address seeding); each node authors its own entry stamped with its lease_epoch, merged strictly-greater-wins (the node_label lease); exchanged only over seed-proof'd member connections; forgery-inert (a fake entry names a pubkey that still can't seed-proof). Removal needs a TOMBSTONE — a per-pubkey revoked marker that propagates, dominates the entry, gates admission (seed-proof ∧ ¬tombstoned), and prevents reinsert; cleared by a completed re-pair of that pubkey. Persists through silence (offline member keeps its entry).",
2026-08-28T09:54:47.4248051Z       "requiredStages": [
2026-08-28T09:54:47.4248313Z         "impl",
2026-08-28T09:54:47.4248580Z         "unit",
2026-08-28T09:54:47.4248837Z         "int"
2026-08-28T09:54:47.4249200Z       ],
2026-08-28T09:54:47.4249481Z       "stages": {
2026-08-28T09:54:47.4249819Z         "doc": {
2026-08-28T09:54:47.4250115Z           "complete": false,
2026-08-28T09:54:47.4250406Z           "evidence": []
2026-08-28T09:54:47.4250673Z         },
2026-08-28T09:54:47.4250935Z         "impl": {
2026-08-28T09:54:47.4251230Z           "complete": true,
2026-08-28T09:54:47.4251502Z           "evidence": [
2026-08-28T09:54:47.4251764Z             {
2026-08-28T09:54:47.4252130Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.4252424Z               "line": 1429
2026-08-28T09:54:47.4252700Z             },
2026-08-28T09:54:47.4252959Z             {
2026-08-28T09:54:47.4253340Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4253616Z               "line": 118
2026-08-28T09:54:47.4253883Z             },
2026-08-28T09:54:47.4254146Z             {
2026-08-28T09:54:47.4254523Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4254800Z               "line": 349
2026-08-28T09:54:47.4255064Z             },
2026-08-28T09:54:47.4255333Z             {
2026-08-28T09:54:47.4255696Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4255977Z               "line": 392
2026-08-28T09:54:47.4256240Z             },
2026-08-28T09:54:47.4256497Z             {
2026-08-28T09:54:47.4256868Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4257146Z               "line": 415
2026-08-28T09:54:47.4257409Z             },
2026-08-28T09:54:47.4257669Z             {
2026-08-28T09:54:47.4258112Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4258392Z               "line": 834
2026-08-28T09:54:47.4258664Z             },
2026-08-28T09:54:47.4258921Z             {
2026-08-28T09:54:47.4259397Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4259675Z               "line": 849
2026-08-28T09:54:47.4259938Z             },
2026-08-28T09:54:47.4260200Z             {
2026-08-28T09:54:47.4260565Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4260851Z               "line": 876
2026-08-28T09:54:47.4261171Z             },
2026-08-28T09:54:47.4261451Z             {
2026-08-28T09:54:47.4261834Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4262110Z               "line": 216
2026-08-28T09:54:47.4262367Z             },
2026-08-28T09:54:47.4262634Z             {
2026-08-28T09:54:47.4263017Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4263304Z               "line": 868
2026-08-28T09:54:47.4263571Z             },
2026-08-28T09:54:47.4263833Z             {
2026-08-28T09:54:47.4264214Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4264495Z               "line": 929
2026-08-28T09:54:47.4264758Z             },
2026-08-28T09:54:47.4265016Z             {
2026-08-28T09:54:47.4265398Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4265682Z               "line": 998
2026-08-28T09:54:47.4265946Z             },
2026-08-28T09:54:47.4266222Z             {
2026-08-28T09:54:47.4266599Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4266880Z               "line": 1085
2026-08-28T09:54:47.4267143Z             },
2026-08-28T09:54:47.4267405Z             {
2026-08-28T09:54:47.4267753Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:47.4268026Z               "line": 174
2026-08-28T09:54:47.4268357Z             },
2026-08-28T09:54:47.4268623Z             {
2026-08-28T09:54:47.4269052Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4269329Z               "line": 44
2026-08-28T09:54:47.4269591Z             },
2026-08-28T09:54:47.4269849Z             {
2026-08-28T09:54:47.4270202Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4270474Z               "line": 184
2026-08-28T09:54:47.4270740Z             },
2026-08-28T09:54:47.4271006Z             {
2026-08-28T09:54:47.4271354Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4271697Z               "line": 211
2026-08-28T09:54:47.4271964Z             },
2026-08-28T09:54:47.4272232Z             {
2026-08-28T09:54:47.4272584Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4272870Z               "line": 274
2026-08-28T09:54:47.4273133Z             },
2026-08-28T09:54:47.4273394Z             {
2026-08-28T09:54:47.4273750Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4274031Z               "line": 298
2026-08-28T09:54:47.4274297Z             },
2026-08-28T09:54:47.4274559Z             {
2026-08-28T09:54:47.4274912Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4275222Z               "line": 312
2026-08-28T09:54:47.4275489Z             },
2026-08-28T09:54:47.4275775Z             {
2026-08-28T09:54:47.4276122Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4276402Z               "line": 323
2026-08-28T09:54:47.4276669Z             },
2026-08-28T09:54:47.4276932Z             {
2026-08-28T09:54:47.4277284Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4277566Z               "line": 336
2026-08-28T09:54:47.4277833Z             }
2026-08-28T09:54:47.4278094Z           ]
2026-08-28T09:54:47.4278357Z         },
2026-08-28T09:54:47.4278619Z         "int": {
2026-08-28T09:54:47.4278912Z           "complete": true,
2026-08-28T09:54:47.4282969Z           "evidence": [
2026-08-28T09:54:47.4283373Z             {
2026-08-28T09:54:47.4283797Z               "path": "crates/spt-daemon/tests/rosterprop.rs",
2026-08-28T09:54:47.4284080Z               "line": 118
2026-08-28T09:54:47.4284344Z             },
2026-08-28T09:54:47.4284601Z             {
2026-08-28T09:54:47.4285001Z               "path": "crates/spt-daemon/tests/rosterprop.rs",
2026-08-28T09:54:47.4285292Z               "line": 183
2026-08-28T09:54:47.4285555Z             }
2026-08-28T09:54:47.4285821Z           ]
2026-08-28T09:54:47.4286217Z         },
2026-08-28T09:54:47.4286612Z         "unit": {
2026-08-28T09:54:47.4286991Z           "complete": true,
2026-08-28T09:54:47.4287276Z           "evidence": [
2026-08-28T09:54:47.4287539Z             {
2026-08-28T09:54:47.4287930Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4288230Z               "line": 1310
2026-08-28T09:54:47.4288488Z             },
2026-08-28T09:54:47.4288756Z             {
2026-08-28T09:54:47.4289226Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4289510Z               "line": 1327
2026-08-28T09:54:47.4289768Z             },
2026-08-28T09:54:47.4290035Z             {
2026-08-28T09:54:47.4290416Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4290697Z               "line": 1335
2026-08-28T09:54:47.4290960Z             },
2026-08-28T09:54:47.4291226Z             {
2026-08-28T09:54:47.4291609Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4291885Z               "line": 1359
2026-08-28T09:54:47.4292150Z             },
2026-08-28T09:54:47.4292412Z             {
2026-08-28T09:54:47.4292808Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.4293093Z               "line": 1727
2026-08-28T09:54:47.4293357Z             },
2026-08-28T09:54:47.4293619Z             {
2026-08-28T09:54:47.4293971Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4294319Z               "line": 370
2026-08-28T09:54:47.4294585Z             },
2026-08-28T09:54:47.4294851Z             {
2026-08-28T09:54:47.4295204Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4295486Z               "line": 393
2026-08-28T09:54:47.4295752Z             },
2026-08-28T09:54:47.4296009Z             {
2026-08-28T09:54:47.4296367Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4296643Z               "line": 430
2026-08-28T09:54:47.4296915Z             },
2026-08-28T09:54:47.4297176Z             {
2026-08-28T09:54:47.4297588Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4297865Z               "line": 454
2026-08-28T09:54:47.4298128Z             },
2026-08-28T09:54:47.4298409Z             {
2026-08-28T09:54:47.4298752Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4299219Z               "line": 506
2026-08-28T09:54:47.4299477Z             },
2026-08-28T09:54:47.4299739Z             {
2026-08-28T09:54:47.4300094Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4300394Z               "line": 522
2026-08-28T09:54:47.4300657Z             },
2026-08-28T09:54:47.4300919Z             {
2026-08-28T09:54:47.4301281Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4301539Z               "line": 568
2026-08-28T09:54:47.4301801Z             },
2026-08-28T09:54:47.4302067Z             {
2026-08-28T09:54:47.4302421Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4302696Z               "line": 585
2026-08-28T09:54:47.4302963Z             }
2026-08-28T09:54:47.4303221Z           ]
2026-08-28T09:54:47.4303488Z         }
2026-08-28T09:54:47.4303755Z       }
2026-08-28T09:54:47.4304099Z     },
2026-08-28T09:54:47.4304470Z     {
2026-08-28T09:54:47.4304762Z       "id": "REQ-MESH-3",
2026-08-28T09:54:47.4309674Z       "title": "Mesh row fan-out: registry rows stay OWN-AUTHORED; the only change is the push target widens from directly-paired peers to ALL roster members (a wider DIRECT fan-out, never a third-party relay). Every row/message still arrives from its author over a handshake → KNOWN-HAZARDS 7.5 (origin = handshake node) and 4.10 (eviction lease: any future update comes from that node itself, alive) PRESERVED VERBATIM. Closes the staggered A→B→C repro: C (roster-seeded with A at pairing) initiates to A, seed-proof admits C unpaired, A learns C, both push directly.",
2026-08-28T09:54:47.4310080Z       "requiredStages": [
2026-08-28T09:54:47.4310346Z         "impl",
2026-08-28T09:54:47.4310644Z         "unit",
2026-08-28T09:54:47.4310902Z         "int"
2026-08-28T09:54:47.4311231Z       ],
2026-08-28T09:54:47.4311502Z       "stages": {
2026-08-28T09:54:47.4311770Z         "doc": {
2026-08-28T09:54:47.4312060Z           "complete": false,
2026-08-28T09:54:47.4312351Z           "evidence": []
2026-08-28T09:54:47.4312618Z         },
2026-08-28T09:54:47.4312885Z         "impl": {
2026-08-28T09:54:47.4313185Z           "complete": true,
2026-08-28T09:54:47.4313457Z           "evidence": [
2026-08-28T09:54:47.4313729Z             {
2026-08-28T09:54:47.4314105Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.4314391Z               "line": 1181
2026-08-28T09:54:47.4314654Z             }
2026-08-28T09:54:47.4314916Z           ]
2026-08-28T09:54:47.4315178Z         },
2026-08-28T09:54:47.4315444Z         "int": {
2026-08-28T09:54:47.4315784Z           "complete": true,
2026-08-28T09:54:47.4316061Z           "evidence": [
2026-08-28T09:54:47.4316362Z             {
2026-08-28T09:54:47.4316719Z               "path": "crates/spt-daemon/tests/mesh.rs",
2026-08-28T09:54:47.4317005Z               "line": 377
2026-08-28T09:54:47.4317273Z             },
2026-08-28T09:54:47.4317535Z             {
2026-08-28T09:54:47.4317912Z               "path": "crates/spt-daemon/tests/mesh.rs",
2026-08-28T09:54:47.4318189Z               "line": 446
2026-08-28T09:54:47.4318454Z             }
2026-08-28T09:54:47.4318776Z           ]
2026-08-28T09:54:47.4319139Z         },
2026-08-28T09:54:47.4319410Z         "unit": {
2026-08-28T09:54:47.4319701Z           "complete": true,
2026-08-28T09:54:47.4319987Z           "evidence": [
2026-08-28T09:54:47.4320254Z             {
2026-08-28T09:54:47.4320645Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.4320916Z               "line": 1758
2026-08-28T09:54:47.4321180Z             }
2026-08-28T09:54:47.4321438Z           ]
2026-08-28T09:54:47.4321706Z         }
2026-08-28T09:54:47.4321967Z       }
2026-08-28T09:54:47.4322287Z     },
2026-08-28T09:54:47.4322549Z     {
2026-08-28T09:54:47.4322839Z       "id": "REQ-MESH-4",
2026-08-28T09:54:47.4331960Z       "title": "Revoke + timeboxed seed rotation + re-seed grace: `spt subnet revoke <node>...` (list, elevation-gated, revoke-only; COMPOSED-WITH milestone-A FF: REQ-SUBNET-REVOKE-ADMIN-GATE adds the admin-TOTP gate BEFORE any write — elevation alone no longer authorizes — and REQ-SUBNET-ADMIN-RESURFACE rides the same coalescing window for the parked ADMIN key; this REQ keeps the revoke mechanics + MEMBER-seed rotation) writes roster tombstones immediately, then schedules ONE seed rotation (re-mint seed, bump seed_epoch, push new seed CONFIDENTIALLY over member-auth'd TLS connections — never in roster/registry gossip — force-drop revokees) at the close of a coalescing window (default 1h); further revokes in the window join the same rotation (one epoch bump). `--force-rotate-seed` rotates immediately (compromised-node path). RE-SEED GRACE: a node proving the immediately-prior epoch (N-1) AND still on the roster gets a re-seed-only restricted connection (auto-heals a benign offliner); revoked/off-roster denied; ≥2 stale → re-pair.",
2026-08-28T09:54:47.4332313Z       "requiredStages": [
2026-08-28T09:54:47.4332571Z         "impl",
2026-08-28T09:54:47.4332842Z         "unit",
2026-08-28T09:54:47.4333109Z         "int"
2026-08-28T09:54:47.4333376Z       ],
2026-08-28T09:54:47.4333643Z       "stages": {
2026-08-28T09:54:47.4333925Z         "doc": {
2026-08-28T09:54:47.4334295Z           "complete": false,
2026-08-28T09:54:47.4334573Z           "evidence": []
2026-08-28T09:54:47.4334840Z         },
2026-08-28T09:54:47.4335101Z         "impl": {
2026-08-28T09:54:47.4335402Z           "complete": true,
2026-08-28T09:54:47.4335673Z           "evidence": [
2026-08-28T09:54:47.4335945Z             {
2026-08-28T09:54:47.4336350Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:47.4336626Z               "line": 87
2026-08-28T09:54:47.4336900Z             },
2026-08-28T09:54:47.4337229Z             {
2026-08-28T09:54:47.4337619Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4337978Z               "line": 68
2026-08-28T09:54:47.4338259Z             },
2026-08-28T09:54:47.4338526Z             {
2026-08-28T09:54:47.4338913Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4339271Z               "line": 119
2026-08-28T09:54:47.4339540Z             },
2026-08-28T09:54:47.4339814Z             {
2026-08-28T09:54:47.4340201Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4340477Z               "line": 528
2026-08-28T09:54:47.4340745Z             },
2026-08-28T09:54:47.4341011Z             {
2026-08-28T09:54:47.4341393Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4341674Z               "line": 824
2026-08-28T09:54:47.4341933Z             },
2026-08-28T09:54:47.4342207Z             {
2026-08-28T09:54:47.4342593Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4342931Z               "line": 838
2026-08-28T09:54:47.4343202Z             },
2026-08-28T09:54:47.4343465Z             {
2026-08-28T09:54:47.4343823Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:47.4344094Z               "line": 184
2026-08-28T09:54:47.4344356Z             },
2026-08-28T09:54:47.4344623Z             {
2026-08-28T09:54:47.4345051Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4345337Z               "line": 26
2026-08-28T09:54:47.4345604Z             },
2026-08-28T09:54:47.4345870Z             {
2026-08-28T09:54:47.4346243Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4346519Z               "line": 110
2026-08-28T09:54:47.4346786Z             },
2026-08-28T09:54:47.4347054Z             {
2026-08-28T09:54:47.4347422Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4347695Z               "line": 133
2026-08-28T09:54:47.4348014Z             },
2026-08-28T09:54:47.4348276Z             {
2026-08-28T09:54:47.4348672Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.4349039Z               "line": 106
2026-08-28T09:54:47.4349310Z             },
2026-08-28T09:54:47.4349569Z             {
2026-08-28T09:54:47.4349935Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.4350210Z               "line": 192
2026-08-28T09:54:47.4350475Z             },
2026-08-28T09:54:47.4350742Z             {
2026-08-28T09:54:47.4351095Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.4351376Z               "line": 454
2026-08-28T09:54:47.4351639Z             },
2026-08-28T09:54:47.4351915Z             {
2026-08-28T09:54:47.4352268Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.4352549Z               "line": 493
2026-08-28T09:54:47.4352824Z             },
2026-08-28T09:54:47.4353085Z             {
2026-08-28T09:54:47.4353405Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4353686Z               "line": 14563
2026-08-28T09:54:47.4353962Z             }
2026-08-28T09:54:47.4354219Z           ]
2026-08-28T09:54:47.4354487Z         },
2026-08-28T09:54:47.4354749Z         "int": {
2026-08-28T09:54:47.4355041Z           "complete": true,
2026-08-28T09:54:47.4355318Z           "evidence": [
2026-08-28T09:54:47.4355573Z             {
2026-08-28T09:54:47.4355950Z               "path": "crates/spt-daemon/tests/reseed.rs",
2026-08-28T09:54:47.4356294Z               "line": 112
2026-08-28T09:54:47.4356560Z             },
2026-08-28T09:54:47.4356822Z             {
2026-08-28T09:54:47.4357233Z               "path": "crates/spt-daemon/tests/reseed.rs",
2026-08-28T09:54:47.4357510Z               "line": 195
2026-08-28T09:54:47.4357751Z             }
2026-08-28T09:54:47.4358040Z           ]
2026-08-28T09:54:47.4358297Z         },
2026-08-28T09:54:47.4358565Z         "unit": {
2026-08-28T09:54:47.4358851Z           "complete": true,
2026-08-28T09:54:47.4359227Z           "evidence": [
2026-08-28T09:54:47.4359499Z             {
2026-08-28T09:54:47.4359966Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:47.4360257Z               "line": 469
2026-08-28T09:54:47.4360519Z             },
2026-08-28T09:54:47.4360789Z             {
2026-08-28T09:54:47.4361183Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:47.4361455Z               "line": 573
2026-08-28T09:54:47.4361709Z             },
2026-08-28T09:54:47.4361970Z             {
2026-08-28T09:54:47.4362352Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4362634Z               "line": 1475
2026-08-28T09:54:47.4362900Z             },
2026-08-28T09:54:47.4363161Z             {
2026-08-28T09:54:47.4363554Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4363821Z               "line": 1505
2026-08-28T09:54:47.4364089Z             },
2026-08-28T09:54:47.4364346Z             {
2026-08-28T09:54:47.4364737Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.4365013Z               "line": 1525
2026-08-28T09:54:47.4365281Z             },
2026-08-28T09:54:47.4365535Z             {
2026-08-28T09:54:47.4365920Z               "path": "crates/spt-net/src/net/mesh/seedproof.rs",
2026-08-28T09:54:47.4366215Z               "line": 602
2026-08-28T09:54:47.4366482Z             },
2026-08-28T09:54:47.4366801Z             {
2026-08-28T09:54:47.4367178Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4367459Z               "line": 190
2026-08-28T09:54:47.4367721Z             },
2026-08-28T09:54:47.4367987Z             {
2026-08-28T09:54:47.4368363Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4368642Z               "line": 211
2026-08-28T09:54:47.4368905Z             },
2026-08-28T09:54:47.4369257Z             {
2026-08-28T09:54:47.4369624Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4369968Z               "line": 223
2026-08-28T09:54:47.4370230Z             },
2026-08-28T09:54:47.4370507Z             {
2026-08-28T09:54:47.4370869Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:47.4371145Z               "line": 276
2026-08-28T09:54:47.4371410Z             },
2026-08-28T09:54:47.4371672Z             {
2026-08-28T09:54:47.4372030Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.4372316Z               "line": 727
2026-08-28T09:54:47.4372579Z             },
2026-08-28T09:54:47.4372845Z             {
2026-08-28T09:54:47.4373208Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.4373480Z               "line": 915
2026-08-28T09:54:47.4373749Z             },
2026-08-28T09:54:47.4374010Z             {
2026-08-28T09:54:47.4374334Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4374616Z               "line": 33644
2026-08-28T09:54:47.4374883Z             }
2026-08-28T09:54:47.4375146Z           ]
2026-08-28T09:54:47.4375407Z         }
2026-08-28T09:54:47.4375674Z       }
2026-08-28T09:54:47.4375941Z     },
2026-08-28T09:54:47.4376212Z     {
2026-08-28T09:54:47.4376499Z       "id": "REQ-MESH-5",
2026-08-28T09:54:47.4380685Z       "title": "Hard cutover from pairwise trust: delete peers.json + the is_trusted authorization path (no migration — expendable test fleet, re-pairs fresh under the new model, user decision 2026-06-08). Warn-on-change DEMOTED from a gate to an awareness notice anchored on machine_id (not label): 'machine M, last seen as K1, now presents K2' — fires the same event as the REQ-SUBNET-7 re-pair overwrite. The TrustStore/peers.json code and its call sites are removed, not left dead.",
2026-08-28T09:54:47.4381077Z       "requiredStages": [
2026-08-28T09:54:47.4381343Z         "impl",
2026-08-28T09:54:47.4381616Z         "unit"
2026-08-28T09:54:47.4381877Z       ],
2026-08-28T09:54:47.4382156Z       "stages": {
2026-08-28T09:54:47.4382417Z         "doc": {
2026-08-28T09:54:47.4382718Z           "complete": false,
2026-08-28T09:54:47.4383009Z           "evidence": []
2026-08-28T09:54:47.4383343Z         },
2026-08-28T09:54:47.4383610Z         "impl": {
2026-08-28T09:54:47.4383891Z           "complete": true,
2026-08-28T09:54:47.4384178Z           "evidence": [
2026-08-28T09:54:47.4384444Z             {
2026-08-28T09:54:47.4384838Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.4385138Z               "line": 61
2026-08-28T09:54:47.4385410Z             },
2026-08-28T09:54:47.4385687Z             {
2026-08-28T09:54:47.4386077Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.4386359Z               "line": 117
2026-08-28T09:54:47.4386626Z             },
2026-08-28T09:54:47.4386892Z             {
2026-08-28T09:54:47.4387267Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.4387549Z               "line": 104
2026-08-28T09:54:47.4387816Z             },
2026-08-28T09:54:47.4388079Z             {
2026-08-28T09:54:47.4388464Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:47.4388755Z               "line": 106
2026-08-28T09:54:47.4389113Z             },
2026-08-28T09:54:47.4389374Z             {
2026-08-28T09:54:47.4389782Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4390063Z               "line": 85
2026-08-28T09:54:47.4390326Z             },
2026-08-28T09:54:47.4390650Z             {
2026-08-28T09:54:47.4391050Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4391331Z               "line": 301
2026-08-28T09:54:47.4391603Z             },
2026-08-28T09:54:47.4391866Z             {
2026-08-28T09:54:47.4392260Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4392545Z               "line": 424
2026-08-28T09:54:47.4392812Z             },
2026-08-28T09:54:47.4393084Z             {
2026-08-28T09:54:47.4393469Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4393832Z               "line": 1158
2026-08-28T09:54:47.4394103Z             },
2026-08-28T09:54:47.4394367Z             {
2026-08-28T09:54:47.4394743Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:47.4395018Z               "line": 115
2026-08-28T09:54:47.4395282Z             },
2026-08-28T09:54:47.4395554Z             {
2026-08-28T09:54:47.4395898Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.4396275Z               "line": 102
2026-08-28T09:54:47.4396600Z             },
2026-08-28T09:54:47.4396866Z             {
2026-08-28T09:54:47.4397215Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4397496Z               "line": 193
2026-08-28T09:54:47.4397756Z             }
2026-08-28T09:54:47.4398042Z           ]
2026-08-28T09:54:47.4398300Z         },
2026-08-28T09:54:47.4398558Z         "int": {
2026-08-28T09:54:47.4398858Z           "complete": false,
2026-08-28T09:54:47.4399216Z           "evidence": []
2026-08-28T09:54:47.4399488Z         },
2026-08-28T09:54:47.4399780Z         "unit": {
2026-08-28T09:54:47.4400072Z           "complete": true,
2026-08-28T09:54:47.4400351Z           "evidence": [
2026-08-28T09:54:47.4400618Z             {
2026-08-28T09:54:47.4401014Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4401295Z               "line": 1578
2026-08-28T09:54:47.4401567Z             },
2026-08-28T09:54:47.4401830Z             {
2026-08-28T09:54:47.4402183Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:47.4402540Z               "line": 485
2026-08-28T09:54:47.4402807Z             }
2026-08-28T09:54:47.4403067Z           ]
2026-08-28T09:54:47.4403334Z         }
2026-08-28T09:54:47.4403630Z       }
2026-08-28T09:54:47.4403891Z     },
2026-08-28T09:54:47.4404157Z     {
2026-08-28T09:54:47.4404439Z       "id": "REQ-MESH-6",
2026-08-28T09:54:47.4407998Z       "title": "Concurrent liveness probes: `spt subnet status --nodes` fans out its offline/serve-probes (REQ-SUBNET-5) CONCURRENTLY — total wall-time bounded by the single-probe ceiling (~3s), never k×ceiling. The mesh makes a node see ALL members (many possibly offline), so a serial probe loop would be offline_count×3s. (Planning verifies the current REQ-SUBNET-5 probe loop's behavior and fixes it if serial.)",
2026-08-28T09:54:47.4408374Z       "requiredStages": [
2026-08-28T09:54:47.4408640Z         "impl",
2026-08-28T09:54:47.4408922Z         "unit"
2026-08-28T09:54:47.4409284Z       ],
2026-08-28T09:54:47.4409565Z       "stages": {
2026-08-28T09:54:47.4409828Z         "doc": {
2026-08-28T09:54:47.4410128Z           "complete": false,
2026-08-28T09:54:47.4410405Z           "evidence": []
2026-08-28T09:54:47.4410666Z         },
2026-08-28T09:54:47.4410935Z         "impl": {
2026-08-28T09:54:47.4411221Z           "complete": true,
2026-08-28T09:54:47.4411503Z           "evidence": [
2026-08-28T09:54:47.4411760Z             {
2026-08-28T09:54:47.4412089Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4412381Z               "line": 13800
2026-08-28T09:54:47.4412648Z             },
2026-08-28T09:54:47.4412920Z             {
2026-08-28T09:54:47.4413240Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4413524Z               "line": 13822
2026-08-28T09:54:47.4413783Z             }
2026-08-28T09:54:47.4414041Z           ]
2026-08-28T09:54:47.4414304Z         },
2026-08-28T09:54:47.4414576Z         "int": {
2026-08-28T09:54:47.4414928Z           "complete": false,
2026-08-28T09:54:47.4415219Z           "evidence": []
2026-08-28T09:54:47.4415477Z         },
2026-08-28T09:54:47.4415750Z         "unit": {
2026-08-28T09:54:47.4416042Z           "complete": true,
2026-08-28T09:54:47.4416321Z           "evidence": [
2026-08-28T09:54:47.4416589Z             {
2026-08-28T09:54:47.4416908Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4417176Z               "line": 37913
2026-08-28T09:54:47.4417433Z             },
2026-08-28T09:54:47.4417706Z             {
2026-08-28T09:54:47.4418152Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4418434Z               "line": 37940
2026-08-28T09:54:47.4418703Z             },
2026-08-28T09:54:47.4419030Z             {
2026-08-28T09:54:47.4419354Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4419626Z               "line": 37982
2026-08-28T09:54:47.4419892Z             }
2026-08-28T09:54:47.4420149Z           ]
2026-08-28T09:54:47.4420403Z         }
2026-08-28T09:54:47.4420665Z       }
2026-08-28T09:54:47.4420956Z     },
2026-08-28T09:54:47.4421226Z     {
2026-08-28T09:54:47.4421515Z       "id": "REQ-MIGRATE-1",
2026-08-28T09:54:47.4422039Z       "title": "Auto-detect and migrate a legacy claude_skill_owl install",
2026-08-28T09:54:47.4422334Z       "requiredStages": [],
2026-08-28T09:54:47.4422612Z       "stages": {
2026-08-28T09:54:47.4422879Z         "doc": {
2026-08-28T09:54:47.4423175Z           "complete": false,
2026-08-28T09:54:47.4423457Z           "evidence": []
2026-08-28T09:54:47.4423724Z         },
2026-08-28T09:54:47.4423997Z         "impl": {
2026-08-28T09:54:47.4424287Z           "complete": false,
2026-08-28T09:54:47.4424573Z           "evidence": []
2026-08-28T09:54:47.4424831Z         },
2026-08-28T09:54:47.4425350Z         "int": {
2026-08-28T09:54:47.4425641Z           "complete": false,
2026-08-28T09:54:47.4425941Z           "evidence": []
2026-08-28T09:54:47.4426199Z         },
2026-08-28T09:54:47.4426484Z         "unit": {
2026-08-28T09:54:47.4426773Z           "complete": false,
2026-08-28T09:54:47.4427140Z           "evidence": []
2026-08-28T09:54:47.4427402Z         }
2026-08-28T09:54:47.4427664Z       }
2026-08-28T09:54:47.4427932Z     },
2026-08-28T09:54:47.4428193Z     {
2026-08-28T09:54:47.4428522Z       "id": "REQ-MONIC-DELIVERY-TRIGGER",
2026-08-28T09:54:47.4482862Z       "title": "The monics a receiving agent holds that MATCH an arriving message RIDE THAT MESSAGE'S ENVELOPE as a `mnemonics-json` attribute carrying a JSON array of the matched records, so the agent reads its own standing judgement about the sender in the same breath as the message rather than having to go and look it up. THE MATCH IS EVALUATED AT THE ENVELOPE RENDERERS, NOT AT THE WAN EDGE (ruled 2026-07-31): a classification that fires only when the peer happens to be REMOTE is one the agent cannot rely on, and the trust warning's edge is the wrong home for it because that edge exists to consume the ACCESS GATE's verdict — the two are different concerns that happen to read the same register. THERE IS EXACTLY ONE EVALUATION PRIMITIVE and every delivery surface calls it: a match rule copied per surface is a classification that fires on one channel and not another, which is worse than none because the agent cannot tell which it is looking at. The renderers therefore take the RECIPIENT's id as well as the structural sender/body pair, and NO OWNER-LESS RENDERER REMAINS — a renderer that did not need the recipient is the shape a future delivery surface reaches for by habit, arriving attr-less with nothing failing. THE ATTR IS PRESENT IF AND ONLY IF SOMETHING MATCHED: an empty array would say 'evaluated, no match' where absence says 'not evaluated', a distinction no consumer has a use for and a second shape every consumer would have to handle. THE TRIGGER VOCABULARY IS RATIFIED (operator ruling 2026-08-03, superseding W5's sender-match-only limit) AND IT BINDS BOTH CONSUMERS — this edge and the now-signal MONICS surface — precisely so that the second consumer adds a CONSUMER and never a record migration. Triggers are a JSON array of matchers over five kinds: `sender` (identity match on the PROVEN sender id, which is the trust warning's classification question and the only kind that answers it), `content` (the incoming message body), `json` (a custom payload), `user_input` and `agent_output`. MATCHING COPIES THE KEYWORD-HINTS RULE VERBATIM — a literal CASE-INSENSITIVE SUBSTRING by default, a REGEX when `regex` is set, and an INVALID REGEX NEVER MATCHES (a bad pattern silences its own trigger and never panics) — and it copies it BY CALLING IT: the rule lives in one place with two consumers, because a rule copied verbatim into a second place is two rules that merely agree today. Literal-by-default is what lets a trigger carry arbitrary symbols with no escaping burden. WHICH KINDS HAVE A LIVE CONSUMER IS A SEPARATE QUESTION FROM WHICH ARE RATIFIED: `sender`, `content` and `json` evaluate at this edge, which exists; `user_input` and `agent_output` are RATIFIED BUT INERT until the now-signal / IO-parser funnel is built, and a record carrying one is not malformed — it is waiting for its consumer. Reading 'ratified' as 'has a live consumer' is the error this clause exists to prevent, and any surface that lists a trigger must say which it is looking at. THE TWO EDGE QUESTIONS ARE DELIBERATELY ASYMMETRIC AFTER THE RE-KEY: a content-triggered monic rides a message it matched WITHOUT classifying its sender, because classification is a `sender` question — so the delivery attr can be present where the trust warning still treats the peer as a stranger. The direction that must hold is the one that protects the agent: anything that classifies the sender ALSO matches the delivery, so an agent is never warned about a stranger whose monic it was handed in the same envelope. The ARRAY shape is not premature generality but the ratified envelope contract, and it is what lets a trigger kind matching several records ride with no envelope change. THE READ IS STORE-FREE AND PURE-PATH, off the tracked root, for the reason the trust warning's is: it happens on the inbound message path, where the store's ensure-worktree spawns git per message. A RECIPIENT WITH NO MIND — a shell link, an agent that has classified nobody — READS NOTHING AND GETS NO ATTR, and that is the primitive telling the truth rather than a case to special-case; it costs one sentence in the module doc, not a branch. An UNREADABLE record rides nothing, the same fail-safe reading the trust warning takes, and the two consumers are asserted to agree over every state a record can be in — an agent must never be warned about a stranger whose monic it was handed in the same envelope. The attr KEY is a compile-time constant and its VALUE is attr-escaped by the one composer, so monic text carrying quotes or angle brackets cannot forge an attribute or terminate the envelope. STATED LIMIT, NAMING ITS ONE PEER-TRAFFIC CASE: a body that is ALREADY a typed envelope passes through verbatim and carries no attr — splicing an attribute into a finished envelope means re-hand-rolling the grammar this codebase consolidated into one composer, and typed envelopes are otherwise machinery (notify, file-drop, echo-commune) that is not peer chatter. THE ONE CASE WHERE IT BITES PEER TRAFFIC IS `restamp_wan_user_msg` IN THE WAN EDGE, named here exactly so a later wave can lift it without re-deriving which path is meant: a FORGED `user-msg` — one whose sender the daemon could not prove — is re-stamped into a typed plain-`msg` envelope, which then rides as a typed body and gets no attr. What is lost there is the MONIC RIDE, never the caution: the trust warning is composed at that same edge from the gate's verdict and is untouched by this leg, and an unprovable sender is warned about unsuppressibly in any case. Lifting the limit means re-composing the restamp through the owner-aware renderer, which requires threading the RECIPIENT into `restamp_*` — real work on adversarial-path code, deliberately not taken in this wave, and to be requested through the board rather than bled into a neighbouring change. A SENDER-SUPPLIED TYPED ENVELOPE CANNOT CLAIM THE RECEIVER'S JUDGEMENT: every inbound `mnemonics-json` attribute is stripped at `receive_wan` before delivery, while the peer's body remains unchanged; the forged value is inert. Gate: impl — the one match primitive over the tracked root, the msg composer's extra-attribute form, the owner-aware renderers on both delivery edges, and every production render site converted to hand over its recipient; unit — a sender-matched monic rides as a JSON array carrying the record verbatim with `from` still first and BOTH edges composing identically, an unclassified sender and a mindless recipient get no attr at all, a husk rides nothing AND reads identically to the warning predicate over every state, a typed body carries no attr even when a monic matches, monic text full of envelope metacharacters cannot break out of the attr, and the attr survives the listener's chunk/reassemble round trip.",
2026-08-28T09:54:47.4483912Z       "requiredStages": [
2026-08-28T09:54:47.4484173Z         "doc",
2026-08-28T09:54:47.4484449Z         "impl",
2026-08-28T09:54:47.4484714Z         "unit"
2026-08-28T09:54:47.4484972Z       ],
2026-08-28T09:54:47.4485243Z       "stages": {
2026-08-28T09:54:47.4485510Z         "doc": {
2026-08-28T09:54:47.4485811Z           "complete": true,
2026-08-28T09:54:47.4486082Z           "evidence": [
2026-08-28T09:54:47.4486339Z             {
2026-08-28T09:54:47.4486635Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4486921Z               "line": 1106
2026-08-28T09:54:47.4487199Z             },
2026-08-28T09:54:47.4487478Z             {
2026-08-28T09:54:47.4487872Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:47.4488149Z               "line": 405
2026-08-28T09:54:47.4488412Z             }
2026-08-28T09:54:47.4488673Z           ]
2026-08-28T09:54:47.4489031Z         },
2026-08-28T09:54:47.4489297Z         "impl": {
2026-08-28T09:54:47.4489583Z           "complete": true,
2026-08-28T09:54:47.4489864Z           "evidence": [
2026-08-28T09:54:47.4490200Z             {
2026-08-28T09:54:47.4490547Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4490825Z               "line": 34
2026-08-28T09:54:47.4491097Z             },
2026-08-28T09:54:47.4491359Z             {
2026-08-28T09:54:47.4491698Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4491989Z               "line": 65
2026-08-28T09:54:47.4492256Z             },
2026-08-28T09:54:47.4492523Z             {
2026-08-28T09:54:47.4492864Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4493141Z               "line": 130
2026-08-28T09:54:47.4493465Z             },
2026-08-28T09:54:47.4493732Z             {
2026-08-28T09:54:47.4494061Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4494338Z               "line": 149
2026-08-28T09:54:47.4494600Z             },
2026-08-28T09:54:47.4494864Z             {
2026-08-28T09:54:47.4495264Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4495617Z               "line": 205
2026-08-28T09:54:47.4495885Z             },
2026-08-28T09:54:47.4496128Z             {
2026-08-28T09:54:47.4496504Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4496777Z               "line": 330
2026-08-28T09:54:47.4497034Z             },
2026-08-28T09:54:47.4497300Z             {
2026-08-28T09:54:47.4497664Z               "path": "crates/spt-store/src/matchrule.rs",
2026-08-28T09:54:47.4497938Z               "line": 27
2026-08-28T09:54:47.4498198Z             },
2026-08-28T09:54:47.4498465Z             {
2026-08-28T09:54:47.4498818Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4499180Z               "line": 715
2026-08-28T09:54:47.4499448Z             },
2026-08-28T09:54:47.4499710Z             {
2026-08-28T09:54:47.4500067Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4500340Z               "line": 646
2026-08-28T09:54:47.4500708Z             },
2026-08-28T09:54:47.4500971Z             {
2026-08-28T09:54:47.4501328Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.4501609Z               "line": 1228
2026-08-28T09:54:47.4501872Z             },
2026-08-28T09:54:47.4502129Z             {
2026-08-28T09:54:47.4502483Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:47.4502768Z               "line": 126
2026-08-28T09:54:47.4503029Z             },
2026-08-28T09:54:47.4503287Z             {
2026-08-28T09:54:47.4503601Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4503944Z               "line": 11681
2026-08-28T09:54:47.4504217Z             },
2026-08-28T09:54:47.4504484Z             {
2026-08-28T09:54:47.4504799Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4505080Z               "line": 11829
2026-08-28T09:54:47.4505352Z             }
2026-08-28T09:54:47.4505616Z           ]
2026-08-28T09:54:47.4505882Z         },
2026-08-28T09:54:47.4506154Z         "int": {
2026-08-28T09:54:47.4506445Z           "complete": false,
2026-08-28T09:54:47.4506726Z           "evidence": []
2026-08-28T09:54:47.4506984Z         },
2026-08-28T09:54:47.4507250Z         "unit": {
2026-08-28T09:54:47.4507545Z           "complete": true,
2026-08-28T09:54:47.4507822Z           "evidence": [
2026-08-28T09:54:47.4508084Z             {
2026-08-28T09:54:47.4508427Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4508706Z               "line": 1838
2026-08-28T09:54:47.4509049Z             },
2026-08-28T09:54:47.4509312Z             {
2026-08-28T09:54:47.4509655Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4509936Z               "line": 311
2026-08-28T09:54:47.4510199Z             },
2026-08-28T09:54:47.4510452Z             {
2026-08-28T09:54:47.4510795Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4511079Z               "line": 339
2026-08-28T09:54:47.4511339Z             },
2026-08-28T09:54:47.4511606Z             {
2026-08-28T09:54:47.4511935Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4512288Z               "line": 355
2026-08-28T09:54:47.4512555Z             },
2026-08-28T09:54:47.4512808Z             {
2026-08-28T09:54:47.4513142Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4513415Z               "line": 396
2026-08-28T09:54:47.4513682Z             },
2026-08-28T09:54:47.4513941Z             {
2026-08-28T09:54:47.4514289Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4514566Z               "line": 412
2026-08-28T09:54:47.4514838Z             },
2026-08-28T09:54:47.4515162Z             {
2026-08-28T09:54:47.4515501Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4515778Z               "line": 432
2026-08-28T09:54:47.4516030Z             },
2026-08-28T09:54:47.4516296Z             {
2026-08-28T09:54:47.4516628Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4516909Z               "line": 461
2026-08-28T09:54:47.4517166Z             },
2026-08-28T09:54:47.4517433Z             {
2026-08-28T09:54:47.4517810Z               "path": "crates/spt-store/src/matchrule.rs",
2026-08-28T09:54:47.4518077Z               "line": 43
2026-08-28T09:54:47.4518345Z             },
2026-08-28T09:54:47.4518602Z             {
2026-08-28T09:54:47.4519062Z               "path": "crates/spt-store/src/matchrule.rs",
2026-08-28T09:54:47.4519328Z               "line": 73
2026-08-28T09:54:47.4519581Z             },
2026-08-28T09:54:47.4519834Z             {
2026-08-28T09:54:47.4520191Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4520464Z               "line": 1541
2026-08-28T09:54:47.4520726Z             }
2026-08-28T09:54:47.4520987Z           ]
2026-08-28T09:54:47.4521245Z         }
2026-08-28T09:54:47.4521511Z       }
2026-08-28T09:54:47.4521772Z     },
2026-08-28T09:54:47.4522029Z     {
2026-08-28T09:54:47.4522349Z       "id": "REQ-MONIC-HUSK-PRESENT",
2026-08-28T09:54:47.4546595Z       "title": "A PRESENT-BUT-UNREADABLE monic record — a HUSK — COUNTS AS PRESENT when `add` and `update` classify what they found (ratified 2026-08-04, bag grill; this REVERSES the reading that shipped in W5 and was deliberately preserved through the releases#70 re-key). The question the two verbs ask is whether the monic id is already SPOKEN FOR, and a file filed under that id speaks for it whether or not anything can parse the bytes. So `add` REFUSES a husk, naming it as unreadable and pointing at `update` and `remove`, and `update` PROCEEDS over one, announcing the replacement out loud. The superseded polarity was not dishonest — both arms said what they saw — but it made `add`, the verb whose entire job is refusing to clobber what is already filed, the one that destroyed content, and `update`, the verb whose job IS replacement, the one that refused to perform it; it then instructed the caller to reach for the destructive verb in order to replace a record, teaching precisely the reflex the add/update split exists to prevent, in the ONE case where the operator cannot read the old content to judge what the replacement costs. THE ESCAPE HATCH IS VERIFIED, NOT BUILT: making `add` refuse a husk would strand a caller only if nothing else could clear a corrupt record, and `remove` decides on FILE EXISTENCE rather than readability, so it already withdraws a husk by construction — no `--force` flag is minted, and that shipped property is asserted by a test rather than trusted. THE POLARITY IS ONE FACT AND MUST BE SPELLED THE SAME EVERYWHERE IT IS ENCODED: the CLI's classify call, the store's own add/update primitive, and every printed line that names a verb for an unreadable record — a listing hint still pointing at `add` would be a surface instructing the caller to run the arm that now refuses. UNCHANGED, deliberately: the DELIVERY EDGE still reads a husk as never-classified (it fails safe — it warns more, never less), and the LISTING still shows a husk under its own id marked unreadable. Gate: doc — the CONTEXT.md mnemonics entry states the ratified polarity, the reason the previous reading was reversed, the verified escape hatch, and what stayed unchanged; impl — the classification input counts a husk as present at BOTH encoding sites (the CLI verb path and the store's write primitive, which classifies on the FILE question rather than on a successful parse), the `add` arm refuses with the unreadable diagnosis naming `update` and `remove`, the `update` arm proceeds and keeps the announced-replacement line, and the listing's advice names the verb that now replaces; unit — a husk REFUSES `add` as Exists AND SURVIVES THE REFUSAL UNREAD (the refusal is not a partial write, which is the whole point of refusing over content nobody can read), a husk is REPAIRED IN PLACE by `update` (the caller has no other route to repair), and `remove` withdraws a husk and stays idempotent over the cleared id, proving the escape hatch that made the `add` refusal safe to ship.",
2026-08-28T09:54:47.4547224Z       "requiredStages": [
2026-08-28T09:54:47.4547506Z         "doc",
2026-08-28T09:54:47.4547810Z         "impl",
2026-08-28T09:54:47.4548188Z         "unit"
2026-08-28T09:54:47.4548456Z       ],
2026-08-28T09:54:47.4548723Z       "stages": {
2026-08-28T09:54:47.4549056Z         "doc": {
2026-08-28T09:54:47.4549338Z           "complete": true,
2026-08-28T09:54:47.4549619Z           "evidence": [
2026-08-28T09:54:47.4549892Z             {
2026-08-28T09:54:47.4550197Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4550469Z               "line": 1104
2026-08-28T09:54:47.4550734Z             }
2026-08-28T09:54:47.4551008Z           ]
2026-08-28T09:54:47.4551280Z         },
2026-08-28T09:54:47.4551552Z         "impl": {
2026-08-28T09:54:47.4551843Z           "complete": true,
2026-08-28T09:54:47.4552110Z           "evidence": [
2026-08-28T09:54:47.4552363Z             {
2026-08-28T09:54:47.4552717Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4552993Z               "line": 545
2026-08-28T09:54:47.4553334Z             },
2026-08-28T09:54:47.4553599Z             {
2026-08-28T09:54:47.4553928Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4554204Z               "line": 5668
2026-08-28T09:54:47.4554496Z             },
2026-08-28T09:54:47.4554776Z             {
2026-08-28T09:54:47.4555106Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4555392Z               "line": 5930
2026-08-28T09:54:47.4555660Z             }
2026-08-28T09:54:47.4555927Z           ]
2026-08-28T09:54:47.4556191Z         },
2026-08-28T09:54:47.4556468Z         "int": {
2026-08-28T09:54:47.4556807Z           "complete": false,
2026-08-28T09:54:47.4557093Z           "evidence": []
2026-08-28T09:54:47.4557356Z         },
2026-08-28T09:54:47.4557622Z         "unit": {
2026-08-28T09:54:47.4557923Z           "complete": true,
2026-08-28T09:54:47.4558201Z           "evidence": [
2026-08-28T09:54:47.4558470Z             {
2026-08-28T09:54:47.4558816Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4559193Z               "line": 1426
2026-08-28T09:54:47.4559451Z             },
2026-08-28T09:54:47.4559717Z             {
2026-08-28T09:54:47.4560065Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4560351Z               "line": 1503
2026-08-28T09:54:47.4560618Z             },
2026-08-28T09:54:47.4560880Z             {
2026-08-28T09:54:47.4561204Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4561474Z               "line": 24463
2026-08-28T09:54:47.4561741Z             }
2026-08-28T09:54:47.4562003Z           ]
2026-08-28T09:54:47.4562269Z         }
2026-08-28T09:54:47.4562527Z       }
2026-08-28T09:54:47.4562789Z     },
2026-08-28T09:54:47.4563057Z     {
2026-08-28T09:54:47.4563362Z       "id": "REQ-MONIC-STORE",
2026-08-28T09:54:47.4604544Z       "title": "A monic — a REACTIONARY STRING: a trigger set plus a body revealed when something in the endpoint's session matches — is stored IN THAT AGENT'S OWN MIND TIER, ONE FILE PER RECORD, at `tracked/agents/<id>/monics/<monic-id>`. A MONIC IS NOT INHERENTLY ABOUT A PEER: classifying a peer is one use of ONE trigger kind, not the definition, and identity is the MONIC ID, which is not necessarily any of its triggers. Two properties are load-bearing and neither is a layout preference. FIRST, it is mind, so it replicates with the mind: same branch, same commits, same sync path, no second store to keep in step and no chance of an agent's instances disagreeing about what the agent decided because a side-store did not travel. SECOND, ONE FILE PER RECORD, because the mind's merge driver resolves PER FILE PATH and never merges contents — so the path granularity IS the conflict granularity. With every monic in one file, two instances of the same agent writing DIFFERENT monics concurrently would collide on that single path and surface a whole-file conflict — a conflict about nothing, between two facts that never disagreed, which the agent must then resolve by hand. Per-record files make those writes invisible to each other and confine a genuine conflict to the one record both instances actually wrote. Per-record is strictly finer-grained than per-peer, so this addressing IMPROVES conflict behaviour rather than trading it away. A SINGLE-FILE STORE IN THE MIND TIER IS REFUSED — sqlite or one json — for that same reason plus the sidecar problem: WAL/SHM files would materialise as untracked artifacts inside a git-replicated worktree. Lookup cost is a SEPARATE OBJECT from the record: if the delivery edge's scan is ever MEASURED to matter the answer is a node-local derived index outside the mind tier, rebuildable from the files, and NO INDEX IS MINTED UNTIL A MEASUREMENT ASKS FOR ONE. The record carries its own id as a field as well as in its filename, so a record recovered from a conflict artifact, a bundle or a copy still knows what it is and a filename/field disagreement is detectable rather than silently resolved. W5 RECORDS DO NEED A MIGRATION (operator-ruled 2026-08-03, superseding the previous never-migrated commitment, which covered ADDING A FIELD to a peer-keyed record and never covered a RE-KEY): a W5 record maps to id = the old peer-id, triggers = one sender trigger on that peer-id, body unchanged. The mapping is applied AT READ so every reader is correct immediately — including the store-free readers on the inbound message path, which cannot write anything back — and an in-place rewrite makes the stored bytes say what the record means; the rewrite is IDEMPOTENT, because every write here is a commit that replicates. A monic id is charset-validated as an endpoint id before it becomes a path component or a tracked filename — an unvalidated one is a traversal out of the mind — while a TRIGGER PATTERN is deliberately NOT so constrained, since it never touches the filesystem and must be able to carry arbitrary symbols. The store answers the trust warning's question as a NAMED PREDICATE — does this endpoint hold any monic whose SENDER trigger matches this peer, a scan of the monic directory rather than one path-addressed read — so the warning path never decides on its own what an absent-versus-unreadable record means; classification is monic-only, and an access-rule entry naming a peer is not a classification. Removal is idempotent and tracked — a withdrawn monic must not survive at the branch tip. Gate: impl — the monic-id-keyed record with its trigger set and origin provenance, the CRUD over the mind worktree with a checkpoint per mutation, the read-side legacy upgrade and the idempotent in-place migration, the classification predicate as a sender-trigger scan, and monic-id validation on every path-forming call; unit — the CRUD round trip (a rewrite REPLACES rather than accumulating, removal idempotent, an agent holding nothing lists nothing rather than erroring on an absent directory, monics are per-owner), a write and a removal are both visible at the mind's own branch tip, an illegal monic id is refused rather than written WHILE a trigger pattern full of metacharacters is accepted and matches literally, THE RE-KEY ROW — a monic's id is INDEPENDENT of the peers it classifies, proven by a record whose id is not the peer it classifies, one record classifying several peers, and several records classifying one peer, none of which is expressible under peer-keying — THE MIGRATION ROW — a planted W5 record reads correctly through every path before any rewrite, then rewrites in place to the current shape, idempotently, with a husk left as a husk rather than repaired into an invented record — and THE STORAGE-SHAPE ROW — two instances of the same agent writing DIFFERENT MONICS concurrently merge through the REAL sync path with ZERO conflicts and neither side clobbered, WITH a SAME-MONIC control proving the same path does surface a real disagreement (without the control the row would pass on a merge path that never conflicts about anything).",
2026-08-28T09:54:47.4605440Z       "requiredStages": [
2026-08-28T09:54:47.4605702Z         "doc",
2026-08-28T09:54:47.4605969Z         "impl",
2026-08-28T09:54:47.4606235Z         "unit"
2026-08-28T09:54:47.4606500Z       ],
2026-08-28T09:54:47.4606772Z       "stages": {
2026-08-28T09:54:47.4607038Z         "doc": {
2026-08-28T09:54:47.4607319Z           "complete": true,
2026-08-28T09:54:47.4607616Z           "evidence": [
2026-08-28T09:54:47.4607882Z             {
2026-08-28T09:54:47.4608183Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4608461Z               "line": 1095
2026-08-28T09:54:47.4608728Z             },
2026-08-28T09:54:47.4609079Z             {
2026-08-28T09:54:47.4609484Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:47.4609765Z               "line": 32
2026-08-28T09:54:47.4610029Z             }
2026-08-28T09:54:47.4610295Z           ]
2026-08-28T09:54:47.4610557Z         },
2026-08-28T09:54:47.4610833Z         "impl": {
2026-08-28T09:54:47.4611133Z           "complete": true,
2026-08-28T09:54:47.4611422Z           "evidence": [
2026-08-28T09:54:47.4611684Z             {
2026-08-28T09:54:47.4612060Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4612408Z               "line": 470
2026-08-28T09:54:47.4612676Z             },
2026-08-28T09:54:47.4612952Z             {
2026-08-28T09:54:47.4613309Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4613592Z               "line": 594
2026-08-28T09:54:47.4613855Z             },
2026-08-28T09:54:47.4614119Z             {
2026-08-28T09:54:47.4614465Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4614746Z               "line": 782
2026-08-28T09:54:47.4615008Z             },
2026-08-28T09:54:47.4615332Z             {
2026-08-28T09:54:47.4615680Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4615962Z               "line": 793
2026-08-28T09:54:47.4616224Z             },
2026-08-28T09:54:47.4621055Z             {
2026-08-28T09:54:47.4621470Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4621750Z               "line": 815
2026-08-28T09:54:47.4622020Z             },
2026-08-28T09:54:47.4622287Z             {
2026-08-28T09:54:47.4622658Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4622940Z               "line": 843
2026-08-28T09:54:47.4623212Z             },
2026-08-28T09:54:47.4623475Z             {
2026-08-28T09:54:47.4623837Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4624119Z               "line": 875
2026-08-28T09:54:47.4624380Z             }
2026-08-28T09:54:47.4624650Z           ]
2026-08-28T09:54:47.4624911Z         },
2026-08-28T09:54:47.4625187Z         "int": {
2026-08-28T09:54:47.4625483Z           "complete": false,
2026-08-28T09:54:47.4625774Z           "evidence": []
2026-08-28T09:54:47.4626032Z         },
2026-08-28T09:54:47.4626303Z         "unit": {
2026-08-28T09:54:47.4626599Z           "complete": true,
2026-08-28T09:54:47.4626879Z           "evidence": [
2026-08-28T09:54:47.4627145Z             {
2026-08-28T09:54:47.4627500Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4627792Z               "line": 1119
2026-08-28T09:54:47.4628158Z             },
2026-08-28T09:54:47.4628440Z             {
2026-08-28T09:54:47.4628793Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4629151Z               "line": 1173
2026-08-28T09:54:47.4629432Z             },
2026-08-28T09:54:47.4629689Z             {
2026-08-28T09:54:47.4630051Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4630332Z               "line": 1246
2026-08-28T09:54:47.4630600Z             },
2026-08-28T09:54:47.4630858Z             {
2026-08-28T09:54:47.4631224Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4631577Z               "line": 1296
2026-08-28T09:54:47.4631849Z             },
2026-08-28T09:54:47.4632117Z             {
2026-08-28T09:54:47.4632463Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4632752Z               "line": 1709
2026-08-28T09:54:47.4633018Z             },
2026-08-28T09:54:47.4633285Z             {
2026-08-28T09:54:47.4633638Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4633924Z               "line": 1961
2026-08-28T09:54:47.4634191Z             }
2026-08-28T09:54:47.4634463Z           ]
2026-08-28T09:54:47.4634730Z         }
2026-08-28T09:54:47.4634994Z       }
2026-08-28T09:54:47.4635258Z     },
2026-08-28T09:54:47.4635517Z     {
2026-08-28T09:54:47.4635823Z       "id": "REQ-MONIC-VERBS",
2026-08-28T09:54:47.4675511Z       "title": "An agent edits its own monics through `spt endpoint monic <list|add|update|remove> [--owner <id>]` and copies another endpoint's through `spt endpoint monic clone <monic-id>|--all --from <src> [--to <dst>] [--overwrite]`. ADD, UPDATE AND REMOVE REQUIRE `--target <monic-id>`; ADD AND UPDATE REQUIRE `--triggers <triggers-json>`; AND THE BODY ARRIVES ON STDIN, because a monic body is prose carrying newlines, quotes and shell metacharacters, which an argv-borne body hands to whatever shell is in the middle to mangle. ONE STDIN PAYLOAD MAY CARRY SEVERAL MONICS: the multi-record form takes whole records from stdin as a JSON array, each with its own id, triggers and body, and it is a DISTINCT INPUT SHAPE from the single-record form rather than a reinterpretation of it — the flags name the record and stdin is its body, so a payload that also had to carry ids would be two sources for one fact, and the surface refuses the two spellings together so neither is ever ambiguous. A multi-record write applies RECORD BY RECORD and does not roll back what already landed, because each record is an independent fact and a partial application that names exactly which ids landed is more recoverable than an all-or-nothing failure the operator must then diagnose; the exit code is non-zero if ANY record was refused, so a script cannot read a partial application as success. NO MONIC VERB IS EVER ELEVATION-GATED (ratified): a monic is the agent's own judgement, written by the agent, and an agent holds no OS privilege to prove — gating one would make an agent's own mind editable only by the human standing at the machine, which is the opposite of what the register is for. That invariant is a CHECKED PROPERTY, not a comment: the verbs' one decision point TAKES the process's real elevation and ignores it, so a gate added later in either direction fails a test rather than passing unnoticed as a filled-in absence. ADD AND UPDATE ARE SEPARATE VERBS because they refuse opposite states — add refuses to replace a monic that already exists, update refuses to invent one that does not — so a typo'd id or a re-run script cannot quietly change a record; the refusal names the other verb. THE LISTING SHOWS UNREADABLE RECORDS AS UNREADABLE. A record that is present and unparseable reads as never having matched at the delivery edge, which is correct there because it fails safe (it warns more, never less) — but a husk that also vanishes from the listing is a file the agent can neither act on nor discover, the erased-distinction class. So the list names it UNDER ITS OWN MONIC ID, marks it unreadable, and points at the verb that rewrites it. The listing also states a trigger kind that is RATIFIED BUT INERT as such, since a trigger that cannot fire today must not be presented as working. CLONE COPIES THROUGH THE FORK'S COPY SEAM (REQ-FORK-MIND-COMPLETE), not a second copy path, and copies the source's mind AT ITS TIP; a record the destination already holds under that id is KEPT and reported rather than silently replaced (--overwrite is the deliberate replacement), and every copied record is re-stamped as inherited so the destination can tell its own monics from the ones it was handed. A husk in the source travels as a husk — visible in the destination's listing, never dropped and never invented. A clone that copies nothing mints nothing: no branch, no worktree, no empty commit. Gate: impl — the five verbs over the monic store with owner defaulting to the session's own endpoint, the stdin body read, the trigger-set parse with an unparseable set REFUSED rather than defaulted to empty, the multi-record payload form, the elevation-taking decision function, the add/update preconditions, the unreadable-record row in the listing, and the clone routed through the shared copy seam; unit — the elevation table (every verb x record-present/absent yields the SAME outcome under elevated, not-elevated and undeterminable), the add/update split including the husk reading ratified 2026-08-04 (a husk is PRESENT for these verbs, so add refuses it with the unreadable diagnosis and update replaces it while announcing that it did — see REQ-MONIC-HUSK-PRESENT, which owns that polarity and its escape hatch), the clap surface (bare `monic` lists, --target and --triggers required without the multi-record flag and refused with it, clone takes exactly one selector), the two-part husk row (delivery edge says never-matched, list path names it unreadable under its id), and the clone rows (existing destination record kept and reported, --overwrite replaces, copies stamped inherited, source untouched, self-clone refused, nothing-to-copy mints no mind).",
2026-08-28T09:54:47.4676309Z       "requiredStages": [
2026-08-28T09:54:47.4676585Z         "doc",
2026-08-28T09:54:47.4676862Z         "impl",
2026-08-28T09:54:47.4677143Z         "unit"
2026-08-28T09:54:47.4677403Z       ],
2026-08-28T09:54:47.4677688Z       "stages": {
2026-08-28T09:54:47.4677960Z         "doc": {
2026-08-28T09:54:47.4678260Z           "complete": true,
2026-08-28T09:54:47.4678537Z           "evidence": [
2026-08-28T09:54:47.4678809Z             {
2026-08-28T09:54:47.4679195Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4679538Z               "line": 1103
2026-08-28T09:54:47.4679806Z             },
2026-08-28T09:54:47.4680075Z             {
2026-08-28T09:54:47.4680464Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:47.4680741Z               "line": 74
2026-08-28T09:54:47.4681012Z             }
2026-08-28T09:54:47.4681279Z           ]
2026-08-28T09:54:47.4681546Z         },
2026-08-28T09:54:47.4681813Z         "impl": {
2026-08-28T09:54:47.4682257Z           "complete": true,
2026-08-28T09:54:47.4682557Z           "evidence": [
2026-08-28T09:54:47.4682814Z             {
2026-08-28T09:54:47.4683176Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4683457Z               "line": 544
2026-08-28T09:54:47.4683725Z             },
2026-08-28T09:54:47.4683987Z             {
2026-08-28T09:54:47.4684349Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4684631Z               "line": 776
2026-08-28T09:54:47.4684899Z             },
2026-08-28T09:54:47.4685168Z             {
2026-08-28T09:54:47.4685519Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4685800Z               "line": 794
2026-08-28T09:54:47.4686067Z             },
2026-08-28T09:54:47.4686320Z             {
2026-08-28T09:54:47.4686663Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4686949Z               "line": 844
2026-08-28T09:54:47.4687207Z             },
2026-08-28T09:54:47.4687479Z             {
2026-08-28T09:54:47.4687851Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4688210Z               "line": 973
2026-08-28T09:54:47.4688477Z             },
2026-08-28T09:54:47.4688739Z             {
2026-08-28T09:54:47.4689163Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4689440Z               "line": 5595
2026-08-28T09:54:47.4689707Z             },
2026-08-28T09:54:47.4689964Z             {
2026-08-28T09:54:47.4690299Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4690578Z               "line": 5835
2026-08-28T09:54:47.4690843Z             },
2026-08-28T09:54:47.4691171Z             {
2026-08-28T09:54:47.4691495Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4691773Z               "line": 5902
2026-08-28T09:54:47.4692035Z             },
2026-08-28T09:54:47.4692308Z             {
2026-08-28T09:54:47.4692651Z               "path": "crates/spt/src/monicverb.rs",
2026-08-28T09:54:47.4692938Z               "line": 23
2026-08-28T09:54:47.4693204Z             },
2026-08-28T09:54:47.4693454Z             {
2026-08-28T09:54:47.4693807Z               "path": "crates/spt/src/monicverb.rs",
2026-08-28T09:54:47.4694084Z               "line": 58
2026-08-28T09:54:47.4694351Z             }
2026-08-28T09:54:47.4694623Z           ]
2026-08-28T09:54:47.4694890Z         },
2026-08-28T09:54:47.4695168Z         "int": {
2026-08-28T09:54:47.4695469Z           "complete": false,
2026-08-28T09:54:47.4695771Z           "evidence": []
2026-08-28T09:54:47.4696045Z         },
2026-08-28T09:54:47.4696317Z         "unit": {
2026-08-28T09:54:47.4696608Z           "complete": true,
2026-08-28T09:54:47.4696903Z           "evidence": [
2026-08-28T09:54:47.4697171Z             {
2026-08-28T09:54:47.4697533Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4697824Z               "line": 1364
2026-08-28T09:54:47.4698096Z             },
2026-08-28T09:54:47.4698397Z             {
2026-08-28T09:54:47.4698836Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4699212Z               "line": 1421
2026-08-28T09:54:47.4699580Z             },
2026-08-28T09:54:47.4699948Z             {
2026-08-28T09:54:47.4700453Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4700902Z               "line": 1845
2026-08-28T09:54:47.4701314Z             },
2026-08-28T09:54:47.4701704Z             {
2026-08-28T09:54:47.4702152Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.4702447Z               "line": 1944
2026-08-28T09:54:47.4702806Z             },
2026-08-28T09:54:47.4703072Z             {
2026-08-28T09:54:47.4703416Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4703702Z               "line": 30453
2026-08-28T09:54:47.4703972Z             },
2026-08-28T09:54:47.4704249Z             {
2026-08-28T09:54:47.4704610Z               "path": "crates/spt/src/monicverb.rs",
2026-08-28T09:54:47.4704906Z               "line": 93
2026-08-28T09:54:47.4705178Z             },
2026-08-28T09:54:47.4705446Z             {
2026-08-28T09:54:47.4705812Z               "path": "crates/spt/src/monicverb.rs",
2026-08-28T09:54:47.4706104Z               "line": 118
2026-08-28T09:54:47.4706370Z             }
2026-08-28T09:54:47.4706639Z           ]
2026-08-28T09:54:47.4706910Z         }
2026-08-28T09:54:47.4707158Z       }
2026-08-28T09:54:47.4707421Z     },
2026-08-28T09:54:47.4707679Z     {
2026-08-28T09:54:47.4707970Z       "id": "REQ-MSG-1",
2026-08-28T09:54:47.4709501Z       "title": "Local message delivery: TCP-first to a registered address, spool fallback when offline; id->address via registry (stale-clean first); reply routing (__REPLY_TO__)",
2026-08-28T09:54:47.4709816Z       "requiredStages": [
2026-08-28T09:54:47.4710092Z         "impl",
2026-08-28T09:54:47.4710359Z         "unit",
2026-08-28T09:54:47.4710636Z         "int"
2026-08-28T09:54:47.4710903Z       ],
2026-08-28T09:54:47.4711180Z       "stages": {
2026-08-28T09:54:47.4711448Z         "doc": {
2026-08-28T09:54:47.4711741Z           "complete": false,
2026-08-28T09:54:47.4712130Z           "evidence": []
2026-08-28T09:54:47.4712397Z         },
2026-08-28T09:54:47.4712678Z         "impl": {
2026-08-28T09:54:47.4712973Z           "complete": true,
2026-08-28T09:54:47.4713265Z           "evidence": [
2026-08-28T09:54:47.4713527Z             {
2026-08-28T09:54:47.4713908Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4714190Z               "line": 28
2026-08-28T09:54:47.4714457Z             },
2026-08-28T09:54:47.4714714Z             {
2026-08-28T09:54:47.4715081Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4715434Z               "line": 100
2026-08-28T09:54:47.4715705Z             },
2026-08-28T09:54:47.4715973Z             {
2026-08-28T09:54:47.4716340Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4716627Z               "line": 133
2026-08-28T09:54:47.4716891Z             },
2026-08-28T09:54:47.4717160Z             {
2026-08-28T09:54:47.4717509Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4717785Z               "line": 171
2026-08-28T09:54:47.4718052Z             },
2026-08-28T09:54:47.4718315Z             {
2026-08-28T09:54:47.4718677Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4719035Z               "line": 196
2026-08-28T09:54:47.4719307Z             },
2026-08-28T09:54:47.4719568Z             {
2026-08-28T09:54:47.4719937Z               "path": "crates/spt-msg/src/listener.rs",
2026-08-28T09:54:47.4720215Z               "line": 18
2026-08-28T09:54:47.4720491Z             },
2026-08-28T09:54:47.4720759Z             {
2026-08-28T09:54:47.4721111Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:47.4721398Z               "line": 18
2026-08-28T09:54:47.4721664Z             },
2026-08-28T09:54:47.4721931Z             {
2026-08-28T09:54:47.4722282Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:47.4722570Z               "line": 177
2026-08-28T09:54:47.4722894Z             },
2026-08-28T09:54:47.4723167Z             {
2026-08-28T09:54:47.4723515Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4723801Z               "line": 13
2026-08-28T09:54:47.4724073Z             }
2026-08-28T09:54:47.4724335Z           ]
2026-08-28T09:54:47.4724618Z         },
2026-08-28T09:54:47.4724890Z         "int": {
2026-08-28T09:54:47.4725187Z           "complete": true,
2026-08-28T09:54:47.4725464Z           "evidence": [
2026-08-28T09:54:47.4725736Z             {
2026-08-28T09:54:47.4726242Z               "path": "crates/spt-msg/tests/killer_quickstart.rs",
2026-08-28T09:54:47.4726524Z               "line": 9
2026-08-28T09:54:47.4726796Z             },
2026-08-28T09:54:47.4727105Z             {
2026-08-28T09:54:47.4727640Z               "path": "crates/spt-msg/tests/killer_quickstart.rs",
2026-08-28T09:54:47.4727917Z               "line": 46
2026-08-28T09:54:47.4728193Z             },
2026-08-28T09:54:47.4728456Z             {
2026-08-28T09:54:47.4728894Z               "path": "crates/spt-msg/tests/killer_quickstart.rs",
2026-08-28T09:54:47.4729333Z               "line": 103
2026-08-28T09:54:47.4729604Z             }
2026-08-28T09:54:47.4729867Z           ]
2026-08-28T09:54:47.4730129Z         },
2026-08-28T09:54:47.4730409Z         "unit": {
2026-08-28T09:54:47.4730812Z           "complete": true,
2026-08-28T09:54:47.4731099Z           "evidence": [
2026-08-28T09:54:47.4731366Z             {
2026-08-28T09:54:47.4731732Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4732023Z               "line": 293
2026-08-28T09:54:47.4732301Z             },
2026-08-28T09:54:47.4732568Z             {
2026-08-28T09:54:47.4732938Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4733227Z               "line": 373
2026-08-28T09:54:47.4733494Z             },
2026-08-28T09:54:47.4733760Z             {
2026-08-28T09:54:47.4734128Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4734413Z               "line": 418
2026-08-28T09:54:47.4734777Z             },
2026-08-28T09:54:47.4735043Z             {
2026-08-28T09:54:47.4735411Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4735695Z               "line": 441
2026-08-28T09:54:47.4735967Z             },
2026-08-28T09:54:47.4736230Z             {
2026-08-28T09:54:47.4736601Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4736883Z               "line": 466
2026-08-28T09:54:47.4737283Z             },
2026-08-28T09:54:47.4737560Z             {
2026-08-28T09:54:47.4737936Z               "path": "crates/spt-msg/src/listener.rs",
2026-08-28T09:54:47.4738290Z               "line": 204
2026-08-28T09:54:47.4738562Z             },
2026-08-28T09:54:47.4738830Z             {
2026-08-28T09:54:47.4739288Z               "path": "crates/spt-msg/src/listener.rs",
2026-08-28T09:54:47.4739578Z               "line": 237
2026-08-28T09:54:47.4739845Z             },
2026-08-28T09:54:47.4740113Z             {
2026-08-28T09:54:47.4740484Z               "path": "crates/spt-msg/src/listener.rs",
2026-08-28T09:54:47.4740769Z               "line": 251
2026-08-28T09:54:47.4741039Z             },
2026-08-28T09:54:47.4741301Z             {
2026-08-28T09:54:47.4741678Z               "path": "crates/spt-msg/src/listener.rs",
2026-08-28T09:54:47.4741964Z               "line": 263
2026-08-28T09:54:47.4742227Z             },
2026-08-28T09:54:47.4742494Z             {
2026-08-28T09:54:47.4742842Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:47.4743209Z               "line": 390
2026-08-28T09:54:47.4743474Z             },
2026-08-28T09:54:47.4743749Z             {
2026-08-28T09:54:47.4744097Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:47.4744383Z               "line": 792
2026-08-28T09:54:47.4744654Z             },
2026-08-28T09:54:47.4744916Z             {
2026-08-28T09:54:47.4745265Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4745613Z               "line": 134
2026-08-28T09:54:47.4745885Z             },
2026-08-28T09:54:47.4746141Z             {
2026-08-28T09:54:47.4746489Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4746771Z               "line": 153
2026-08-28T09:54:47.4747043Z             }
2026-08-28T09:54:47.4747315Z           ]
2026-08-28T09:54:47.4747577Z         }
2026-08-28T09:54:47.4747848Z       }
2026-08-28T09:54:47.4748110Z     },
2026-08-28T09:54:47.4748377Z     {
2026-08-28T09:54:47.4748666Z       "id": "REQ-MSG-2",
2026-08-28T09:54:47.4749638Z       "title": "spt binary CLI surface: send/ring/ready(+--once)/list/stop/whoami, stable arg shapes + exit codes",
2026-08-28T09:54:47.4750014Z       "requiredStages": [
2026-08-28T09:54:47.4750291Z         "impl",
2026-08-28T09:54:47.4750563Z         "unit"
2026-08-28T09:54:47.4750831Z       ],
2026-08-28T09:54:47.4751107Z       "stages": {
2026-08-28T09:54:47.4751382Z         "doc": {
2026-08-28T09:54:47.4751684Z           "complete": false,
2026-08-28T09:54:47.4751975Z           "evidence": []
2026-08-28T09:54:47.4752248Z         },
2026-08-28T09:54:47.4752524Z         "impl": {
2026-08-28T09:54:47.4752820Z           "complete": true,
2026-08-28T09:54:47.4753106Z           "evidence": [
2026-08-28T09:54:47.4753374Z             {
2026-08-28T09:54:47.4753712Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4753992Z               "line": 21
2026-08-28T09:54:47.4754261Z             },
2026-08-28T09:54:47.4754523Z             {
2026-08-28T09:54:47.4754856Z               "path": "crates/spt/src/main.rs",
2026-08-28T09:54:47.4755134Z               "line": 8
2026-08-28T09:54:47.4755400Z             }
2026-08-28T09:54:47.4755673Z           ]
2026-08-28T09:54:47.4755916Z         },
2026-08-28T09:54:47.4756187Z         "int": {
2026-08-28T09:54:47.4756493Z           "complete": false,
2026-08-28T09:54:47.4756778Z           "evidence": []
2026-08-28T09:54:47.4757040Z         },
2026-08-28T09:54:47.4757322Z         "unit": {
2026-08-28T09:54:47.4757622Z           "complete": true,
2026-08-28T09:54:47.4757913Z           "evidence": [
2026-08-28T09:54:47.4758247Z             {
2026-08-28T09:54:47.4758590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4758876Z               "line": 28213
2026-08-28T09:54:47.4759226Z             },
2026-08-28T09:54:47.4759488Z             {
2026-08-28T09:54:47.4759817Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4760099Z               "line": 28411
2026-08-28T09:54:47.4760370Z             },
2026-08-28T09:54:47.4760636Z             {
2026-08-28T09:54:47.4760970Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4761314Z               "line": 28465
2026-08-28T09:54:47.4761581Z             },
2026-08-28T09:54:47.4761847Z             {
2026-08-28T09:54:47.4762174Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4762469Z               "line": 28570
2026-08-28T09:54:47.4762732Z             },
2026-08-28T09:54:47.4763004Z             {
2026-08-28T09:54:47.4763347Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4763628Z               "line": 33256
2026-08-28T09:54:47.4763895Z             },
2026-08-28T09:54:47.4764161Z             {
2026-08-28T09:54:47.4764489Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4764768Z               "line": 33293
2026-08-28T09:54:47.4765036Z             }
2026-08-28T09:54:47.4765303Z           ]
2026-08-28T09:54:47.4765561Z         }
2026-08-28T09:54:47.4765833Z       }
2026-08-28T09:54:47.4766094Z     },
2026-08-28T09:54:47.4766361Z     {
2026-08-28T09:54:47.4766642Z       "id": "REQ-MSG-3",
2026-08-28T09:54:47.4767882Z       "title": "Ready-agent lifecycle: register perch (info.json + listener + registry address) on ready, drain spooled backlog on startup, clean teardown",
2026-08-28T09:54:47.4768187Z       "requiredStages": [
2026-08-28T09:54:47.4768459Z         "impl",
2026-08-28T09:54:47.4768721Z         "unit",
2026-08-28T09:54:47.4769060Z         "int"
2026-08-28T09:54:47.4769399Z       ],
2026-08-28T09:54:47.4769678Z       "stages": {
2026-08-28T09:54:47.4769951Z         "doc": {
2026-08-28T09:54:47.4770261Z           "complete": false,
2026-08-28T09:54:47.4770553Z           "evidence": []
2026-08-28T09:54:47.4770815Z         },
2026-08-28T09:54:47.4771092Z         "impl": {
2026-08-28T09:54:47.4771382Z           "complete": true,
2026-08-28T09:54:47.4771674Z           "evidence": [
2026-08-28T09:54:47.4771947Z             {
2026-08-28T09:54:47.4772327Z               "path": "crates/spt-msg/src/listener.rs",
2026-08-28T09:54:47.4772612Z               "line": 19
2026-08-28T09:54:47.4772934Z             },
2026-08-28T09:54:47.4773206Z             {
2026-08-28T09:54:47.4773554Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.4773840Z               "line": 21
2026-08-28T09:54:47.4774102Z             },
2026-08-28T09:54:47.4774369Z             {
2026-08-28T09:54:47.4774722Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.4774997Z               "line": 48
2026-08-28T09:54:47.4775376Z             },
2026-08-28T09:54:47.4775648Z             {
2026-08-28T09:54:47.4776005Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.4776278Z               "line": 210
2026-08-28T09:54:47.4776544Z             }
2026-08-28T09:54:47.4776807Z           ]
2026-08-28T09:54:47.4777065Z         },
2026-08-28T09:54:47.4777342Z         "int": {
2026-08-28T09:54:47.4777633Z           "complete": true,
2026-08-28T09:54:47.4777921Z           "evidence": [
2026-08-28T09:54:47.4778184Z             {
2026-08-28T09:54:47.4778628Z               "path": "crates/spt-msg/tests/killer_quickstart.rs",
2026-08-28T09:54:47.4778909Z               "line": 10
2026-08-28T09:54:47.4779257Z             },
2026-08-28T09:54:47.4779524Z             {
2026-08-28T09:54:47.4779945Z               "path": "crates/spt-msg/tests/killer_quickstart.rs",
2026-08-28T09:54:47.4780229Z               "line": 46
2026-08-28T09:54:47.4780488Z             }
2026-08-28T09:54:47.4780765Z           ]
2026-08-28T09:54:47.4781028Z         },
2026-08-28T09:54:47.4781385Z         "unit": {
2026-08-28T09:54:47.4781676Z           "complete": true,
2026-08-28T09:54:47.4781962Z           "evidence": [
2026-08-28T09:54:47.4782234Z             {
2026-08-28T09:54:47.4782596Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.4782892Z               "line": 264
2026-08-28T09:54:47.4783158Z             },
2026-08-28T09:54:47.4783422Z             {
2026-08-28T09:54:47.4783771Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.4784066Z               "line": 311
2026-08-28T09:54:47.4784333Z             },
2026-08-28T09:54:47.4784667Z             {
2026-08-28T09:54:47.4785035Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.4785321Z               "line": 334
2026-08-28T09:54:47.4785586Z             }
2026-08-28T09:54:47.4785837Z           ]
2026-08-28T09:54:47.4786104Z         }
2026-08-28T09:54:47.4786362Z       }
2026-08-28T09:54:47.4786628Z     },
2026-08-28T09:54:47.4786885Z     {
2026-08-28T09:54:47.4787181Z       "id": "REQ-MSG-4",
2026-08-28T09:54:47.4789865Z       "title": "Listener stream stdout emits EVENT envelope lines (sister-format, ADR-0001): parse the __REPLY_TO__ frame, pass pre-formed typed envelopes through verbatim (no double-wrap), compose <EVENT type=\"msg\" from=…> otherwise, chunk oversized lines into EVENT-PART",
2026-08-28T09:54:47.4790185Z       "requiredStages": [
2026-08-28T09:54:47.4790461Z         "impl",
2026-08-28T09:54:47.4790722Z         "unit",
2026-08-28T09:54:47.4790991Z         "int"
2026-08-28T09:54:47.4791264Z       ],
2026-08-28T09:54:47.4791540Z       "stages": {
2026-08-28T09:54:47.4791817Z         "doc": {
2026-08-28T09:54:47.4792118Z           "complete": false,
2026-08-28T09:54:47.4792408Z           "evidence": []
2026-08-28T09:54:47.4792670Z         },
2026-08-28T09:54:47.4792941Z         "impl": {
2026-08-28T09:54:47.4793237Z           "complete": true,
2026-08-28T09:54:47.4793527Z           "evidence": [
2026-08-28T09:54:47.4793878Z             {
2026-08-28T09:54:47.4794245Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4794535Z               "line": 32
2026-08-28T09:54:47.4794798Z             },
2026-08-28T09:54:47.4795065Z             {
2026-08-28T09:54:47.4795408Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4795685Z               "line": 128
2026-08-28T09:54:47.4795944Z             },
2026-08-28T09:54:47.4796218Z             {
2026-08-28T09:54:47.4796588Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.4796965Z               "line": 1226
2026-08-28T09:54:47.4797237Z             },
2026-08-28T09:54:47.4797503Z             {
2026-08-28T09:54:47.4797837Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4798123Z               "line": 11827
2026-08-28T09:54:47.4798395Z             }
2026-08-28T09:54:47.4798656Z           ]
2026-08-28T09:54:47.4798928Z         },
2026-08-28T09:54:47.4799285Z         "int": {
2026-08-28T09:54:47.4799586Z           "complete": true,
2026-08-28T09:54:47.4799872Z           "evidence": [
2026-08-28T09:54:47.4800130Z             {
2026-08-28T09:54:47.4800520Z               "path": "crates/spt/tests/quickstart_e2e.rs",
2026-08-28T09:54:47.4800793Z               "line": 98
2026-08-28T09:54:47.4801065Z             },
2026-08-28T09:54:47.4801329Z             {
2026-08-28T09:54:47.4801718Z               "path": "crates/spt/tests/quickstart_e2e.rs",
2026-08-28T09:54:47.4802005Z               "line": 128
2026-08-28T09:54:47.4802276Z             }
2026-08-28T09:54:47.4802547Z           ]
2026-08-28T09:54:47.4802806Z         },
2026-08-28T09:54:47.4803077Z         "unit": {
2026-08-28T09:54:47.4803378Z           "complete": true,
2026-08-28T09:54:47.4803660Z           "evidence": [
2026-08-28T09:54:47.4803918Z             {
2026-08-28T09:54:47.4804268Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4804548Z               "line": 199
2026-08-28T09:54:47.4804824Z             },
2026-08-28T09:54:47.4805090Z             {
2026-08-28T09:54:47.4805506Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4805796Z               "line": 211
2026-08-28T09:54:47.4806063Z             },
2026-08-28T09:54:47.4806330Z             {
2026-08-28T09:54:47.4806678Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4806961Z               "line": 223
2026-08-28T09:54:47.4807230Z             },
2026-08-28T09:54:47.4807496Z             {
2026-08-28T09:54:47.4807853Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4808135Z               "line": 296
2026-08-28T09:54:47.4808407Z             }
2026-08-28T09:54:47.4808727Z           ]
2026-08-28T09:54:47.4809085Z         }
2026-08-28T09:54:47.4809351Z       }
2026-08-28T09:54:47.4809616Z     },
2026-08-28T09:54:47.4809874Z     {
2026-08-28T09:54:47.4810165Z       "id": "REQ-MSG-5",
2026-08-28T09:54:47.4812512Z       "title": "user-msg envelope kind + daemon identity gate: a Gateway endpoint / the local user's CLI author user-msg (the user's authority); agent-family senders re-stamped to plain msg; identity-gated never payload-trusted (KH 7.3/7.5); wire-additive (N-1 receivers tolerate the new type)",
2026-08-28T09:54:47.4812817Z       "requiredStages": [
2026-08-28T09:54:47.4813084Z         "doc",
2026-08-28T09:54:47.4813352Z         "impl",
2026-08-28T09:54:47.4813628Z         "unit"
2026-08-28T09:54:47.4813891Z       ],
2026-08-28T09:54:47.4814173Z       "stages": {
2026-08-28T09:54:47.4814449Z         "doc": {
2026-08-28T09:54:47.4814738Z           "complete": true,
2026-08-28T09:54:47.4815026Z           "evidence": [
2026-08-28T09:54:47.4815284Z             {
2026-08-28T09:54:47.4815590Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4815861Z               "line": 269
2026-08-28T09:54:47.4816119Z             }
2026-08-28T09:54:47.4816381Z           ]
2026-08-28T09:54:47.4816648Z         },
2026-08-28T09:54:47.4816920Z         "impl": {
2026-08-28T09:54:47.4817195Z           "complete": true,
2026-08-28T09:54:47.4817545Z           "evidence": [
2026-08-28T09:54:47.4817809Z             {
2026-08-28T09:54:47.4818179Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4818467Z               "line": 68
2026-08-28T09:54:47.4818728Z             },
2026-08-28T09:54:47.4819057Z             {
2026-08-28T09:54:47.4819433Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4819719Z               "line": 148
2026-08-28T09:54:47.4819983Z             },
2026-08-28T09:54:47.4820253Z             {
2026-08-28T09:54:47.4820678Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4820973Z               "line": 157
2026-08-28T09:54:47.4821246Z             },
2026-08-28T09:54:47.4821512Z             {
2026-08-28T09:54:47.4821885Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4822171Z               "line": 171
2026-08-28T09:54:47.4822440Z             },
2026-08-28T09:54:47.4822700Z             {
2026-08-28T09:54:47.4823062Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4823348Z               "line": 342
2026-08-28T09:54:47.4823620Z             },
2026-08-28T09:54:47.4823888Z             {
2026-08-28T09:54:47.4824226Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4824517Z               "line": 10921
2026-08-28T09:54:47.4824780Z             }
2026-08-28T09:54:47.4825043Z           ]
2026-08-28T09:54:47.4825307Z         },
2026-08-28T09:54:47.4825576Z         "int": {
2026-08-28T09:54:47.4825992Z           "complete": true,
2026-08-28T09:54:47.4826292Z           "evidence": [
2026-08-28T09:54:47.4826554Z             {
2026-08-28T09:54:47.4826927Z               "path": "crates/spt/tests/gateway_e2e.rs",
2026-08-28T09:54:47.4827217Z               "line": 19
2026-08-28T09:54:47.4827480Z             }
2026-08-28T09:54:47.4827751Z           ]
2026-08-28T09:54:47.4828012Z         },
2026-08-28T09:54:47.4828282Z         "unit": {
2026-08-28T09:54:47.4828569Z           "complete": true,
2026-08-28T09:54:47.4828859Z           "evidence": [
2026-08-28T09:54:47.4829279Z             {
2026-08-28T09:54:47.4829645Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4829937Z               "line": 1291
2026-08-28T09:54:47.4830196Z             },
2026-08-28T09:54:47.4830468Z             {
2026-08-28T09:54:47.4830852Z               "path": "crates/spt-daemon/tests/wanmsg.rs",
2026-08-28T09:54:47.4831137Z               "line": 150
2026-08-28T09:54:47.4831404Z             },
2026-08-28T09:54:47.4831671Z             {
2026-08-28T09:54:47.4832024Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4832363Z               "line": 262
2026-08-28T09:54:47.4832634Z             },
2026-08-28T09:54:47.4832901Z             {
2026-08-28T09:54:47.4833270Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4833552Z               "line": 672
2026-08-28T09:54:47.4833814Z             },
2026-08-28T09:54:47.4834077Z             {
2026-08-28T09:54:47.4834453Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4834734Z               "line": 721
2026-08-28T09:54:47.4834997Z             },
2026-08-28T09:54:47.4835259Z             {
2026-08-28T09:54:47.4835618Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4835891Z               "line": 737
2026-08-28T09:54:47.4836160Z             },
2026-08-28T09:54:47.4836428Z             {
2026-08-28T09:54:47.4836785Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:47.4837072Z               "line": 756
2026-08-28T09:54:47.4837339Z             },
2026-08-28T09:54:47.4837611Z             {
2026-08-28T09:54:47.4837950Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4838236Z               "line": 28124
2026-08-28T09:54:47.4838497Z             }
2026-08-28T09:54:47.4838761Z           ]
2026-08-28T09:54:47.4839119Z         }
2026-08-28T09:54:47.4839381Z       }
2026-08-28T09:54:47.4839643Z     },
2026-08-28T09:54:47.4839967Z     {
2026-08-28T09:54:47.4840264Z       "id": "REQ-MSG-6",
2026-08-28T09:54:47.4845008Z       "title": "cross-node Gateway user-msg honored via advertised endpoint_type: a user-msg from a Gateway-typed origin survives the receive_wan funnel as user-msg (vs the fail-closed re-stamp), keyed on the QUIC-handshake-proven origin node (never wire `from`). Trust boundary = subnet membership (operator-ratified 2026-06-13); no defense against an in-subnet member forging the type. Instance.endpoint_type is an additive serde-default field extending REQ-INST-7's data model. Absent/unknown type → re-stamp (N-1 rollout grace)",
2026-08-28T09:54:47.4845389Z       "requiredStages": [
2026-08-28T09:54:47.4845666Z         "doc",
2026-08-28T09:54:47.4845933Z         "impl",
2026-08-28T09:54:47.4846202Z         "unit"
2026-08-28T09:54:47.4846466Z       ],
2026-08-28T09:54:47.4846735Z       "stages": {
2026-08-28T09:54:47.4847122Z         "doc": {
2026-08-28T09:54:47.4847585Z           "complete": true,
2026-08-28T09:54:47.4847985Z           "evidence": [
2026-08-28T09:54:47.4848242Z             {
2026-08-28T09:54:47.4848552Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.4848829Z               "line": 272
2026-08-28T09:54:47.4849165Z             }
2026-08-28T09:54:47.4849437Z           ]
2026-08-28T09:54:47.4849689Z         },
2026-08-28T09:54:47.4849960Z         "impl": {
2026-08-28T09:54:47.4850246Z           "complete": true,
2026-08-28T09:54:47.4850518Z           "evidence": [
2026-08-28T09:54:47.4850780Z             {
2026-08-28T09:54:47.4851190Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4851487Z               "line": 198
2026-08-28T09:54:47.4851753Z             },
2026-08-28T09:54:47.4852020Z             {
2026-08-28T09:54:47.4852425Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4852721Z               "line": 566
2026-08-28T09:54:47.4852992Z             },
2026-08-28T09:54:47.4853260Z             {
2026-08-28T09:54:47.4853659Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4854021Z               "line": 640
2026-08-28T09:54:47.4854282Z             },
2026-08-28T09:54:47.4854544Z             {
2026-08-28T09:54:47.4854896Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4855164Z               "line": 97
2026-08-28T09:54:47.4855421Z             },
2026-08-28T09:54:47.4855677Z             {
2026-08-28T09:54:47.4856250Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.4856622Z               "line": 155
2026-08-28T09:54:47.4856893Z             }
2026-08-28T09:54:47.4857140Z           ]
2026-08-28T09:54:47.4857459Z         },
2026-08-28T09:54:47.4857721Z         "int": {
2026-08-28T09:54:47.4858002Z           "complete": false,
2026-08-28T09:54:47.4858288Z           "evidence": []
2026-08-28T09:54:47.4858535Z         },
2026-08-28T09:54:47.4858797Z         "unit": {
2026-08-28T09:54:47.4859165Z           "complete": true,
2026-08-28T09:54:47.4859451Z           "evidence": [
2026-08-28T09:54:47.4859711Z             {
2026-08-28T09:54:47.4860115Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.4860388Z               "line": 2649
2026-08-28T09:54:47.4860640Z             },
2026-08-28T09:54:47.4860898Z             {
2026-08-28T09:54:47.4861241Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4861508Z               "line": 1318
2026-08-28T09:54:47.4861765Z             }
2026-08-28T09:54:47.4862032Z           ]
2026-08-28T09:54:47.4862289Z         }
2026-08-28T09:54:47.4862542Z       }
2026-08-28T09:54:47.4862799Z     },
2026-08-28T09:54:47.4863046Z     {
2026-08-28T09:54:47.4863356Z       "id": "REQ-MSG-CLI-ORIGIN",
2026-08-28T09:54:47.4868705Z       "title": "A bare non-perch CLI `spt send` (no owning perch to name as origin) stamps from = `cli@<node-label>` at compose time (bare `cli` when no node label is known — never a dangling `cli@`), and WAN ingress renders an EMPTY from as the origin node DISPLAY (`node_label_display(origin_node, None)` = the QUIC-proven origin node's key-prefix; never blank) — a delivered message NEVER shows a blank sender. Scoped to `spt send`: a from-less send is LEGAL (stamped, never refused), while `spt ring` keeps its NO_SELF refusal (a ring needs a routable self for the reply leg; `cli@<node>` is a display origin, not a perch address). (F-024C item 3, doyle ruled)",
2026-08-28T09:54:47.4869182Z       "requiredStages": [
2026-08-28T09:54:47.4869453Z         "impl",
2026-08-28T09:54:47.4869710Z         "unit"
2026-08-28T09:54:47.4869968Z       ],
2026-08-28T09:54:47.4870304Z       "stages": {
2026-08-28T09:54:47.4870566Z         "doc": {
2026-08-28T09:54:47.4870862Z           "complete": false,
2026-08-28T09:54:47.4871144Z           "evidence": []
2026-08-28T09:54:47.4871395Z         },
2026-08-28T09:54:47.4871657Z         "impl": {
2026-08-28T09:54:47.4871944Z           "complete": true,
2026-08-28T09:54:47.4872211Z           "evidence": [
2026-08-28T09:54:47.4877003Z             {
2026-08-28T09:54:47.4877413Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4877709Z               "line": 714
2026-08-28T09:54:47.4877962Z             },
2026-08-28T09:54:47.4878223Z             {
2026-08-28T09:54:47.4878579Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4878856Z               "line": 983
2026-08-28T09:54:47.4879194Z             },
2026-08-28T09:54:47.4879456Z             {
2026-08-28T09:54:47.4879771Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4880042Z               "line": 11175
2026-08-28T09:54:47.4880304Z             }
2026-08-28T09:54:47.4880561Z           ]
2026-08-28T09:54:47.4880818Z         },
2026-08-28T09:54:47.4881078Z         "int": {
2026-08-28T09:54:47.4881364Z           "complete": false,
2026-08-28T09:54:47.4881640Z           "evidence": []
2026-08-28T09:54:47.4881893Z         },
2026-08-28T09:54:47.4882156Z         "unit": {
2026-08-28T09:54:47.4882432Z           "complete": true,
2026-08-28T09:54:47.4882696Z           "evidence": [
2026-08-28T09:54:47.4883043Z             {
2026-08-28T09:54:47.4883395Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.4883667Z               "line": 1246
2026-08-28T09:54:47.4883929Z             },
2026-08-28T09:54:47.4884176Z             {
2026-08-28T09:54:47.4884495Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4884767Z               "line": 25126
2026-08-28T09:54:47.4885021Z             }
2026-08-28T09:54:47.4885278Z           ]
2026-08-28T09:54:47.4885532Z         }
2026-08-28T09:54:47.4885792Z       }
2026-08-28T09:54:47.4886051Z     },
2026-08-28T09:54:47.4886362Z     {
2026-08-28T09:54:47.4886681Z       "id": "REQ-MSG-DELIVERY-AXES",
2026-08-28T09:54:47.4905635Z       "title": "Activity-gated inbound delivery + per-message send control as THREE ORTHOGONAL AXES plus opaque metadata (ADR-0028; grilled w/ operator 2026-06-23). SUBSTRATE (the legacy-SPT parity gap, scaffolded-but-unwired today: `delivery::is_idle` + `resolve_inject_methods` exist but the result is discarded `let _methods`, and `broker::dispatch_endpoint_input` injects unconditionally — its comment calls activity-gating 'a deferred follow wave'): an inbound message has an ACTIVE window (endpoint active → spool for the receiver's hook-poll, non-disruptive) and an IDLE window (idle/idle-transition → deliver immediately: translation binary spt-hosted → relay-poll either topology → spool, in fallback order). AXES (each composes; each defaults to its unrestricted value): (1) DELIVERY WINDOW — default (both, first-to-fire) | `--idle-only` (idle window; immediate if already idle) | `--active-only` (active window only, never wakes; the RENAMED `--deferred` — `deferred=1` spool column + `api poll --include-deferred` keep their names). (2) CHANNEL RESTRICTION — unrestricted | `--prefer-native` (translation binary if running else fall back) | `--force-native` (binary ONLY, no fallback/no spool-to-other-method). Native flags do NOT respect the binary's idle-gating: the WINDOW says when, the native flag says through-what (so `--force-native --active-only` = binary injects during the active window, mid-turn-safe via the existing InjectFloor). (3) PERSISTENCE — durable (default; spool until delivered or TTL) | `--ephemeral` (drop if undeliverable in the accepted window — at window-open with no live carrier, or at TTL, whichever first). METADATA (orthogonal): `--json-payload '<json>'` → a single attr-escaped `json=\"…\"` envelope attr ALONGSIDE (not replacing) the body, pure verbatim passthrough across spool/TCP/WAN/EVENT-PART, parsed only by the receiving adapter; collision-proof by construction (structured data lives INSIDE the one `json` value, can never forge `from`/`type`); available to ANY sender (confers no spt-core authority). HAZARD: `--ephemeral` is the ONLY path permitted to drop silently — the sender-opted-in carve-out to REQ-HAZARD-IDLE-SILENT-NONDELIVERY (that hazard gains a '…unless --ephemeral' clause in v0.15.0). (v0.15.0)",
2026-08-28T09:54:47.4906231Z       "requiredStages": [
2026-08-28T09:54:47.4906493Z         "doc",
2026-08-28T09:54:47.4906760Z         "impl",
2026-08-28T09:54:47.4907027Z         "unit",
2026-08-28T09:54:47.4907282Z         "int"
2026-08-28T09:54:47.4907538Z       ],
2026-08-28T09:54:47.4907806Z       "stages": {
2026-08-28T09:54:47.4908064Z         "doc": {
2026-08-28T09:54:47.4908350Z           "complete": true,
2026-08-28T09:54:47.4908622Z           "evidence": [
2026-08-28T09:54:47.4908880Z             {
2026-08-28T09:54:47.4909623Z               "path": "docs/adr/0028-activity-gated-delivery-and-send-modifier-axes.md",
2026-08-28T09:54:47.4909912Z               "line": 3
2026-08-28T09:54:47.4910178Z             }
2026-08-28T09:54:47.4910440Z           ]
2026-08-28T09:54:47.4910697Z         },
2026-08-28T09:54:47.4910955Z         "impl": {
2026-08-28T09:54:47.4911241Z           "complete": true,
2026-08-28T09:54:47.4911513Z           "evidence": [
2026-08-28T09:54:47.4911776Z             {
2026-08-28T09:54:47.4912134Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.4912493Z               "line": 2207
2026-08-28T09:54:47.4912749Z             },
2026-08-28T09:54:47.4913011Z             {
2026-08-28T09:54:47.4913379Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.4913655Z               "line": 4736
2026-08-28T09:54:47.4913912Z             },
2026-08-28T09:54:47.4914170Z             {
2026-08-28T09:54:47.4914537Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.4914828Z               "line": 4961
2026-08-28T09:54:47.4915227Z             },
2026-08-28T09:54:47.4915489Z             {
2026-08-28T09:54:47.4915924Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.4916195Z               "line": 4975
2026-08-28T09:54:47.4916438Z             },
2026-08-28T09:54:47.4916696Z             {
2026-08-28T09:54:47.4917058Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.4917325Z               "line": 8575
2026-08-28T09:54:47.4917582Z             },
2026-08-28T09:54:47.4917842Z             {
2026-08-28T09:54:47.4918190Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:47.4918476Z               "line": 221
2026-08-28T09:54:47.4918738Z             },
2026-08-28T09:54:47.4919072Z             {
2026-08-28T09:54:47.4919431Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4919697Z               "line": 347
2026-08-28T09:54:47.4919954Z             },
2026-08-28T09:54:47.4920207Z             {
2026-08-28T09:54:47.4920556Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4920843Z               "line": 567
2026-08-28T09:54:47.4921091Z             },
2026-08-28T09:54:47.4921353Z             {
2026-08-28T09:54:47.4921707Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4921978Z               "line": 861
2026-08-28T09:54:47.4922230Z             },
2026-08-28T09:54:47.4922497Z             {
2026-08-28T09:54:47.4922840Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4923180Z               "line": 293
2026-08-28T09:54:47.4923438Z             },
2026-08-28T09:54:47.4923692Z             {
2026-08-28T09:54:47.4924048Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4924320Z               "line": 481
2026-08-28T09:54:47.4924579Z             },
2026-08-28T09:54:47.4924830Z             {
2026-08-28T09:54:47.4925189Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4925465Z               "line": 563
2026-08-28T09:54:47.4925745Z             },
2026-08-28T09:54:47.4926054Z             {
2026-08-28T09:54:47.4926417Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4926684Z               "line": 627
2026-08-28T09:54:47.4926941Z             },
2026-08-28T09:54:47.4927200Z             {
2026-08-28T09:54:47.4927552Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:47.4927834Z               "line": 135
2026-08-28T09:54:47.4928090Z             },
2026-08-28T09:54:47.4928354Z             {
2026-08-28T09:54:47.4928683Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4929051Z               "line": 10955
2026-08-28T09:54:47.4929317Z             },
2026-08-28T09:54:47.4929565Z             {
2026-08-28T09:54:47.4929885Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4930166Z               "line": 11311
2026-08-28T09:54:47.4930424Z             },
2026-08-28T09:54:47.4930683Z             {
2026-08-28T09:54:47.4930995Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4931265Z               "line": 11387
2026-08-28T09:54:47.4931522Z             }
2026-08-28T09:54:47.4931779Z           ]
2026-08-28T09:54:47.4932032Z         },
2026-08-28T09:54:47.4932295Z         "int": {
2026-08-28T09:54:47.4932567Z           "complete": true,
2026-08-28T09:54:47.4932843Z           "evidence": [
2026-08-28T09:54:47.4933100Z             {
2026-08-28T09:54:47.4933562Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.4933923Z               "line": 1747
2026-08-28T09:54:47.4934180Z             },
2026-08-28T09:54:47.4934436Z             {
2026-08-28T09:54:47.4934880Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.4935162Z               "line": 1814
2026-08-28T09:54:47.4935410Z             },
2026-08-28T09:54:47.4935667Z             {
2026-08-28T09:54:47.4936112Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.4936395Z               "line": 2118
2026-08-28T09:54:47.4936657Z             },
2026-08-28T09:54:47.4936910Z             {
2026-08-28T09:54:47.4937431Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.4937703Z               "line": 2166
2026-08-28T09:54:47.4937960Z             }
2026-08-28T09:54:47.4938217Z           ]
2026-08-28T09:54:47.4938470Z         },
2026-08-28T09:54:47.4938735Z         "unit": {
2026-08-28T09:54:47.4939097Z           "complete": true,
2026-08-28T09:54:47.4939377Z           "evidence": [
2026-08-28T09:54:47.4939631Z             {
2026-08-28T09:54:47.4939988Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.4940255Z               "line": 2166
2026-08-28T09:54:47.4940517Z             },
2026-08-28T09:54:47.4940769Z             {
2026-08-28T09:54:47.4941117Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4941393Z               "line": 1246
2026-08-28T09:54:47.4941645Z             },
2026-08-28T09:54:47.4941902Z             {
2026-08-28T09:54:47.4942249Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4942531Z               "line": 1279
2026-08-28T09:54:47.4942783Z             },
2026-08-28T09:54:47.4943040Z             {
2026-08-28T09:54:47.4943480Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4943757Z               "line": 1310
2026-08-28T09:54:47.4944016Z             },
2026-08-28T09:54:47.4944338Z             {
2026-08-28T09:54:47.4944706Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4944982Z               "line": 1240
2026-08-28T09:54:47.4945240Z             },
2026-08-28T09:54:47.4945493Z             {
2026-08-28T09:54:47.4945855Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4946132Z               "line": 1277
2026-08-28T09:54:47.4946376Z             },
2026-08-28T09:54:47.4946638Z             {
2026-08-28T09:54:47.4946999Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4947333Z               "line": 1307
2026-08-28T09:54:47.4947585Z             },
2026-08-28T09:54:47.4947847Z             {
2026-08-28T09:54:47.4948162Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4948439Z               "line": 28181
2026-08-28T09:54:47.4948696Z             }
2026-08-28T09:54:47.4949030Z           ]
2026-08-28T09:54:47.4949286Z         }
2026-08-28T09:54:47.4949537Z       }
2026-08-28T09:54:47.4949799Z     },
2026-08-28T09:54:47.4950047Z     {
2026-08-28T09:54:47.4950352Z       "id": "REQ-MSG-ENVELOPE",
2026-08-28T09:54:47.4960973Z       "title": "The <EVENT type=\"msg\" from=…>body</EVENT> envelope (spt-proto::event, the ADR-0001 grammar) is the SOLE canonical arriving-message format at EVERY harness arriving-message surface on an AGENT perch — api listen AND api poll/worker-poll, byte-identical (reverses REQ-MSG-4's 'hook drains keep the raw frame by contract'). SCOPE CARVE-OUT: the shell-command relay (api poll <shell-id> --link, cmd_poll_shell) is a distinct internal transport carrying RAW MAC'd stamped frames the shell child consumes verbatim — NOT an arriving-message surface, deliberately EXEMPT from <EVENT> composition (notify_shell_e2e guards this boundary). __REPLY_TO__ — mis-elevated during the clean-room port to a fake ADR-0001 'stable wire format' (spt-msg/wire.rs, lib.rs) — is REMOVED entirely (spool format_row, the spt-msg TCP frame, emit parse_frame); (from, body) carried structurally, <EVENT> composed once at the delivery boundary. No legacy sister-interop (spt-core never required it). Reply-correlation rebinds onto the structural from / <EVENT from=…> attribute (ADR-0009 access-gate + ADR-0012 Psyche/spt-live reply-target). Self-delimiting by construction → finding F-002 (non-self-delimiting multi-message poll) dissolves. ADR-0020.",
2026-08-28T09:54:47.4961409Z       "requiredStages": [
2026-08-28T09:54:47.4961671Z         "doc",
2026-08-28T09:54:47.4961932Z         "impl",
2026-08-28T09:54:47.4962195Z         "unit",
2026-08-28T09:54:47.4962448Z         "int"
2026-08-28T09:54:47.4962718Z       ],
2026-08-28T09:54:47.4962979Z       "stages": {
2026-08-28T09:54:47.4963303Z         "doc": {
2026-08-28T09:54:47.4963579Z           "complete": true,
2026-08-28T09:54:47.4963855Z           "evidence": [
2026-08-28T09:54:47.4964109Z             {
2026-08-28T09:54:47.4964819Z               "path": "docs/adr/0020-event-envelope-sole-arriving-format-reply-to-removed.md",
2026-08-28T09:54:47.4965099Z               "line": 47
2026-08-28T09:54:47.4965350Z             }
2026-08-28T09:54:47.4965622Z           ]
2026-08-28T09:54:47.4965875Z         },
2026-08-28T09:54:47.4966136Z         "impl": {
2026-08-28T09:54:47.4966422Z           "complete": true,
2026-08-28T09:54:47.4966698Z           "evidence": [
2026-08-28T09:54:47.4966947Z             {
2026-08-28T09:54:47.4967290Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4967562Z               "line": 33
2026-08-28T09:54:47.4967816Z             },
2026-08-28T09:54:47.4968076Z             {
2026-08-28T09:54:47.4968419Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4968696Z               "line": 64
2026-08-28T09:54:47.4969035Z             },
2026-08-28T09:54:47.4969296Z             {
2026-08-28T09:54:47.4969621Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4969902Z               "line": 129
2026-08-28T09:54:47.4970164Z             },
2026-08-28T09:54:47.4970411Z             {
2026-08-28T09:54:47.4970805Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4971068Z               "line": 148
2026-08-28T09:54:47.4971325Z             },
2026-08-28T09:54:47.4971578Z             {
2026-08-28T09:54:47.4971916Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4972177Z               "line": 14
2026-08-28T09:54:47.4972426Z             },
2026-08-28T09:54:47.4972688Z             {
2026-08-28T09:54:47.4973017Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4973292Z               "line": 27
2026-08-28T09:54:47.4973720Z             },
2026-08-28T09:54:47.4973978Z             {
2026-08-28T09:54:47.4974307Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4974578Z               "line": 40
2026-08-28T09:54:47.4974831Z             },
2026-08-28T09:54:47.4975084Z             {
2026-08-28T09:54:47.4975438Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.4975707Z               "line": 202
2026-08-28T09:54:47.4975971Z             },
2026-08-28T09:54:47.4976221Z             {
2026-08-28T09:54:47.4976582Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4976854Z               "line": 480
2026-08-28T09:54:47.4977112Z             },
2026-08-28T09:54:47.4977365Z             {
2026-08-28T09:54:47.4977718Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.4977990Z               "line": 645
2026-08-28T09:54:47.4978241Z             },
2026-08-28T09:54:47.4978502Z             {
2026-08-28T09:54:47.4978845Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.4979208Z               "line": 1227
2026-08-28T09:54:47.4979456Z             },
2026-08-28T09:54:47.4979695Z             {
2026-08-28T09:54:47.4980033Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:47.4980306Z               "line": 125
2026-08-28T09:54:47.4980568Z             },
2026-08-28T09:54:47.4980823Z             {
2026-08-28T09:54:47.4981145Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.4981422Z               "line": 11828
2026-08-28T09:54:47.4981756Z             }
2026-08-28T09:54:47.4982013Z           ]
2026-08-28T09:54:47.4982271Z         },
2026-08-28T09:54:47.4982534Z         "int": {
2026-08-28T09:54:47.4982811Z           "complete": true,
2026-08-28T09:54:47.4983087Z           "evidence": [
2026-08-28T09:54:47.4983339Z             {
2026-08-28T09:54:47.4983729Z               "path": "crates/spt/tests/poll_envelope_e2e.rs",
2026-08-28T09:54:47.4983993Z               "line": 15
2026-08-28T09:54:47.4984251Z             }
2026-08-28T09:54:47.4984500Z           ]
2026-08-28T09:54:47.4984833Z         },
2026-08-28T09:54:47.4985100Z         "unit": {
2026-08-28T09:54:47.4985383Z           "complete": true,
2026-08-28T09:54:47.4985658Z           "evidence": [
2026-08-28T09:54:47.4985906Z             {
2026-08-28T09:54:47.4986248Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4986517Z               "line": 236
2026-08-28T09:54:47.4986781Z             },
2026-08-28T09:54:47.4987038Z             {
2026-08-28T09:54:47.4987376Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:47.4987648Z               "line": 281
2026-08-28T09:54:47.4987895Z             },
2026-08-28T09:54:47.4988148Z             {
2026-08-28T09:54:47.4988482Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4988759Z               "line": 98
2026-08-28T09:54:47.4989101Z             },
2026-08-28T09:54:47.4989364Z             {
2026-08-28T09:54:47.4989683Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4989950Z               "line": 106
2026-08-28T09:54:47.4990218Z             },
2026-08-28T09:54:47.4990470Z             {
2026-08-28T09:54:47.4990804Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4991075Z               "line": 113
2026-08-28T09:54:47.4991346Z             },
2026-08-28T09:54:47.4991592Z             {
2026-08-28T09:54:47.4991930Z               "path": "crates/spt-msg/src/wire.rs",
2026-08-28T09:54:47.4992263Z               "line": 122
2026-08-28T09:54:47.4992531Z             }
2026-08-28T09:54:47.4992789Z           ]
2026-08-28T09:54:47.4993041Z         }
2026-08-28T09:54:47.4993294Z       }
2026-08-28T09:54:47.4993546Z     },
2026-08-28T09:54:47.4993803Z     {
2026-08-28T09:54:47.4994118Z       "id": "REQ-MSG-IDLE-EDGE-DRAIN",
2026-08-28T09:54:47.5006258Z       "title": "On an endpoint's ACTIVE→IDLE transition the daemon DRAINS its pending spool (NON-DEFERRED ONLY — AMENDED 2026-07-26) through the same shared spt-hosted inject leg — closing the SECOND F-023 gap for the classes an inject may carry: an spt-hosted endpoint (no api-listen relay to wake it) strands its 'IDLE+no-binary → non-deferred for a relay that does not exist' class without this drain. AMENDMENT 2026-07-26 (FIELD-TRUTH W1 roll-in, operator ruling; doyle spool-audit RCA — spt-shells shell-context rows on a LIVE-AGENT perch showed taken_leg=idle-inject ~200ms after boundary spooling, each injection STARTING A TURN): the deferred (active_only) class is EXCLUDED from the idle-edge and parked-re-offer claims UNCONDITIONALLY. active_only means what ADR-0028 says — 'active hook window only; never wakes an idle agent' — so the hook poll is its SOLE carrier on every endpoint class; a deferred row with no hook cadence WAITS (starves-by-design), it is never injected. This knowingly revokes the original F-023 leg-2 rescue of the deferred class (that rescue was the operator-visible defect: background context starting turns). Mechanics unchanged for non-deferred: shared inject leg, REUSE of the hook-poll take/ack (ONE drain path, TWO triggers), v0.14.3 LAW on both triggers (translation-binary-ONLY, no-binary drain SPOOLS LOUD, never writes the PTY). (F-023 as amended; kin REQ-SEND-WINDOW-DRAIN-HONOR)",
2026-08-28T09:54:47.5006687Z       "requiredStages": [
2026-08-28T09:54:47.5006949Z         "impl",
2026-08-28T09:54:47.5007208Z         "unit",
2026-08-28T09:54:47.5007469Z         "int"
2026-08-28T09:54:47.5007728Z       ],
2026-08-28T09:54:47.5007995Z       "stages": {
2026-08-28T09:54:47.5008324Z         "doc": {
2026-08-28T09:54:47.5008620Z           "complete": false,
2026-08-28T09:54:47.5008902Z           "evidence": []
2026-08-28T09:54:47.5009235Z         },
2026-08-28T09:54:47.5009511Z         "impl": {
2026-08-28T09:54:47.5009788Z           "complete": true,
2026-08-28T09:54:47.5010071Z           "evidence": [
2026-08-28T09:54:47.5010331Z             {
2026-08-28T09:54:47.5010689Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5010966Z               "line": 648
2026-08-28T09:54:47.5011227Z             },
2026-08-28T09:54:47.5011542Z             {
2026-08-28T09:54:47.5011895Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5012171Z               "line": 691
2026-08-28T09:54:47.5012432Z             },
2026-08-28T09:54:47.5012694Z             {
2026-08-28T09:54:47.5013065Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.5013337Z               "line": 625
2026-08-28T09:54:47.5013600Z             }
2026-08-28T09:54:47.5013857Z           ]
2026-08-28T09:54:47.5014118Z         },
2026-08-28T09:54:47.5014375Z         "int": {
2026-08-28T09:54:47.5014667Z           "complete": true,
2026-08-28T09:54:47.5014947Z           "evidence": [
2026-08-28T09:54:47.5015202Z             {
2026-08-28T09:54:47.5015594Z               "path": "crates/spt/tests/idle_edge_drain_e2e.rs",
2026-08-28T09:54:47.5015865Z               "line": 73
2026-08-28T09:54:47.5016128Z             },
2026-08-28T09:54:47.5016380Z             {
2026-08-28T09:54:47.5016714Z               "path": "docs/F-035-CONFLICT.md",
2026-08-28T09:54:47.5016981Z               "line": 47
2026-08-28T09:54:47.5017247Z             }
2026-08-28T09:54:47.5017500Z           ]
2026-08-28T09:54:47.5017750Z         },
2026-08-28T09:54:47.5018014Z         "unit": {
2026-08-28T09:54:47.5018298Z           "complete": true,
2026-08-28T09:54:47.5018570Z           "evidence": [
2026-08-28T09:54:47.5018884Z             {
2026-08-28T09:54:47.5019329Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5019600Z               "line": 1351
2026-08-28T09:54:47.5019862Z             },
2026-08-28T09:54:47.5020124Z             {
2026-08-28T09:54:47.5020477Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5020763Z               "line": 1394
2026-08-28T09:54:47.5021016Z             },
2026-08-28T09:54:47.5021273Z             {
2026-08-28T09:54:47.5021631Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5021969Z               "line": 1430
2026-08-28T09:54:47.5022227Z             }
2026-08-28T09:54:47.5022495Z           ]
2026-08-28T09:54:47.5022746Z         }
2026-08-28T09:54:47.5022998Z       }
2026-08-28T09:54:47.5023254Z     },
2026-08-28T09:54:47.5023506Z     {
2026-08-28T09:54:47.5023864Z       "id": "REQ-MSG-IDLE-TRANSLATION-BINARY",
2026-08-28T09:54:47.5041973Z       "title": "spt-hosted idle message delivery via an adapter TRANSLATION BINARY (ADR-0022). New opt-in manifest section `[message-idle-translation-binary]` = a TABLE carrying a `path` scalar (doyle OPT-B ruling: modeled as a table, not a bare top-level scalar, so a preceding section cannot silently absorb it + N+1 extensible; spt-core does NOT deny_unknown_fields, so a future key degrades gracefully); spt-core LIFECYCLE-manages it (spawn when the endpoint comes up, terminate when it goes down). The binary is a PURE stdin→stdout filter; spt-core owns EVERY PTY write. stdin (JSON-lines): `{type:\"init\",endpoint_id,node}` first · `{type:\"event\",envelope:\"<EVENT…>\"}` per inbound message (ADR-0020 envelope) · `{type:\"input\"}` content-free ping on each operator keystroke (binary tracks user-idle for its own idle-gated buffering; PTY input content NOT duplicated). stdout (JSON-lines): keystroke-commands `{key:…}`/`{delay_ms:…}`/`{text:…}` (extensible). spt-core applies the emitted sequence to the broker PTY ATOMICALLY (the W1 coordination — REQ-HAZARD-INJECT-CONTROL-COEXIST). The daemon poll feed is the ONE idle substrate for both topologies (Q1=A): harness-hosted consumer = the Monitor child, spt-hosted consumer = this binary; spt-core PREFERS a perch's poll listener if one exists (so spt-hosted can run a listener AND keep `spt rc`). Idle-only; busy/mid-turn = adapter hook-injection. Closes the current grounding gap: `api bind` registers no listener port → a listener-less spt-hosted perch SPOOLS inbound (only spooling+adapter-poll works today) → this delivers real inbound into the PTY. AMENDED v0.14.3 (ADR-0022 amendment, raw-inject removal): idle delivery is translation-binary-ONLY — the v0.11.0 raw `{text:payload}{key:enter}` inject is NO LONGER a delivery path; with no working binary (absent/spawn-failed/faulted/worker-gone) the inbound SPOOLS (delivered=false, poll-fed, LOUD), never a raw PTY pseudo-write (which did not submit on a modern TUI — the silent degrade that masked F-019). See REQ-HAZARD-IDLE-SILENT-NONDELIVERY. (v0.13.0, amended v0.14.3)",
2026-08-28T09:54:47.5042526Z       "requiredStages": [
2026-08-28T09:54:47.5042789Z         "doc",
2026-08-28T09:54:47.5043060Z         "impl",
2026-08-28T09:54:47.5043357Z         "unit",
2026-08-28T09:54:47.5043610Z         "int"
2026-08-28T09:54:47.5043871Z       ],
2026-08-28T09:54:47.5044132Z       "stages": {
2026-08-28T09:54:47.5044397Z         "doc": {
2026-08-28T09:54:47.5044679Z           "complete": true,
2026-08-28T09:54:47.5044955Z           "evidence": [
2026-08-28T09:54:47.5045208Z             {
2026-08-28T09:54:47.5045632Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:47.5045914Z               "line": 433
2026-08-28T09:54:47.5046172Z             },
2026-08-28T09:54:47.5046433Z             {
2026-08-28T09:54:47.5046748Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.5047023Z               "line": 371
2026-08-28T09:54:47.5047278Z             }
2026-08-28T09:54:47.5047546Z           ]
2026-08-28T09:54:47.5047799Z         },
2026-08-28T09:54:47.5048070Z         "impl": {
2026-08-28T09:54:47.5048419Z           "complete": true,
2026-08-28T09:54:47.5048695Z           "evidence": [
2026-08-28T09:54:47.5049034Z             {
2026-08-28T09:54:47.5049392Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.5049676Z               "line": 4416
2026-08-28T09:54:47.5049930Z             },
2026-08-28T09:54:47.5050193Z             {
2026-08-28T09:54:47.5050560Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.5050842Z               "line": 4734
2026-08-28T09:54:47.5051099Z             },
2026-08-28T09:54:47.5051423Z             {
2026-08-28T09:54:47.5051800Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.5052081Z               "line": 8525
2026-08-28T09:54:47.5052344Z             },
2026-08-28T09:54:47.5052595Z             {
2026-08-28T09:54:47.5052963Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.5053235Z               "line": 8605
2026-08-28T09:54:47.5053501Z             },
2026-08-28T09:54:47.5053778Z             {
2026-08-28T09:54:47.5054203Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5054480Z               "line": 23
2026-08-28T09:54:47.5054735Z             },
2026-08-28T09:54:47.5054995Z             {
2026-08-28T09:54:47.5055395Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5055667Z               "line": 92
2026-08-28T09:54:47.5055930Z             },
2026-08-28T09:54:47.5056183Z             {
2026-08-28T09:54:47.5056573Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5056850Z               "line": 242
2026-08-28T09:54:47.5057108Z             },
2026-08-28T09:54:47.5057361Z             {
2026-08-28T09:54:47.5057750Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5058025Z               "line": 308
2026-08-28T09:54:47.5058282Z             },
2026-08-28T09:54:47.5058534Z             {
2026-08-28T09:54:47.5058931Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5059370Z               "line": 332
2026-08-28T09:54:47.5059623Z             },
2026-08-28T09:54:47.5059885Z             {
2026-08-28T09:54:47.5060317Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.5060654Z               "line": 65
2026-08-28T09:54:47.5060911Z             },
2026-08-28T09:54:47.5061168Z             {
2026-08-28T09:54:47.5061555Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.5061826Z               "line": 1260
2026-08-28T09:54:47.5062088Z             }
2026-08-28T09:54:47.5062341Z           ]
2026-08-28T09:54:47.5062665Z         },
2026-08-28T09:54:47.5062923Z         "int": {
2026-08-28T09:54:47.5063213Z           "complete": true,
2026-08-28T09:54:47.5063485Z           "evidence": [
2026-08-28T09:54:47.5063747Z             {
2026-08-28T09:54:47.5064129Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:47.5064401Z               "line": 197
2026-08-28T09:54:47.5064662Z             },
2026-08-28T09:54:47.5064915Z             {
2026-08-28T09:54:47.5065391Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.5065665Z               "line": 1411
2026-08-28T09:54:47.5065922Z             },
2026-08-28T09:54:47.5066161Z             {
2026-08-28T09:54:47.5066624Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.5066905Z               "line": 1562
2026-08-28T09:54:47.5067152Z             },
2026-08-28T09:54:47.5067410Z             {
2026-08-28T09:54:47.5067868Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.5068153Z               "line": 1639
2026-08-28T09:54:47.5068403Z             },
2026-08-28T09:54:47.5068662Z             {
2026-08-28T09:54:47.5069205Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:47.5069481Z               "line": 1731
2026-08-28T09:54:47.5069738Z             }
2026-08-28T09:54:47.5070058Z           ]
2026-08-28T09:54:47.5070320Z         },
2026-08-28T09:54:47.5070583Z         "unit": {
2026-08-28T09:54:47.5070867Z           "complete": true,
2026-08-28T09:54:47.5071142Z           "evidence": [
2026-08-28T09:54:47.5071399Z             {
2026-08-28T09:54:47.5071796Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:47.5072062Z               "line": 608
2026-08-28T09:54:47.5072319Z             },
2026-08-28T09:54:47.5072572Z             {
2026-08-28T09:54:47.5072963Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5073297Z               "line": 371
2026-08-28T09:54:47.5073563Z             },
2026-08-28T09:54:47.5073826Z             {
2026-08-28T09:54:47.5074259Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5074536Z               "line": 425
2026-08-28T09:54:47.5074793Z             },
2026-08-28T09:54:47.5075056Z             {
2026-08-28T09:54:47.5075446Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5075723Z               "line": 455
2026-08-28T09:54:47.5075979Z             },
2026-08-28T09:54:47.5076240Z             {
2026-08-28T09:54:47.5076622Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:47.5076898Z               "line": 484
2026-08-28T09:54:47.5077155Z             },
2026-08-28T09:54:47.5077398Z             {
2026-08-28T09:54:47.5077784Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.5078051Z               "line": 1727
2026-08-28T09:54:47.5078313Z             }
2026-08-28T09:54:47.5078568Z           ]
2026-08-28T09:54:47.5078832Z         }
2026-08-28T09:54:47.5079174Z       }
2026-08-28T09:54:47.5079426Z     },
2026-08-28T09:54:47.5079683Z     {
2026-08-28T09:54:47.5080031Z       "id": "REQ-MSG-INJECT-LEG-DROP-VISIBLE",
2026-08-28T09:54:47.5093954Z       "title": "SEED (inactive — observability): a silently-dropped delivery leg must be DISTINGUISHABLE from an honestly-offline endpoint on a status surface. The spt-hosted inject leg (spt-daemon inject.rs `try_spt_hosted_inject` — the ONE shared implementation behind local cmd_send, the WAN ingress, the idle-edge drain, and the parked-idle/pulse re-offer belts) gates on `is_spt_hosted_no_relay` → `deliver::is_online` → `liveness::is_perch_alive`: a perch PINNED TO A DEAD SESSION (the KH 7.25 wedge class — dead owner, record not yet healed by the next auth touch) makes EVERY belt on that leg silently return None → messages spool as if the endpoint were ordinarily offline, while the operator-facing view can keep reading the recorded state. Nothing anywhere surfaces 'the inject leg stopped firing for this endpoint' — the idle-window injections just stop, which from the outside is indistinguishable from 'no messages arrived' (field shape: IDLE-EDGE W1 field-verify, perri's killed-resident rig — their 'so it did not repeat' conclusion was exactly this invisibility, self-corrected only by re-rigging with a live resident). Shape at activation: a status/list surface DERIVES and reports the inject-leg verdict per endpoint (inject-target / not-a-target + WHY: no perch, dead session pin, no relay, not controllable) so a dropped leg is a READABLE state, never an inferred one; additive-evolution posture on any --json surface. Kin: REQ-SHELL-LIST-DERIVED-PROVENANCE (view-vs-truth, same class), KH 7.25 (`REQ-HAZARD-SESSION-PIN-WEDGE`, the pin that drops the leg), KH 2.5 (liveness authority lives in ONE resolver — the verdict here REPORTS through it, never re-derives beside it).",
2026-08-28T09:54:47.5094490Z       "requiredStages": [],
2026-08-28T09:54:47.5094754Z       "stages": {
2026-08-28T09:54:47.5095027Z         "doc": {
2026-08-28T09:54:47.5095312Z           "complete": false,
2026-08-28T09:54:47.5095590Z           "evidence": []
2026-08-28T09:54:47.5095842Z         },
2026-08-28T09:54:47.5096110Z         "impl": {
2026-08-28T09:54:47.5096396Z           "complete": false,
2026-08-28T09:54:47.5096667Z           "evidence": []
2026-08-28T09:54:47.5096985Z         },
2026-08-28T09:54:47.5097241Z         "int": {
2026-08-28T09:54:47.5097541Z           "complete": false,
2026-08-28T09:54:47.5097813Z           "evidence": []
2026-08-28T09:54:47.5098071Z         },
2026-08-28T09:54:47.5098329Z         "unit": {
2026-08-28T09:54:47.5098619Z           "complete": false,
2026-08-28T09:54:47.5098899Z           "evidence": []
2026-08-28T09:54:47.5099239Z         }
2026-08-28T09:54:47.5099492Z       }
2026-08-28T09:54:47.5099748Z     },
2026-08-28T09:54:47.5100000Z     {
2026-08-28T09:54:47.5100332Z       "id": "REQ-MSG-SELF-DETECT-ANCESTRY",
2026-08-28T09:54:47.5110177Z       "title": "#9 (F026, operator field bug): a perch-owned `spt send` from an endpoint's OWN session must self-identify, not mis-stamp `cli@<node>` (whose replies bounce NO_PERCH). ROOT: roster::detect_self_id (roster.rs) was ENV-ONLY — OWL_SESSION_ID matched to info.session_id, else SPT_AGENT_ID — but an agent-session Bash child often carries NEITHER (the env export is spawn-path-dependent), so a perch-owned sender was classified bare-CLI and REQ-MSG-CLI-ORIGIN stamped it cli@<node> (the stamp works as designed on a wrong premise; that REQ's evidence stays intact). FIX: detect_self_id gains leg (c) PID-ANCESTRY fallback AFTER the env legs — walk THIS process's ancestry, match a live non-corrupt roster perch's recorded harness pid (info.json.pid Numeric, alive-gated via is_process_alive, corrupt/BUSY skipped), first match = self. from-LABEL / routing default ONLY, NOT authentication — authenticate() is untouched (pid-ancestry-for-AUTH stays parked per F-024 with its Windows pid-spoof caveats; a display/routing stamp has no such bar). Best-effort: a broken ancestry walk degrades to None → cli-stamp, never errors the send.",
2026-08-28T09:54:47.5110541Z       "requiredStages": [
2026-08-28T09:54:47.5110797Z         "impl",
2026-08-28T09:54:47.5111063Z         "unit",
2026-08-28T09:54:47.5111316Z         "int"
2026-08-28T09:54:47.5111569Z       ],
2026-08-28T09:54:47.5111832Z       "stages": {
2026-08-28T09:54:47.5112104Z         "doc": {
2026-08-28T09:54:47.5112486Z           "complete": false,
2026-08-28T09:54:47.5112767Z           "evidence": []
2026-08-28T09:54:47.5113022Z         },
2026-08-28T09:54:47.5113287Z         "impl": {
2026-08-28T09:54:47.5113582Z           "complete": true,
2026-08-28T09:54:47.5113860Z           "evidence": [
2026-08-28T09:54:47.5114117Z             {
2026-08-28T09:54:47.5114494Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:47.5114765Z               "line": 106
2026-08-28T09:54:47.5115024Z             },
2026-08-28T09:54:47.5115295Z             {
2026-08-28T09:54:47.5115639Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.5115981Z               "line": 258
2026-08-28T09:54:47.5116233Z             },
2026-08-28T09:54:47.5116490Z             {
2026-08-28T09:54:47.5116829Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:47.5117100Z               "line": 246
2026-08-28T09:54:47.5117353Z             },
2026-08-28T09:54:47.5117607Z             {
2026-08-28T09:54:47.5117950Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:47.5118225Z               "line": 292
2026-08-28T09:54:47.5118485Z             }
2026-08-28T09:54:47.5118732Z           ]
2026-08-28T09:54:47.5119095Z         },
2026-08-28T09:54:47.5119362Z         "int": {
2026-08-28T09:54:47.5119648Z           "complete": true,
2026-08-28T09:54:47.5119925Z           "evidence": [
2026-08-28T09:54:47.5120187Z             {
2026-08-28T09:54:47.5120521Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:47.5120798Z               "line": 447
2026-08-28T09:54:47.5121059Z             },
2026-08-28T09:54:47.5121313Z             {
2026-08-28T09:54:47.5121647Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:47.5121924Z               "line": 474
2026-08-28T09:54:47.5122182Z             }
2026-08-28T09:54:47.5122439Z           ]
2026-08-28T09:54:47.5122697Z         },
2026-08-28T09:54:47.5123031Z         "unit": {
2026-08-28T09:54:47.5123322Z           "complete": true,
2026-08-28T09:54:47.5123601Z           "evidence": [
2026-08-28T09:54:47.5123861Z             {
2026-08-28T09:54:47.5124200Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:47.5124471Z               "line": 415
2026-08-28T09:54:47.5124715Z             }
2026-08-28T09:54:47.5124968Z           ]
2026-08-28T09:54:47.5125226Z         }
2026-08-28T09:54:47.5125492Z       }
2026-08-28T09:54:47.5125740Z     },
2026-08-28T09:54:47.5125997Z     {
2026-08-28T09:54:47.5126312Z       "id": "REQ-MSG-SENDER-STAMP",
2026-08-28T09:54:47.5156917Z       "title": "Daemon-stamped authenticated sender: a NEW additive `WanMessage.sender_proven` field (serde-default) carrying the SESSION-PROVEN sender endpoint id, which lights up the REQ-ACL-SUBJECT-CHAIN tier-1 sender-endpoint rule that shipped schema-real but unfed in W1. The stamp is sourced from the session-proven path (`roster::detect_self_id` / the bound perch), NEVER from the caller-supplied `--from`: cli.rs `resolve_from` lets an explicit `--from` win over session detection, which is exactly why KNOWN-HAZARDS 7.5 binds `from` as reply-routing metadata and never an authorization subject. `from` is untouched and keeps its meaning; this is an addition, never a repurposing. TRUST BOUNDARY, stated so no later reader inflates \"authenticated sender\": the stamp proves the origin NODE cryptographically (QUIC handshake); the endpoint WITHIN that node is asserted by the sending daemon; strength therefore equals REQ-MSG-6's ratified boundary (trust = subnet membership, node = human-proxy). It DEFEATS agents forging `--from` on a box — the adversary milestone A's threat model actually names — and does NOT defend against a malicious member node. Same-node delivery is strictly stronger (the daemon knows the authenticated perch directly). Tier 1 ABSTAINS on absence (no stamp -> None -> the chain continues to the node tier), so N-1 senders, older daemons, and the five gate families that carry no sender endpoint keep today's behavior byte-for-byte. Adapter-invisible: a decision INPUT only, never entering the EVENT envelope, so no published adapter contract changes. Gate: doc — ADR-0009 amended (its \"not the sender endpoint's identity\" sentence becomes false the moment tier 1 fires) plus the wanmsg.rs module-doc carve-out stating that sender_proven IS decoded-and-acted-on, what bounds it, and that it never becomes the node subject (the origin-node paragraph stays verbatim — origin_node remains never-read-from-bytes, and `forged_origin_field_is_inert` stays untouched); impl — the additive field, the session-proven stamp at the send path, the receive-side threading into `AccessRequest.sender_endpoint`; unit — additive round-trip both directions (new field decodes, absent field defaults), a `--from` that disagrees with the stamp never becomes the subject, tier 1 fires on a proven stamp and abstains without one, and the W1 inertness guards REPLACED by their positive counterparts (the deliberate flip is the record). LATENT-RULE SCAN: REMOVED, AND NO LONGER REQUIRED BY THIS REQUIREMENT (releases#167, operator-ruled 2026-08-19: 'i never asked for it to be added, and never approved of its addition'). It was ruled in on 2026-07-29 as mechanism-not-memory — on the load where the tier went live, count existing SenderEndpoint rules and say loudly, once, that they were inert and are now live — and it found ZERO by construction in the coupled release, since no shipped version accepts a v2 store while the tier is inert. releases#155 asked for that unverifiable history claim to be made honest; the removal DISCHARGES it, because a banner that does not exist cannot claim a node's past or re-fire every boot. THE STAMP ITSELF IS UNTOUCHED: this strikes the announcement, not the tier — the additive wire field, the session-proven stamp, the receive-side threading and every tier-1 decision keep their evidence. The population accessor the scan used (`sender_endpoint_rule_ids`) survives with its other consumer under REQ-UNLISTED-EVIDENCE, which is where its unit now lives. If the DECOUPLING scenario this was written for ever becomes real, it returns as its own item with its own operator decision, never as a residue of this one.",
2026-08-28T09:54:47.5157546Z       "requiredStages": [
2026-08-28T09:54:47.5157808Z         "doc",
2026-08-28T09:54:47.5158063Z         "impl",
2026-08-28T09:54:47.5158326Z         "unit"
2026-08-28T09:54:47.5158579Z       ],
2026-08-28T09:54:47.5158846Z       "stages": {
2026-08-28T09:54:47.5159170Z         "doc": {
2026-08-28T09:54:47.5159457Z           "complete": true,
2026-08-28T09:54:47.5159795Z           "evidence": [
2026-08-28T09:54:47.5160057Z             {
2026-08-28T09:54:47.5160370Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.5160639Z               "line": 1065
2026-08-28T09:54:47.5160893Z             },
2026-08-28T09:54:47.5161146Z             {
2026-08-28T09:54:47.5161474Z               "path": "docs/FAULT-MATRIX.md",
2026-08-28T09:54:47.5161742Z               "line": 31
2026-08-28T09:54:47.5162004Z             },
2026-08-28T09:54:47.5162260Z             {
2026-08-28T09:54:47.5162720Z               "path": "docs/adr/0009-endpoint-access-control-model.md",
2026-08-28T09:54:47.5162991Z               "line": 13
2026-08-28T09:54:47.5163246Z             }
2026-08-28T09:54:47.5163506Z           ]
2026-08-28T09:54:47.5163760Z         },
2026-08-28T09:54:47.5164022Z         "impl": {
2026-08-28T09:54:47.5164304Z           "complete": true,
2026-08-28T09:54:47.5164580Z           "evidence": [
2026-08-28T09:54:47.5164837Z             {
2026-08-28T09:54:47.5165201Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.5165472Z               "line": 896
2026-08-28T09:54:47.5165723Z             },
2026-08-28T09:54:47.5165993Z             {
2026-08-28T09:54:47.5166355Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:47.5166632Z               "line": 123
2026-08-28T09:54:47.5166889Z             },
2026-08-28T09:54:47.5167147Z             {
2026-08-28T09:54:47.5167514Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:47.5167866Z               "line": 217
2026-08-28T09:54:47.5168125Z             },
2026-08-28T09:54:47.5168383Z             {
2026-08-28T09:54:47.5168705Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5169058Z               "line": 10887
2026-08-28T09:54:47.5169319Z             },
2026-08-28T09:54:47.5169572Z             {
2026-08-28T09:54:47.5169915Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.5170188Z               "line": 457
2026-08-28T09:54:47.5170454Z             }
2026-08-28T09:54:47.5170713Z           ]
2026-08-28T09:54:47.5171021Z         },
2026-08-28T09:54:47.5171281Z         "int": {
2026-08-28T09:54:47.5171567Z           "complete": false,
2026-08-28T09:54:47.5171847Z           "evidence": []
2026-08-28T09:54:47.5172101Z         },
2026-08-28T09:54:47.5172364Z         "unit": {
2026-08-28T09:54:47.5172640Z           "complete": true,
2026-08-28T09:54:47.5172917Z           "evidence": [
2026-08-28T09:54:47.5173179Z             {
2026-08-28T09:54:47.5173552Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:47.5173826Z               "line": 689
2026-08-28T09:54:47.5174076Z             },
2026-08-28T09:54:47.5174334Z             {
2026-08-28T09:54:47.5174687Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.5174964Z               "line": 1384
2026-08-28T09:54:47.5175263Z             },
2026-08-28T09:54:47.5175508Z             {
2026-08-28T09:54:47.5175875Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:47.5176152Z               "line": 297
2026-08-28T09:54:47.5176407Z             },
2026-08-28T09:54:47.5176681Z             {
2026-08-28T09:54:47.5177068Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:47.5177349Z               "line": 3889
2026-08-28T09:54:47.5177615Z             }
2026-08-28T09:54:47.5177873Z           ]
2026-08-28T09:54:47.5178130Z         }
2026-08-28T09:54:47.5178464Z       }
2026-08-28T09:54:47.5178714Z     },
2026-08-28T09:54:47.5183562Z     {
2026-08-28T09:54:47.5183910Z       "id": "REQ-NET-1",
2026-08-28T09:54:47.5184486Z       "title": "WAN messaging first-class, behind default-on net feature flag",
2026-08-28T09:54:47.5184775Z       "requiredStages": [
2026-08-28T09:54:47.5185042Z         "impl",
2026-08-28T09:54:47.5185303Z         "unit",
2026-08-28T09:54:47.5185566Z         "int"
2026-08-28T09:54:47.5185819Z       ],
2026-08-28T09:54:47.5186087Z       "stages": {
2026-08-28T09:54:47.5186345Z         "doc": {
2026-08-28T09:54:47.5186759Z           "complete": false,
2026-08-28T09:54:47.5187043Z           "evidence": []
2026-08-28T09:54:47.5187294Z         },
2026-08-28T09:54:47.5187565Z         "impl": {
2026-08-28T09:54:47.5187842Z           "complete": true,
2026-08-28T09:54:47.5188114Z           "evidence": [
2026-08-28T09:54:47.5188357Z             {
2026-08-28T09:54:47.5188734Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.5189073Z               "line": 55
2026-08-28T09:54:47.5189344Z             },
2026-08-28T09:54:47.5189603Z             {
2026-08-28T09:54:47.5189969Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.5190250Z               "line": 2123
2026-08-28T09:54:47.5190508Z             },
2026-08-28T09:54:47.5190764Z             {
2026-08-28T09:54:47.5191113Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:47.5191394Z               "line": 706
2026-08-28T09:54:47.5191651Z             },
2026-08-28T09:54:47.5191903Z             {
2026-08-28T09:54:47.5192292Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5192568Z               "line": 103
2026-08-28T09:54:47.5192831Z             },
2026-08-28T09:54:47.5193089Z             {
2026-08-28T09:54:47.5193484Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5193756Z               "line": 287
2026-08-28T09:54:47.5194009Z             },
2026-08-28T09:54:47.5194275Z             {
2026-08-28T09:54:47.5194648Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5194994Z               "line": 303
2026-08-28T09:54:47.5195249Z             },
2026-08-28T09:54:47.5195511Z             {
2026-08-28T09:54:47.5195873Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5196155Z               "line": 318
2026-08-28T09:54:47.5196408Z             },
2026-08-28T09:54:47.5196661Z             {
2026-08-28T09:54:47.5197037Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5197310Z               "line": 436
2026-08-28T09:54:47.5197575Z             },
2026-08-28T09:54:47.5197887Z             {
2026-08-28T09:54:47.5198269Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5198546Z               "line": 505
2026-08-28T09:54:47.5198809Z             },
2026-08-28T09:54:47.5199143Z             {
2026-08-28T09:54:47.5199524Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5199805Z               "line": 511
2026-08-28T09:54:47.5200196Z             },
2026-08-28T09:54:47.5200567Z             {
2026-08-28T09:54:47.5201143Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5201572Z               "line": 517
2026-08-28T09:54:47.5201988Z             },
2026-08-28T09:54:47.5202408Z             {
2026-08-28T09:54:47.5202990Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5203420Z               "line": 533
2026-08-28T09:54:47.5203848Z             },
2026-08-28T09:54:47.5204244Z             {
2026-08-28T09:54:47.5204816Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5205261Z               "line": 553
2026-08-28T09:54:47.5205540Z             },
2026-08-28T09:54:47.5205794Z             {
2026-08-28T09:54:47.5206167Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:47.5206443Z               "line": 101
2026-08-28T09:54:47.5206826Z             },
2026-08-28T09:54:47.5207073Z             {
2026-08-28T09:54:47.5207436Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:47.5207841Z               "line": 205
2026-08-28T09:54:47.5208238Z             },
2026-08-28T09:54:47.5208605Z             {
2026-08-28T09:54:47.5209248Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5209698Z               "line": 383
2026-08-28T09:54:47.5210121Z             },
2026-08-28T09:54:47.5210532Z             {
2026-08-28T09:54:47.5210984Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5211375Z               "line": 11472
2026-08-28T09:54:47.5211647Z             },
2026-08-28T09:54:47.5212042Z             {
2026-08-28T09:54:47.5212519Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.5212795Z               "line": 17
2026-08-28T09:54:47.5213057Z             }
2026-08-28T09:54:47.5213313Z           ]
2026-08-28T09:54:47.5213560Z         },
2026-08-28T09:54:47.5213826Z         "int": {
2026-08-28T09:54:47.5214112Z           "complete": true,
2026-08-28T09:54:47.5214389Z           "evidence": [
2026-08-28T09:54:47.5214638Z             {
2026-08-28T09:54:47.5215023Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.5215295Z               "line": 375
2026-08-28T09:54:47.5215553Z             },
2026-08-28T09:54:47.5215807Z             {
2026-08-28T09:54:47.5216171Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5216446Z               "line": 1019
2026-08-28T09:54:47.5216698Z             },
2026-08-28T09:54:47.5216956Z             {
2026-08-28T09:54:47.5217323Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5217604Z               "line": 1969
2026-08-28T09:54:47.5217867Z             }
2026-08-28T09:54:47.5218124Z           ]
2026-08-28T09:54:47.5218378Z         },
2026-08-28T09:54:47.5218638Z         "unit": {
2026-08-28T09:54:47.5218921Z           "complete": true,
2026-08-28T09:54:47.5219323Z           "evidence": [
2026-08-28T09:54:47.5219585Z             {
2026-08-28T09:54:47.5220062Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.5220343Z               "line": 2202
2026-08-28T09:54:47.5220611Z             },
2026-08-28T09:54:47.5220949Z             {
2026-08-28T09:54:47.5221391Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.5221663Z               "line": 2283
2026-08-28T09:54:47.5221926Z             },
2026-08-28T09:54:47.5222179Z             {
2026-08-28T09:54:47.5222569Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.5222851Z               "line": 1178
2026-08-28T09:54:47.5223185Z             },
2026-08-28T09:54:47.5223447Z             {
2026-08-28T09:54:47.5223812Z               "path": "crates/spt-daemon/tests/wanmsg.rs",
2026-08-28T09:54:47.5224091Z               "line": 197
2026-08-28T09:54:47.5224343Z             },
2026-08-28T09:54:47.5224606Z             {
2026-08-28T09:54:47.5224977Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5225259Z               "line": 707
2026-08-28T09:54:47.5225517Z             },
2026-08-28T09:54:47.5225775Z             {
2026-08-28T09:54:47.5226300Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5226584Z               "line": 721
2026-08-28T09:54:47.5226848Z             },
2026-08-28T09:54:47.5227102Z             {
2026-08-28T09:54:47.5227482Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5227751Z               "line": 740
2026-08-28T09:54:47.5228022Z             },
2026-08-28T09:54:47.5228275Z             {
2026-08-28T09:54:47.5228642Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:47.5228919Z               "line": 246
2026-08-28T09:54:47.5229275Z             },
2026-08-28T09:54:47.5229539Z             {
2026-08-28T09:54:47.5229902Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:47.5230174Z               "line": 417
2026-08-28T09:54:47.5230489Z             },
2026-08-28T09:54:47.5230741Z             {
2026-08-28T09:54:47.5231094Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:47.5231361Z               "line": 1197
2026-08-28T09:54:47.5231618Z             },
2026-08-28T09:54:47.5231871Z             {
2026-08-28T09:54:47.5232214Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.5232486Z               "line": 2075
2026-08-28T09:54:47.5232749Z             },
2026-08-28T09:54:47.5232995Z             {
2026-08-28T09:54:47.5233334Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.5233678Z               "line": 2769
2026-08-28T09:54:47.5233930Z             }
2026-08-28T09:54:47.5234187Z           ]
2026-08-28T09:54:47.5234443Z         }
2026-08-28T09:54:47.5234699Z       }
2026-08-28T09:54:47.5234951Z     },
2026-08-28T09:54:47.5235208Z     {
2026-08-28T09:54:47.5235481Z       "id": "REQ-NET-2",
2026-08-28T09:54:47.5236039Z       "title": "n0 relay default + self-host knob + plain-language disclosure",
2026-08-28T09:54:47.5236330Z       "requiredStages": [
2026-08-28T09:54:47.5236574Z         "impl"
2026-08-28T09:54:47.5236831Z       ],
2026-08-28T09:54:47.5237091Z       "stages": {
2026-08-28T09:54:47.5237352Z         "doc": {
2026-08-28T09:54:47.5237648Z           "complete": false,
2026-08-28T09:54:47.5237925Z           "evidence": []
2026-08-28T09:54:47.5238163Z         },
2026-08-28T09:54:47.5238424Z         "impl": {
2026-08-28T09:54:47.5238715Z           "complete": true,
2026-08-28T09:54:47.5239087Z           "evidence": [
2026-08-28T09:54:47.5239354Z             {
2026-08-28T09:54:47.5239715Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:47.5239989Z               "line": 57
2026-08-28T09:54:47.5240247Z             },
2026-08-28T09:54:47.5240500Z             {
2026-08-28T09:54:47.5240882Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5241162Z               "line": 77
2026-08-28T09:54:47.5241426Z             },
2026-08-28T09:54:47.5241679Z             {
2026-08-28T09:54:47.5242140Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5242413Z               "line": 87
2026-08-28T09:54:47.5242678Z             },
2026-08-28T09:54:47.5242926Z             {
2026-08-28T09:54:47.5243423Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5243694Z               "line": 287
2026-08-28T09:54:47.5243952Z             },
2026-08-28T09:54:47.5244214Z             {
2026-08-28T09:54:47.5244587Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5244870Z               "line": 303
2026-08-28T09:54:47.5245187Z             },
2026-08-28T09:54:47.5245449Z             {
2026-08-28T09:54:47.5245826Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5246107Z               "line": 318
2026-08-28T09:54:47.5246365Z             }
2026-08-28T09:54:47.5246618Z           ]
2026-08-28T09:54:47.5246876Z         },
2026-08-28T09:54:47.5247139Z         "int": {
2026-08-28T09:54:47.5247429Z           "complete": false,
2026-08-28T09:54:47.5247704Z           "evidence": []
2026-08-28T09:54:47.5247964Z         },
2026-08-28T09:54:47.5248222Z         "unit": {
2026-08-28T09:54:47.5248513Z           "complete": true,
2026-08-28T09:54:47.5248795Z           "evidence": [
2026-08-28T09:54:47.5249138Z             {
2026-08-28T09:54:47.5249509Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:47.5249786Z               "line": 508
2026-08-28T09:54:47.5250039Z             }
2026-08-28T09:54:47.5250289Z           ]
2026-08-28T09:54:47.5250549Z         }
2026-08-28T09:54:47.5250808Z       }
2026-08-28T09:54:47.5251060Z     },
2026-08-28T09:54:47.5251309Z     {
2026-08-28T09:54:47.5251590Z       "id": "REQ-NET-3",
2026-08-28T09:54:47.5252095Z       "title": "Cross-node Psyche sync over P2P replaces gh-repo-sync",
2026-08-28T09:54:47.5252380Z       "requiredStages": [
2026-08-28T09:54:47.5252644Z         "impl",
2026-08-28T09:54:47.5252959Z         "unit"
2026-08-28T09:54:47.5253219Z       ],
2026-08-28T09:54:47.5253481Z       "stages": {
2026-08-28T09:54:47.5253738Z         "doc": {
2026-08-28T09:54:47.5254020Z           "complete": false,
2026-08-28T09:54:47.5254301Z           "evidence": []
2026-08-28T09:54:47.5254555Z         },
2026-08-28T09:54:47.5254813Z         "impl": {
2026-08-28T09:54:47.5255098Z           "complete": true,
2026-08-28T09:54:47.5255406Z           "evidence": [
2026-08-28T09:54:47.5255662Z             {
2026-08-28T09:54:47.5256019Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.5256348Z               "line": 39
2026-08-28T09:54:47.5256610Z             },
2026-08-28T09:54:47.5256873Z             {
2026-08-28T09:54:47.5257235Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.5257512Z               "line": 183
2026-08-28T09:54:47.5257770Z             },
2026-08-28T09:54:47.5258029Z             {
2026-08-28T09:54:47.5258374Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.5258648Z               "line": 334
2026-08-28T09:54:47.5258905Z             },
2026-08-28T09:54:47.5259254Z             {
2026-08-28T09:54:47.5259597Z               "path": "crates/spt-net/src/net/sync.rs",
2026-08-28T09:54:47.5259874Z               "line": 36
2026-08-28T09:54:47.5260131Z             },
2026-08-28T09:54:47.5260384Z             {
2026-08-28T09:54:47.5260764Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5261039Z               "line": 232
2026-08-28T09:54:47.5261301Z             },
2026-08-28T09:54:47.5261569Z             {
2026-08-28T09:54:47.5261954Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5262217Z               "line": 345
2026-08-28T09:54:47.5262474Z             },
2026-08-28T09:54:47.5262731Z             {
2026-08-28T09:54:47.5263099Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5263370Z               "line": 366
2026-08-28T09:54:47.5263641Z             },
2026-08-28T09:54:47.5263969Z             {
2026-08-28T09:54:47.5264356Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5264627Z               "line": 424
2026-08-28T09:54:47.5264881Z             },
2026-08-28T09:54:47.5265139Z             {
2026-08-28T09:54:47.5265673Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5265957Z               "line": 443
2026-08-28T09:54:47.5266198Z             },
2026-08-28T09:54:47.5266447Z             {
2026-08-28T09:54:47.5266818Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5267100Z               "line": 481
2026-08-28T09:54:47.5267424Z             },
2026-08-28T09:54:47.5267677Z             {
2026-08-28T09:54:47.5268053Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5268325Z               "line": 526
2026-08-28T09:54:47.5268589Z             },
2026-08-28T09:54:47.5268843Z             {
2026-08-28T09:54:47.5269324Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.5269600Z               "line": 541
2026-08-28T09:54:47.5269853Z             },
2026-08-28T09:54:47.5270109Z             {
2026-08-28T09:54:47.5270472Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:47.5270739Z               "line": 29
2026-08-28T09:54:47.5270996Z             },
2026-08-28T09:54:47.5271259Z             {
2026-08-28T09:54:47.5271637Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:47.5271914Z               "line": 72
2026-08-28T09:54:47.5272177Z             },
2026-08-28T09:54:47.5272434Z             {
2026-08-28T09:54:47.5272805Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:47.5273078Z               "line": 123
2026-08-28T09:54:47.5273339Z             }
2026-08-28T09:54:47.5273592Z           ]
2026-08-28T09:54:47.5273849Z         },
2026-08-28T09:54:47.5274107Z         "int": {
2026-08-28T09:54:47.5274488Z           "complete": false,
2026-08-28T09:54:47.5274764Z           "evidence": []
2026-08-28T09:54:47.5275017Z         },
2026-08-28T09:54:47.5275274Z         "unit": {
2026-08-28T09:54:47.5275550Z           "complete": true,
2026-08-28T09:54:47.5275817Z           "evidence": [
2026-08-28T09:54:47.5276061Z             {
2026-08-28T09:54:47.5276427Z               "path": "crates/spt-daemon/tests/sync.rs",
2026-08-28T09:54:47.5276697Z               "line": 221
2026-08-28T09:54:47.5276954Z             },
2026-08-28T09:54:47.5277212Z             {
2026-08-28T09:54:47.5277584Z               "path": "crates/spt-daemon/tests/sync.rs",
2026-08-28T09:54:47.5277918Z               "line": 349
2026-08-28T09:54:47.5278170Z             },
2026-08-28T09:54:47.5278427Z             {
2026-08-28T09:54:47.5278781Z               "path": "crates/spt-daemon/tests/sync.rs",
2026-08-28T09:54:47.5279139Z               "line": 514
2026-08-28T09:54:47.5279403Z             },
2026-08-28T09:54:47.5279663Z             {
2026-08-28T09:54:47.5280021Z               "path": "crates/spt-net/src/net/sync.rs",
2026-08-28T09:54:47.5280302Z               "line": 93
2026-08-28T09:54:47.5280556Z             },
2026-08-28T09:54:47.5280794Z             {
2026-08-28T09:54:47.5281137Z               "path": "crates/spt-net/src/net/sync.rs",
2026-08-28T09:54:47.5281415Z               "line": 142
2026-08-28T09:54:47.5281672Z             },
2026-08-28T09:54:47.5281927Z             {
2026-08-28T09:54:47.5282306Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:47.5282578Z               "line": 315
2026-08-28T09:54:47.5282836Z             },
2026-08-28T09:54:47.5283094Z             {
2026-08-28T09:54:47.5283480Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:47.5283752Z               "line": 355
2026-08-28T09:54:47.5284009Z             },
2026-08-28T09:54:47.5284263Z             {
2026-08-28T09:54:47.5284635Z               "path": "crates/spt-store/src/syncmerge.rs",
2026-08-28T09:54:47.5284905Z               "line": 494
2026-08-28T09:54:47.5285167Z             }
2026-08-28T09:54:47.5285505Z           ]
2026-08-28T09:54:47.5285771Z         }
2026-08-28T09:54:47.5286039Z       }
2026-08-28T09:54:47.5286287Z     },
2026-08-28T09:54:47.5286550Z     {
2026-08-28T09:54:47.5286861Z       "id": "REQ-NET-FAMILY-GATE",
2026-08-28T09:54:47.5294307Z       "title": "spt-core binds only IP families that are actually REACHABLE (ADR-0030), so a half-broken family (e.g. IPv6 whose AAAA resolves but whose path is dead) never silently consumes connection/discovery time. At NetEndpoint::bind (endpoint.rs), probe each family's reachability ONCE and bind only the working ones: dual-stack when both healthy; IPv4-only when IPv6 is dead; IPv6-only when IPv4 is dead (drop the DEAD family — NOT a fixed prefer-IPv4; IPv6-only networks must keep working). Re-evaluated on daemon restart (once-at-bind, no live re-eval in v1). Explicit overrides SPT_DISABLE_IPV6 / SPT_DISABLE_IPV4 force a family off (escape hatch + determinism + testing, mirroring SPT_NTP_SERVER); a forced-off family is never bound regardless of the probe. Reusable beyond join — every spt connection benefits. (next milestone)",
2026-08-28T09:54:47.5294707Z       "requiredStages": [
2026-08-28T09:54:47.5294964Z         "doc",
2026-08-28T09:54:47.5295232Z         "impl",
2026-08-28T09:54:47.5295489Z         "unit"
2026-08-28T09:54:47.5295746Z       ],
2026-08-28T09:54:47.5296017Z       "stages": {
2026-08-28T09:54:47.5296270Z         "doc": {
2026-08-28T09:54:47.5296556Z           "complete": true,
2026-08-28T09:54:47.5296829Z           "evidence": [
2026-08-28T09:54:47.5297101Z             {
2026-08-28T09:54:47.5297515Z               "path": "docs/adr/0030-robust-wan-subnet-join.md",
2026-08-28T09:54:47.5297794Z               "line": 3
2026-08-28T09:54:47.5298055Z             }
2026-08-28T09:54:47.5298307Z           ]
2026-08-28T09:54:47.5298565Z         },
2026-08-28T09:54:47.5298827Z         "impl": {
2026-08-28T09:54:47.5299203Z           "complete": true,
2026-08-28T09:54:47.5299547Z           "evidence": [
2026-08-28T09:54:47.5299805Z             {
2026-08-28T09:54:47.5300197Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5300472Z               "line": 216
2026-08-28T09:54:47.5300727Z             },
2026-08-28T09:54:47.5300975Z             {
2026-08-28T09:54:47.5301362Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5301709Z               "line": 261
2026-08-28T09:54:47.5301971Z             }
2026-08-28T09:54:47.5302225Z           ]
2026-08-28T09:54:47.5302483Z         },
2026-08-28T09:54:47.5302811Z         "int": {
2026-08-28T09:54:47.5303105Z           "complete": false,
2026-08-28T09:54:47.5303383Z           "evidence": []
2026-08-28T09:54:47.5303632Z         },
2026-08-28T09:54:47.5303895Z         "unit": {
2026-08-28T09:54:47.5304171Z           "complete": true,
2026-08-28T09:54:47.5304448Z           "evidence": [
2026-08-28T09:54:47.5304695Z             {
2026-08-28T09:54:47.5305172Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5305539Z               "line": 641
2026-08-28T09:54:47.5305811Z             },
2026-08-28T09:54:47.5306073Z             {
2026-08-28T09:54:47.5306497Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:47.5306802Z               "line": 691
2026-08-28T09:54:47.5307045Z             }
2026-08-28T09:54:47.5307294Z           ]
2026-08-28T09:54:47.5307536Z         }
2026-08-28T09:54:47.5307793Z       }
2026-08-28T09:54:47.5308046Z     },
2026-08-28T09:54:47.5308302Z     {
2026-08-28T09:54:47.5308668Z       "id": "REQ-NET-PINNED-UDP-PORT",
2026-08-28T09:54:47.5314287Z       "title": "Seed (releases#54, doyle L3 ruling 2026-07-31): a pinned UDP port for the production QUIC endpoint, so a host-firewall rule can be written once and stay true across restarts. Today BindScope::All binds ephemeral and BindScope::Port exists only in test scope (pairhost maps it back to All), which is why REQ-INBOUND-LINUX-HOST-FIREWALL-VERIFY ships verify-only — the repair half has nothing durable to allow. Not a rider on the verify wave: pinning a port is a transport-config AND security-posture decision with pairing/ticket/two-host ripple, and it is operator-visible, so it takes its own wave and its own gate.",
2026-08-28T09:54:47.5314703Z       "requiredStages": [],
2026-08-28T09:54:47.5314965Z       "stages": {
2026-08-28T09:54:47.5315217Z         "doc": {
2026-08-28T09:54:47.5315508Z           "complete": false,
2026-08-28T09:54:47.5315780Z           "evidence": []
2026-08-28T09:54:47.5316038Z         },
2026-08-28T09:54:47.5316306Z         "impl": {
2026-08-28T09:54:47.5316585Z           "complete": false,
2026-08-28T09:54:47.5316938Z           "evidence": []
2026-08-28T09:54:47.5317196Z         },
2026-08-28T09:54:47.5317457Z         "int": {
2026-08-28T09:54:47.5317743Z           "complete": false,
2026-08-28T09:54:47.5318025Z           "evidence": []
2026-08-28T09:54:47.5318278Z         },
2026-08-28T09:54:47.5318541Z         "unit": {
2026-08-28T09:54:47.5318839Z           "complete": false,
2026-08-28T09:54:47.5319214Z           "evidence": []
2026-08-28T09:54:47.5319471Z         }
2026-08-28T09:54:47.5319723Z       }
2026-08-28T09:54:47.5319986Z     },
2026-08-28T09:54:47.5320234Z     {
2026-08-28T09:54:47.5320549Z       "id": "REQ-NODE-IDENTITY",
2026-08-28T09:54:47.5321250Z       "title": "Ed25519 identity primitive: keypair, detached sign/verify, stable pubkey<->hex",
2026-08-28T09:54:47.5321545Z       "requiredStages": [
2026-08-28T09:54:47.5321810Z         "impl",
2026-08-28T09:54:47.5322067Z         "unit"
2026-08-28T09:54:47.5322324Z       ],
2026-08-28T09:54:47.5322585Z       "stages": {
2026-08-28T09:54:47.5322848Z         "doc": {
2026-08-28T09:54:47.5323130Z           "complete": false,
2026-08-28T09:54:47.5323406Z           "evidence": []
2026-08-28T09:54:47.5323650Z         },
2026-08-28T09:54:47.5323913Z         "impl": {
2026-08-28T09:54:47.5324182Z           "complete": true,
2026-08-28T09:54:47.5324452Z           "evidence": [
2026-08-28T09:54:47.5324785Z             {
2026-08-28T09:54:47.5325153Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5325424Z               "line": 60
2026-08-28T09:54:47.5325682Z             },
2026-08-28T09:54:47.5325940Z             {
2026-08-28T09:54:47.5326302Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5326575Z               "line": 68
2026-08-28T09:54:47.5326828Z             },
2026-08-28T09:54:47.5327082Z             {
2026-08-28T09:54:47.5327446Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5327765Z               "line": 86
2026-08-28T09:54:47.5328032Z             },
2026-08-28T09:54:47.5328284Z             {
2026-08-28T09:54:47.5328656Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5328928Z               "line": 120
2026-08-28T09:54:47.5329271Z             },
2026-08-28T09:54:47.5329526Z             {
2026-08-28T09:54:47.5329888Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5330155Z               "line": 127
2026-08-28T09:54:47.5330408Z             },
2026-08-28T09:54:47.5330662Z             {
2026-08-28T09:54:47.5331028Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5331452Z               "line": 143
2026-08-28T09:54:47.5331714Z             },
2026-08-28T09:54:47.5331964Z             {
2026-08-28T09:54:47.5332309Z               "path": "crates/spt-store/src/nodeid.rs",
2026-08-28T09:54:47.5332574Z               "line": 16
2026-08-28T09:54:47.5332821Z             }
2026-08-28T09:54:47.5333070Z           ]
2026-08-28T09:54:47.5333328Z         },
2026-08-28T09:54:47.5333585Z         "int": {
2026-08-28T09:54:47.5333877Z           "complete": false,
2026-08-28T09:54:47.5334158Z           "evidence": []
2026-08-28T09:54:47.5334414Z         },
2026-08-28T09:54:47.5334676Z         "unit": {
2026-08-28T09:54:47.5334960Z           "complete": true,
2026-08-28T09:54:47.5335242Z           "evidence": [
2026-08-28T09:54:47.5335565Z             {
2026-08-28T09:54:47.5336052Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5336420Z               "line": 199
2026-08-28T09:54:47.5336676Z             },
2026-08-28T09:54:47.5336925Z             {
2026-08-28T09:54:47.5337306Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5337567Z               "line": 218
2026-08-28T09:54:47.5337821Z             },
2026-08-28T09:54:47.5338078Z             {
2026-08-28T09:54:47.5338435Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5338707Z               "line": 234
2026-08-28T09:54:47.5339051Z             },
2026-08-28T09:54:47.5339375Z             {
2026-08-28T09:54:47.5339745Z               "path": "crates/spt-proto/src/identity.rs",
2026-08-28T09:54:47.5340021Z               "line": 256
2026-08-28T09:54:47.5340277Z             },
2026-08-28T09:54:47.5340519Z             {
2026-08-28T09:54:47.5340878Z               "path": "crates/spt-store/src/nodeid.rs",
2026-08-28T09:54:47.5341153Z               "line": 127
2026-08-28T09:54:47.5341411Z             },
2026-08-28T09:54:47.5341664Z             {
2026-08-28T09:54:47.5342027Z               "path": "crates/spt-store/src/nodeid.rs",
2026-08-28T09:54:47.5342298Z               "line": 143
2026-08-28T09:54:47.5342562Z             },
2026-08-28T09:54:47.5342817Z             {
2026-08-28T09:54:47.5343163Z               "path": "crates/spt-store/src/nodeid.rs",
2026-08-28T09:54:47.5343521Z               "line": 158
2026-08-28T09:54:47.5343774Z             }
2026-08-28T09:54:47.5344030Z           ]
2026-08-28T09:54:47.5344278Z         }
2026-08-28T09:54:47.5344531Z       }
2026-08-28T09:54:47.5344855Z     },
2026-08-28T09:54:47.5345104Z     {
2026-08-28T09:54:47.5345384Z       "id": "REQ-NOTIF-1",
2026-08-28T09:54:47.5346521Z       "title": "Notification primitive: per-subnet replicated spool, seen/dismissed, resurface-at-boundary, subsumes update+consent prompts",
2026-08-28T09:54:47.5346812Z       "requiredStages": [
2026-08-28T09:54:47.5347127Z         "impl",
2026-08-28T09:54:47.5347384Z         "unit",
2026-08-28T09:54:47.5347638Z         "int"
2026-08-28T09:54:47.5347900Z       ],
2026-08-28T09:54:47.5348169Z       "stages": {
2026-08-28T09:54:47.5348423Z         "doc": {
2026-08-28T09:54:47.5348719Z           "complete": false,
2026-08-28T09:54:47.5349286Z           "evidence": []
2026-08-28T09:54:47.5349596Z         },
2026-08-28T09:54:47.5349868Z         "impl": {
2026-08-28T09:54:47.5350169Z           "complete": true,
2026-08-28T09:54:47.5350438Z           "evidence": [
2026-08-28T09:54:47.5350822Z             {
2026-08-28T09:54:47.5351214Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.5351491Z               "line": 1436
2026-08-28T09:54:47.5351748Z             },
2026-08-28T09:54:47.5352009Z             {
2026-08-28T09:54:47.5352362Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5352634Z               "line": 30
2026-08-28T09:54:47.5352891Z             },
2026-08-28T09:54:47.5353145Z             {
2026-08-28T09:54:47.5353504Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5353781Z               "line": 93
2026-08-28T09:54:47.5354039Z             },
2026-08-28T09:54:47.5354295Z             {
2026-08-28T09:54:47.5354648Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5354915Z               "line": 117
2026-08-28T09:54:47.5355167Z             },
2026-08-28T09:54:47.5355420Z             {
2026-08-28T09:54:47.5355773Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5356043Z               "line": 131
2026-08-28T09:54:47.5356295Z             },
2026-08-28T09:54:47.5356557Z             {
2026-08-28T09:54:47.5356906Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5357177Z               "line": 166
2026-08-28T09:54:47.5357434Z             },
2026-08-28T09:54:47.5357687Z             {
2026-08-28T09:54:47.5358040Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5358316Z               "line": 268
2026-08-28T09:54:47.5358654Z             },
2026-08-28T09:54:47.5358907Z             {
2026-08-28T09:54:47.5359397Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5359674Z               "line": 376
2026-08-28T09:54:47.5359932Z             },
2026-08-28T09:54:47.5360190Z             {
2026-08-28T09:54:47.5360533Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5360810Z               "line": 589
2026-08-28T09:54:47.5361066Z             },
2026-08-28T09:54:47.5361320Z             {
2026-08-28T09:54:47.5361678Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5362013Z               "line": 715
2026-08-28T09:54:47.5362274Z             },
2026-08-28T09:54:47.5362527Z             {
2026-08-28T09:54:47.5362908Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5363175Z               "line": 24
2026-08-28T09:54:47.5363437Z             },
2026-08-28T09:54:47.5363701Z             {
2026-08-28T09:54:47.5364074Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5364365Z               "line": 34
2026-08-28T09:54:47.5364623Z             },
2026-08-28T09:54:47.5364880Z             {
2026-08-28T09:54:47.5365262Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5365538Z               "line": 60
2026-08-28T09:54:47.5365795Z             },
2026-08-28T09:54:47.5366052Z             {
2026-08-28T09:54:47.5366432Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5366707Z               "line": 86
2026-08-28T09:54:47.5366964Z             },
2026-08-28T09:54:47.5367218Z             {
2026-08-28T09:54:47.5367594Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5367861Z               "line": 102
2026-08-28T09:54:47.5368120Z             },
2026-08-28T09:54:47.5368376Z             {
2026-08-28T09:54:47.5368749Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:47.5369181Z               "line": 96
2026-08-28T09:54:47.5369444Z             },
2026-08-28T09:54:47.5369705Z             {
2026-08-28T09:54:47.5370082Z               "path": "crates/spt-daemon/src/pump/notif.rs",
2026-08-28T09:54:47.5370350Z               "line": 44
2026-08-28T09:54:47.5370596Z             },
2026-08-28T09:54:47.5370854Z             {
2026-08-28T09:54:47.5371216Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5371492Z               "line": 20
2026-08-28T09:54:47.5371743Z             },
2026-08-28T09:54:47.5372076Z             {
2026-08-28T09:54:47.5372439Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5372706Z               "line": 30
2026-08-28T09:54:47.5372968Z             },
2026-08-28T09:54:47.5373217Z             {
2026-08-28T09:54:47.5373570Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5373842Z               "line": 50
2026-08-28T09:54:47.5374093Z             },
2026-08-28T09:54:47.5374364Z             {
2026-08-28T09:54:47.5374714Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5374991Z               "line": 28
2026-08-28T09:54:47.5375244Z             },
2026-08-28T09:54:47.5375502Z             {
2026-08-28T09:54:47.5375846Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5376117Z               "line": 234
2026-08-28T09:54:47.5376374Z             },
2026-08-28T09:54:47.5376626Z             {
2026-08-28T09:54:47.5376974Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5377243Z               "line": 434
2026-08-28T09:54:47.5377502Z             },
2026-08-28T09:54:47.5377754Z             {
2026-08-28T09:54:47.5378106Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5378379Z               "line": 475
2026-08-28T09:54:47.5378641Z             },
2026-08-28T09:54:47.5378898Z             {
2026-08-28T09:54:47.5379319Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5379590Z               "line": 502
2026-08-28T09:54:47.5379917Z             },
2026-08-28T09:54:47.5380174Z             {
2026-08-28T09:54:47.5380517Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5380794Z               "line": 527
2026-08-28T09:54:47.5381043Z             },
2026-08-28T09:54:47.5381310Z             {
2026-08-28T09:54:47.5381657Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5381925Z               "line": 550
2026-08-28T09:54:47.5382176Z             },
2026-08-28T09:54:47.5382431Z             {
2026-08-28T09:54:47.5383018Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.5383379Z               "line": 213
2026-08-28T09:54:47.5383643Z             }
2026-08-28T09:54:47.5383895Z           ]
2026-08-28T09:54:47.5384149Z         },
2026-08-28T09:54:47.5384407Z         "int": {
2026-08-28T09:54:47.5384692Z           "complete": true,
2026-08-28T09:54:47.5384967Z           "evidence": [
2026-08-28T09:54:47.5385223Z             {
2026-08-28T09:54:47.5385608Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.5385885Z               "line": 311
2026-08-28T09:54:47.5386143Z             },
2026-08-28T09:54:47.5386396Z             {
2026-08-28T09:54:47.5386758Z               "path": "crates/spt-daemon/tests/pump.rs",
2026-08-28T09:54:47.5387035Z               "line": 144
2026-08-28T09:54:47.5387284Z             },
2026-08-28T09:54:47.5387543Z             {
2026-08-28T09:54:47.5387913Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5388189Z               "line": 1130
2026-08-28T09:54:47.5388446Z             },
2026-08-28T09:54:47.5388705Z             {
2026-08-28T09:54:47.5389162Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5389434Z               "line": 2135
2026-08-28T09:54:47.5389706Z             }
2026-08-28T09:54:47.5389959Z           ]
2026-08-28T09:54:47.5390222Z         },
2026-08-28T09:54:47.5390545Z         "unit": {
2026-08-28T09:54:47.5390830Z           "complete": true,
2026-08-28T09:54:47.5391107Z           "evidence": [
2026-08-28T09:54:47.5391364Z             {
2026-08-28T09:54:47.5391721Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5391984Z               "line": 825
2026-08-28T09:54:47.5392251Z             },
2026-08-28T09:54:47.5392495Z             {
2026-08-28T09:54:47.5392845Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5397675Z               "line": 1107
2026-08-28T09:54:47.5397971Z             },
2026-08-28T09:54:47.5398321Z             {
2026-08-28T09:54:47.5398697Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5399045Z               "line": 1217
2026-08-28T09:54:47.5399313Z             },
2026-08-28T09:54:47.5399570Z             {
2026-08-28T09:54:47.5399937Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5400214Z               "line": 1249
2026-08-28T09:54:47.5400472Z             },
2026-08-28T09:54:47.5400735Z             {
2026-08-28T09:54:47.5401090Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5401362Z               "line": 1317
2026-08-28T09:54:47.5401624Z             },
2026-08-28T09:54:47.5401881Z             {
2026-08-28T09:54:47.5402238Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5402516Z               "line": 1375
2026-08-28T09:54:47.5402787Z             },
2026-08-28T09:54:47.5403041Z             {
2026-08-28T09:54:47.5403391Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5403662Z               "line": 1833
2026-08-28T09:54:47.5403924Z             },
2026-08-28T09:54:47.5404181Z             {
2026-08-28T09:54:47.5404568Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5404844Z               "line": 165
2026-08-28T09:54:47.5405096Z             },
2026-08-28T09:54:47.5405349Z             {
2026-08-28T09:54:47.5405721Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5406059Z               "line": 294
2026-08-28T09:54:47.5406362Z             },
2026-08-28T09:54:47.5406620Z             {
2026-08-28T09:54:47.5406995Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5407273Z               "line": 317
2026-08-28T09:54:47.5407535Z             },
2026-08-28T09:54:47.5407789Z             {
2026-08-28T09:54:47.5408165Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:47.5408437Z               "line": 361
2026-08-28T09:54:47.5408701Z             },
2026-08-28T09:54:47.5409033Z             {
2026-08-28T09:54:47.5409463Z               "path": "crates/spt-daemon/src/psyrelay.rs",
2026-08-28T09:54:47.5409740Z               "line": 398
2026-08-28T09:54:47.5410012Z             },
2026-08-28T09:54:47.5410273Z             {
2026-08-28T09:54:47.5410651Z               "path": "crates/spt-daemon/tests/notifsync.rs",
2026-08-28T09:54:47.5410932Z               "line": 132
2026-08-28T09:54:47.5411189Z             },
2026-08-28T09:54:47.5411450Z             {
2026-08-28T09:54:47.5411807Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5412080Z               "line": 76
2026-08-28T09:54:47.5412333Z             },
2026-08-28T09:54:47.5412590Z             {
2026-08-28T09:54:47.5412948Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5413215Z               "line": 101
2026-08-28T09:54:47.5413477Z             },
2026-08-28T09:54:47.5413728Z             {
2026-08-28T09:54:47.5414079Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5414350Z               "line": 681
2026-08-28T09:54:47.5414608Z             },
2026-08-28T09:54:47.5414862Z             {
2026-08-28T09:54:47.5415209Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5415476Z               "line": 719
2026-08-28T09:54:47.5415733Z             },
2026-08-28T09:54:47.5416186Z             {
2026-08-28T09:54:47.5416619Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5416903Z               "line": 807
2026-08-28T09:54:47.5417161Z             },
2026-08-28T09:54:47.5417414Z             {
2026-08-28T09:54:47.5417771Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5418043Z               "line": 846
2026-08-28T09:54:47.5418290Z             },
2026-08-28T09:54:47.5418548Z             {
2026-08-28T09:54:47.5418896Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5419247Z               "line": 863
2026-08-28T09:54:47.5419569Z             },
2026-08-28T09:54:47.5419827Z             {
2026-08-28T09:54:47.5420189Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5420471Z               "line": 891
2026-08-28T09:54:47.5420728Z             },
2026-08-28T09:54:47.5420981Z             {
2026-08-28T09:54:47.5421329Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5421602Z               "line": 922
2026-08-28T09:54:47.5421860Z             },
2026-08-28T09:54:47.5422119Z             {
2026-08-28T09:54:47.5422477Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.5422753Z               "line": 1501
2026-08-28T09:54:47.5423006Z             }
2026-08-28T09:54:47.5423259Z           ]
2026-08-28T09:54:47.5423513Z         }
2026-08-28T09:54:47.5423766Z       }
2026-08-28T09:54:47.5424017Z     },
2026-08-28T09:54:47.5424264Z     {
2026-08-28T09:54:47.5424549Z       "id": "REQ-NOTIF-2",
2026-08-28T09:54:47.5425369Z       "title": "spt notify (agent-issued subnet notif) + notif_command manifest seam (harness + shell adapters)",
2026-08-28T09:54:47.5425669Z       "requiredStages": [
2026-08-28T09:54:47.5425940Z         "doc",
2026-08-28T09:54:47.5426198Z         "impl",
2026-08-28T09:54:47.5426460Z         "unit",
2026-08-28T09:54:47.5426719Z         "int"
2026-08-28T09:54:47.5426971Z       ],
2026-08-28T09:54:47.5427231Z       "stages": {
2026-08-28T09:54:47.5427491Z         "doc": {
2026-08-28T09:54:47.5427777Z           "complete": true,
2026-08-28T09:54:47.5428125Z           "evidence": [
2026-08-28T09:54:47.5428389Z             {
2026-08-28T09:54:47.5428683Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.5429031Z               "line": 666
2026-08-28T09:54:47.5429285Z             },
2026-08-28T09:54:47.5429543Z             {
2026-08-28T09:54:47.5429850Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.5430129Z               "line": 194
2026-08-28T09:54:47.5430387Z             }
2026-08-28T09:54:47.5430640Z           ]
2026-08-28T09:54:47.5430898Z         },
2026-08-28T09:54:47.5431161Z         "impl": {
2026-08-28T09:54:47.5431532Z           "complete": true,
2026-08-28T09:54:47.5431809Z           "evidence": [
2026-08-28T09:54:47.5432066Z             {
2026-08-28T09:54:47.5432425Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5432708Z               "line": 495
2026-08-28T09:54:47.5432960Z             },
2026-08-28T09:54:47.5433223Z             {
2026-08-28T09:54:47.5433590Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5433863Z               "line": 509
2026-08-28T09:54:47.5434125Z             },
2026-08-28T09:54:47.5434378Z             {
2026-08-28T09:54:47.5434740Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5435010Z               "line": 534
2026-08-28T09:54:47.5435270Z             },
2026-08-28T09:54:47.5435522Z             {
2026-08-28T09:54:47.5435895Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.5436171Z               "line": 338
2026-08-28T09:54:47.5436415Z             },
2026-08-28T09:54:47.5436663Z             {
2026-08-28T09:54:47.5437025Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.5437307Z               "line": 222
2026-08-28T09:54:47.5437565Z             },
2026-08-28T09:54:47.5437815Z             {
2026-08-28T09:54:47.5438132Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5438466Z               "line": 8842
2026-08-28T09:54:47.5438728Z             },
2026-08-28T09:54:47.5439086Z             {
2026-08-28T09:54:47.5439401Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5439672Z               "line": 8895
2026-08-28T09:54:47.5439934Z             },
2026-08-28T09:54:47.5440184Z             {
2026-08-28T09:54:47.5440501Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5440786Z               "line": 9007
2026-08-28T09:54:47.5441043Z             },
2026-08-28T09:54:47.5441300Z             {
2026-08-28T09:54:47.5441610Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5441948Z               "line": 9063
2026-08-28T09:54:47.5442239Z             }
2026-08-28T09:54:47.5442497Z           ]
2026-08-28T09:54:47.5442750Z         },
2026-08-28T09:54:47.5443009Z         "int": {
2026-08-28T09:54:47.5443292Z           "complete": true,
2026-08-28T09:54:47.5443631Z           "evidence": [
2026-08-28T09:54:47.5443898Z             {
2026-08-28T09:54:47.5444276Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5444556Z               "line": 1256
2026-08-28T09:54:47.5444813Z             },
2026-08-28T09:54:47.5445070Z             {
2026-08-28T09:54:47.5445456Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5445740Z               "line": 2378
2026-08-28T09:54:47.5445997Z             }
2026-08-28T09:54:47.5446251Z           ]
2026-08-28T09:54:47.5446508Z         },
2026-08-28T09:54:47.5446775Z         "unit": {
2026-08-28T09:54:47.5447065Z           "complete": true,
2026-08-28T09:54:47.5447342Z           "evidence": [
2026-08-28T09:54:47.5447604Z             {
2026-08-28T09:54:47.5447957Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5448233Z               "line": 1510
2026-08-28T09:54:47.5448494Z             },
2026-08-28T09:54:47.5448755Z             {
2026-08-28T09:54:47.5449199Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5449484Z               "line": 1582
2026-08-28T09:54:47.5449738Z             },
2026-08-28T09:54:47.5450067Z             {
2026-08-28T09:54:47.5450396Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5450663Z               "line": 30882
2026-08-28T09:54:47.5450927Z             },
2026-08-28T09:54:47.5451178Z             {
2026-08-28T09:54:47.5451493Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.5451761Z               "line": 30950
2026-08-28T09:54:47.5452018Z             }
2026-08-28T09:54:47.5452276Z           ]
2026-08-28T09:54:47.5452532Z         }
2026-08-28T09:54:47.5452795Z       }
2026-08-28T09:54:47.5453042Z     },
2026-08-28T09:54:47.5453357Z     {
2026-08-28T09:54:47.5453671Z       "id": "REQ-NOTIF-COALESCE",
2026-08-28T09:54:47.5457320Z       "title": "Coalesce-key supersession: producer-stamped key REQUIRED in namespaced form <owner>:<key> (e.g. spt-core:update-staged) — the produce front door rejects un-namespaced keys; producing a new row with the same (scope-target, kind, key) auto-dismisses the prior rows, latest-wins; supersession expresses through the existing dismissed one-way latch (semilattice unchanged)",
2026-08-28T09:54:47.5457654Z       "requiredStages": [
2026-08-28T09:54:47.5457912Z         "doc",
2026-08-28T09:54:47.5458169Z         "impl",
2026-08-28T09:54:47.5458427Z         "unit"
2026-08-28T09:54:47.5458672Z       ],
2026-08-28T09:54:47.5458926Z       "stages": {
2026-08-28T09:54:47.5459267Z         "doc": {
2026-08-28T09:54:47.5459553Z           "complete": true,
2026-08-28T09:54:47.5459820Z           "evidence": [
2026-08-28T09:54:47.5460088Z             {
2026-08-28T09:54:47.5460656Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5460932Z               "line": 47
2026-08-28T09:54:47.5461200Z             }
2026-08-28T09:54:47.5461455Z           ]
2026-08-28T09:54:47.5461710Z         },
2026-08-28T09:54:47.5461964Z         "impl": {
2026-08-28T09:54:47.5462250Z           "complete": true,
2026-08-28T09:54:47.5462597Z           "evidence": [
2026-08-28T09:54:47.5462865Z             {
2026-08-28T09:54:47.5463232Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5463532Z               "line": 74
2026-08-28T09:54:47.5463795Z             },
2026-08-28T09:54:47.5464057Z             {
2026-08-28T09:54:47.5464408Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5464674Z               "line": 78
2026-08-28T09:54:47.5464932Z             },
2026-08-28T09:54:47.5465176Z             {
2026-08-28T09:54:47.5465534Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5465862Z               "line": 86
2026-08-28T09:54:47.5466129Z             },
2026-08-28T09:54:47.5466383Z             {
2026-08-28T09:54:47.5466738Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5467018Z               "line": 453
2026-08-28T09:54:47.5467270Z             },
2026-08-28T09:54:47.5467523Z             {
2026-08-28T09:54:47.5467890Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5468166Z               "line": 41
2026-08-28T09:54:47.5468429Z             },
2026-08-28T09:54:47.5468681Z             {
2026-08-28T09:54:47.5469125Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5469391Z               "line": 93
2026-08-28T09:54:47.5469656Z             },
2026-08-28T09:54:47.5469904Z             {
2026-08-28T09:54:47.5470262Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5470529Z               "line": 151
2026-08-28T09:54:47.5470786Z             },
2026-08-28T09:54:47.5471038Z             {
2026-08-28T09:54:47.5471391Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5471668Z               "line": 215
2026-08-28T09:54:47.5471920Z             },
2026-08-28T09:54:47.5472172Z             {
2026-08-28T09:54:47.5472637Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5472956Z               "line": 264
2026-08-28T09:54:47.5473220Z             },
2026-08-28T09:54:47.5473509Z             {
2026-08-28T09:54:47.5473949Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5474322Z               "line": 334
2026-08-28T09:54:47.5474598Z             }
2026-08-28T09:54:47.5474849Z           ]
2026-08-28T09:54:47.5475112Z         },
2026-08-28T09:54:47.5475365Z         "int": {
2026-08-28T09:54:47.5475656Z           "complete": false,
2026-08-28T09:54:47.5475927Z           "evidence": []
2026-08-28T09:54:47.5476179Z         },
2026-08-28T09:54:47.5476437Z         "unit": {
2026-08-28T09:54:47.5476717Z           "complete": true,
2026-08-28T09:54:47.5476986Z           "evidence": [
2026-08-28T09:54:47.5477289Z             {
2026-08-28T09:54:47.5477650Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5477921Z               "line": 1428
2026-08-28T09:54:47.5478179Z             },
2026-08-28T09:54:47.5478435Z             {
2026-08-28T09:54:47.5478808Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5479181Z               "line": 1471
2026-08-28T09:54:47.5479443Z             },
2026-08-28T09:54:47.5479700Z             {
2026-08-28T09:54:47.5480046Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5480321Z               "line": 121
2026-08-28T09:54:47.5480573Z             },
2026-08-28T09:54:47.5480831Z             {
2026-08-28T09:54:47.5481180Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5481451Z               "line": 945
2026-08-28T09:54:47.5481705Z             },
2026-08-28T09:54:47.5481961Z             {
2026-08-28T09:54:47.5482315Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5482589Z               "line": 973
2026-08-28T09:54:47.5482849Z             },
2026-08-28T09:54:47.5483103Z             {
2026-08-28T09:54:47.5483460Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5483736Z               "line": 1006
2026-08-28T09:54:47.5484004Z             }
2026-08-28T09:54:47.5484328Z           ]
2026-08-28T09:54:47.5484586Z         }
2026-08-28T09:54:47.5484838Z       }
2026-08-28T09:54:47.5485086Z     },
2026-08-28T09:54:47.5485338Z     {
2026-08-28T09:54:47.5485667Z       "id": "REQ-NOTIF-DRAIN-ROW-VALIDITY",
2026-08-28T09:54:47.5503072Z       "title": "A spooled notify envelope is validated against its notif row at DELIVERY time — a copy outliving its row must not deliver. (ADR-0046 Amendment 1 + KNOWN-HAZARDS 7.53; operator field regression from perri's node 2026-07-22, doyle root-caused same day — DAEMON-LIFECYCLE W1 RIDER.) TODAY: quiet delivery (REQ-NOTIF-QUIET-DELIVERY) makes every surface an active_only SPOOL write per endpoint, and every row-lifecycle mechanism (apply-seam dismissal REQ-NOTIF-SEAM-DISMISS, coalesce supersession, TTL, the one-shot migration) touches ROWS only — so a copy spooled while the endpoint was busy/offline is a detached snapshot no dismissal can recall, delivering 'update available' on an already-updated node at the next drain, once per qualifying surface event (perri: twice; doyle's own session: four stale 0.39.x drains post-upgrade). FIX: at the safe-point drain choke point (api poll deferred presentation, spt/src/api/delivery.rs cmd_poll), a notify-kind envelope delivers ONLY if its notif_id resolves to a live UNDISMISSED row in the local notif store; dismissed/superseded/TTL-expired/unknown -> dropped silently; N copies of one notif_id in a drain dedupe to ONE delivery. Non-notify spool content is untouched (ordinary messages are not revocable and MUST deliver). Legacy pre-0.40.0 plain-message copies carry no notif_id, cannot be validated, and self-clear by their one drain — no machinery. Rejected: recall-on-dismiss spool sweeps (race the drain, span every perch, miss in-flight copies); live-only notify delivery (the spool IS quiet delivery's safe-point mechanism). Gate: impl — the validity gate + dedupe at cmd_poll's deferred presentation; unit — the gate predicate cells (live row delivers / dismissed drops / unknown drops / dedupe collapses / non-notify passes untouched); int — the perri rig RED-first: surface an update notif to a non-draining endpoint (copy spools), dismiss the row via the apply seam, drain -> NOTHING delivers; control leg: undismissed row's copy delivers exactly once.",
2026-08-28T09:54:47.5503600Z       "requiredStages": [
2026-08-28T09:54:47.5503866Z         "impl",
2026-08-28T09:54:47.5504127Z         "unit",
2026-08-28T09:54:47.5504380Z         "int"
2026-08-28T09:54:47.5504637Z       ],
2026-08-28T09:54:47.5504895Z       "stages": {
2026-08-28T09:54:47.5505333Z         "doc": {
2026-08-28T09:54:47.5505633Z           "complete": true,
2026-08-28T09:54:47.5505997Z           "evidence": [
2026-08-28T09:54:47.5506249Z             {
2026-08-28T09:54:47.5506586Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.5506863Z               "line": 846
2026-08-28T09:54:47.5507116Z             },
2026-08-28T09:54:47.5507374Z             {
2026-08-28T09:54:47.5507927Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5508218Z               "line": 133
2026-08-28T09:54:47.5508465Z             }
2026-08-28T09:54:47.5508732Z           ]
2026-08-28T09:54:47.5509072Z         },
2026-08-28T09:54:47.5509340Z         "impl": {
2026-08-28T09:54:47.5509631Z           "complete": true,
2026-08-28T09:54:47.5509903Z           "evidence": [
2026-08-28T09:54:47.5510155Z             {
2026-08-28T09:54:47.5510527Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5510819Z               "line": 48
2026-08-28T09:54:47.5511080Z             },
2026-08-28T09:54:47.5511333Z             {
2026-08-28T09:54:47.5511717Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5511982Z               "line": 76
2026-08-28T09:54:47.5512236Z             },
2026-08-28T09:54:47.5512493Z             {
2026-08-28T09:54:47.5512870Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5513137Z               "line": 105
2026-08-28T09:54:47.5513466Z             },
2026-08-28T09:54:47.5513733Z             {
2026-08-28T09:54:47.5514110Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5514389Z               "line": 120
2026-08-28T09:54:47.5514640Z             },
2026-08-28T09:54:47.5514897Z             {
2026-08-28T09:54:47.5515249Z               "path": "crates/spt-daemon/src/relay.rs",
2026-08-28T09:54:47.5515521Z               "line": 73
2026-08-28T09:54:47.5515779Z             },
2026-08-28T09:54:47.5516032Z             {
2026-08-28T09:54:47.5516380Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.5516718Z               "line": 574
2026-08-28T09:54:47.5516981Z             }
2026-08-28T09:54:47.5517247Z           ]
2026-08-28T09:54:47.5517504Z         },
2026-08-28T09:54:47.5517762Z         "int": {
2026-08-28T09:54:47.5518047Z           "complete": true,
2026-08-28T09:54:47.5518320Z           "evidence": [
2026-08-28T09:54:47.5518578Z             {
2026-08-28T09:54:47.5519112Z               "path": "crates/spt-daemon/tests/notif_drain_validity.rs",
2026-08-28T09:54:47.5519382Z               "line": 99
2026-08-28T09:54:47.5519642Z             },
2026-08-28T09:54:47.5519891Z             {
2026-08-28T09:54:47.5520347Z               "path": "crates/spt-daemon/tests/notif_drain_validity.rs",
2026-08-28T09:54:47.5520624Z               "line": 128
2026-08-28T09:54:47.5520887Z             },
2026-08-28T09:54:47.5521139Z             {
2026-08-28T09:54:47.5521587Z               "path": "crates/spt-daemon/tests/notif_drain_validity.rs",
2026-08-28T09:54:47.5521859Z               "line": 152
2026-08-28T09:54:47.5522112Z             }
2026-08-28T09:54:47.5522368Z           ]
2026-08-28T09:54:47.5522618Z         },
2026-08-28T09:54:47.5522885Z         "unit": {
2026-08-28T09:54:47.5523162Z           "complete": true,
2026-08-28T09:54:47.5523435Z           "evidence": [
2026-08-28T09:54:47.5523688Z             {
2026-08-28T09:54:47.5524059Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5524332Z               "line": 170
2026-08-28T09:54:47.5524679Z             },
2026-08-28T09:54:47.5524925Z             {
2026-08-28T09:54:47.5525295Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5525568Z               "line": 221
2026-08-28T09:54:47.5525819Z             },
2026-08-28T09:54:47.5526072Z             {
2026-08-28T09:54:47.5526453Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5526720Z               "line": 231
2026-08-28T09:54:47.5526978Z             },
2026-08-28T09:54:47.5527236Z             {
2026-08-28T09:54:47.5527616Z               "path": "crates/spt-daemon/src/notifgate.rs",
2026-08-28T09:54:47.5527945Z               "line": 241
2026-08-28T09:54:47.5528203Z             },
2026-08-28T09:54:47.5528461Z             {
2026-08-28T09:54:47.5528809Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:47.5529170Z               "line": 1028
2026-08-28T09:54:47.5529429Z             }
2026-08-28T09:54:47.5529686Z           ]
2026-08-28T09:54:47.5529942Z         }
2026-08-28T09:54:47.5530197Z       }
2026-08-28T09:54:47.5530441Z     },
2026-08-28T09:54:47.5530703Z     {
2026-08-28T09:54:47.5530995Z       "id": "REQ-NOTIF-MIGRATE",
2026-08-28T09:54:47.5534280Z       "title": "One-shot field migration: on first run the new binary auto-dismisses existing rows with from_id = spt-update (kinds consent/rollback) — the known-stale class; idempotent; the dismissals replicate so cleanup reaches not-yet-upgraded peers; agent/psyche rows untouched; the update worker re-produces any genuinely-current update notif within one check cadence",
2026-08-28T09:54:47.5534586Z       "requiredStages": [
2026-08-28T09:54:47.5534839Z         "doc",
2026-08-28T09:54:47.5535106Z         "impl",
2026-08-28T09:54:47.5535362Z         "unit",
2026-08-28T09:54:47.5535622Z         "int"
2026-08-28T09:54:47.5535880Z       ],
2026-08-28T09:54:47.5536142Z       "stages": {
2026-08-28T09:54:47.5536480Z         "doc": {
2026-08-28T09:54:47.5536762Z           "complete": true,
2026-08-28T09:54:47.5537048Z           "evidence": [
2026-08-28T09:54:47.5537300Z             {
2026-08-28T09:54:47.5537862Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5538130Z               "line": 103
2026-08-28T09:54:47.5538387Z             }
2026-08-28T09:54:47.5538649Z           ]
2026-08-28T09:54:47.5538896Z         },
2026-08-28T09:54:47.5539254Z         "impl": {
2026-08-28T09:54:47.5539535Z           "complete": true,
2026-08-28T09:54:47.5539869Z           "evidence": [
2026-08-28T09:54:47.5540126Z             {
2026-08-28T09:54:47.5540502Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.5540772Z               "line": 1336
2026-08-28T09:54:47.5541034Z             },
2026-08-28T09:54:47.5541287Z             {
2026-08-28T09:54:47.5541635Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5541907Z               "line": 417
2026-08-28T09:54:47.5542164Z             }
2026-08-28T09:54:47.5542417Z           ]
2026-08-28T09:54:47.5542669Z         },
2026-08-28T09:54:47.5542917Z         "int": {
2026-08-28T09:54:47.5543190Z           "complete": true,
2026-08-28T09:54:47.5543526Z           "evidence": [
2026-08-28T09:54:47.5543782Z             {
2026-08-28T09:54:47.5544164Z               "path": "crates/spt-daemon/tests/notifsync.rs",
2026-08-28T09:54:47.5544436Z               "line": 328
2026-08-28T09:54:47.5544688Z             }
2026-08-28T09:54:47.5544945Z           ]
2026-08-28T09:54:47.5545203Z         },
2026-08-28T09:54:47.5545461Z         "unit": {
2026-08-28T09:54:47.5545743Z           "complete": true,
2026-08-28T09:54:47.5546017Z           "evidence": [
2026-08-28T09:54:47.5546286Z             {
2026-08-28T09:54:47.5546649Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5546925Z               "line": 1082
2026-08-28T09:54:47.5547187Z             }
2026-08-28T09:54:47.5547445Z           ]
2026-08-28T09:54:47.5547698Z         }
2026-08-28T09:54:47.5548023Z       }
2026-08-28T09:54:47.5548271Z     },
2026-08-28T09:54:47.5548528Z     {
2026-08-28T09:54:47.5548846Z       "id": "REQ-NOTIF-QUIET-DELIVERY",
2026-08-28T09:54:47.5552505Z       "title": "The notify kind rides the active_only window UNCONDITIONALLY, rollback included: spool-only, never live TCP, never a wake, for EVERY producer; loudness = resurface-until-dismissed persistence, never PTY interruption; boundary resurface (clear/compact/new-session/wake) + the adapter safe-point drain are the surfacing paths; a future interrupting alert needs a new kind + its own ADR, not an exception here",
2026-08-28T09:54:47.5552862Z       "requiredStages": [
2026-08-28T09:54:47.5553116Z         "doc",
2026-08-28T09:54:47.5553383Z         "impl",
2026-08-28T09:54:47.5553645Z         "unit",
2026-08-28T09:54:47.5553896Z         "int"
2026-08-28T09:54:47.5554147Z       ],
2026-08-28T09:54:47.5554405Z       "stages": {
2026-08-28T09:54:47.5554667Z         "doc": {
2026-08-28T09:54:47.5554948Z           "complete": true,
2026-08-28T09:54:47.5555228Z           "evidence": [
2026-08-28T09:54:47.5555477Z             {
2026-08-28T09:54:47.5556035Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5556308Z               "line": 73
2026-08-28T09:54:47.5556563Z             }
2026-08-28T09:54:47.5556822Z           ]
2026-08-28T09:54:47.5557071Z         },
2026-08-28T09:54:47.5557338Z         "impl": {
2026-08-28T09:54:47.5557615Z           "complete": true,
2026-08-28T09:54:47.5557887Z           "evidence": [
2026-08-28T09:54:47.5558149Z             {
2026-08-28T09:54:47.5558512Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5558783Z               "line": 218
2026-08-28T09:54:47.5559103Z             }
2026-08-28T09:54:47.5559358Z           ]
2026-08-28T09:54:47.5559602Z         },
2026-08-28T09:54:47.5559855Z         "int": {
2026-08-28T09:54:47.5560132Z           "complete": true,
2026-08-28T09:54:47.5560470Z           "evidence": [
2026-08-28T09:54:47.5560723Z             {
2026-08-28T09:54:47.5561185Z               "path": "crates/spt-daemon/tests/notif_quiet_delivery.rs",
2026-08-28T09:54:47.5561457Z               "line": 58
2026-08-28T09:54:47.5561713Z             }
2026-08-28T09:54:47.5561972Z           ]
2026-08-28T09:54:47.5562225Z         },
2026-08-28T09:54:47.5562488Z         "unit": {
2026-08-28T09:54:47.5562774Z           "complete": true,
2026-08-28T09:54:47.5563056Z           "evidence": [
2026-08-28T09:54:47.5563309Z             {
2026-08-28T09:54:47.5563728Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5564010Z               "line": 1669
2026-08-28T09:54:47.5564263Z             }
2026-08-28T09:54:47.5564522Z           ]
2026-08-28T09:54:47.5564769Z         }
2026-08-28T09:54:47.5565027Z       }
2026-08-28T09:54:47.5565279Z     },
2026-08-28T09:54:47.5565537Z     {
2026-08-28T09:54:47.5565827Z       "id": "REQ-NOTIF-SCOPE",
2026-08-28T09:54:47.5570639Z       "title": "Notif scope is a per-row producer-chosen attribute node|subnet: node-scoped rows (update/consent/rollback kinds) live and die on their node and NEVER enter a replication feed; subnet-scoped rows keep the full ADR-0007 machinery (replication, cross-node dismiss, semilattice join); scope determines the first-fire candidate set (node-scoped targets the most-recently-active endpoint ON that node). New row fields additive serde-defaulted (host_binaries pattern) — old peers parse clean, schema regen drift-gated",
2026-08-28T09:54:47.5570944Z       "requiredStages": [
2026-08-28T09:54:47.5571210Z         "doc",
2026-08-28T09:54:47.5571474Z         "impl",
2026-08-28T09:54:47.5571731Z         "unit",
2026-08-28T09:54:47.5571989Z         "int"
2026-08-28T09:54:47.5572249Z       ],
2026-08-28T09:54:47.5572509Z       "stages": {
2026-08-28T09:54:47.5572767Z         "doc": {
2026-08-28T09:54:47.5573048Z           "complete": true,
2026-08-28T09:54:47.5573325Z           "evidence": [
2026-08-28T09:54:47.5573588Z             {
2026-08-28T09:54:47.5574160Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5574504Z               "line": 33
2026-08-28T09:54:47.5574770Z             }
2026-08-28T09:54:47.5575031Z           ]
2026-08-28T09:54:47.5575282Z         },
2026-08-28T09:54:47.5575544Z         "impl": {
2026-08-28T09:54:47.5575831Z           "complete": true,
2026-08-28T09:54:47.5576102Z           "evidence": [
2026-08-28T09:54:47.5576354Z             {
2026-08-28T09:54:47.5576712Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5576984Z               "line": 323
2026-08-28T09:54:47.5577541Z             },
2026-08-28T09:54:47.5577797Z             {
2026-08-28T09:54:47.5578153Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5578421Z               "line": 452
2026-08-28T09:54:47.5578669Z             },
2026-08-28T09:54:47.5578920Z             {
2026-08-28T09:54:47.5579402Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5579680Z               "line": 87
2026-08-28T09:54:47.5579942Z             },
2026-08-28T09:54:47.5580204Z             {
2026-08-28T09:54:47.5580579Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.5580846Z               "line": 184
2026-08-28T09:54:47.5581103Z             },
2026-08-28T09:54:47.5581357Z             {
2026-08-28T09:54:47.5581705Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5581971Z               "line": 49
2026-08-28T09:54:47.5582225Z             },
2026-08-28T09:54:47.5582477Z             {
2026-08-28T09:54:47.5582824Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5583098Z               "line": 144
2026-08-28T09:54:47.5583350Z             },
2026-08-28T09:54:47.5583608Z             {
2026-08-28T09:54:47.5583961Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5584238Z               "line": 215
2026-08-28T09:54:47.5584562Z             },
2026-08-28T09:54:47.5584815Z             {
2026-08-28T09:54:47.5585182Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5585691Z               "line": 263
2026-08-28T09:54:47.5585951Z             }
2026-08-28T09:54:47.5586199Z           ]
2026-08-28T09:54:47.5586457Z         },
2026-08-28T09:54:47.5586715Z         "int": {
2026-08-28T09:54:47.5586996Z           "complete": true,
2026-08-28T09:54:47.5587267Z           "evidence": [
2026-08-28T09:54:47.5587519Z             {
2026-08-28T09:54:47.5587912Z               "path": "crates/spt-daemon/tests/notifsync.rs",
2026-08-28T09:54:47.5588253Z               "line": 324
2026-08-28T09:54:47.5588508Z             }
2026-08-28T09:54:47.5588761Z           ]
2026-08-28T09:54:47.5589108Z         },
2026-08-28T09:54:47.5589367Z         "unit": {
2026-08-28T09:54:47.5589652Z           "complete": true,
2026-08-28T09:54:47.5589920Z           "evidence": [
2026-08-28T09:54:47.5590178Z             {
2026-08-28T09:54:47.5590546Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5590817Z               "line": 1428
2026-08-28T09:54:47.5591076Z             },
2026-08-28T09:54:47.5591330Z             {
2026-08-28T09:54:47.5591692Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5591983Z               "line": 1471
2026-08-28T09:54:47.5592241Z             },
2026-08-28T09:54:47.5592489Z             {
2026-08-28T09:54:47.5592846Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5593123Z               "line": 1702
2026-08-28T09:54:47.5593369Z             },
2026-08-28T09:54:47.5593624Z             {
2026-08-28T09:54:47.5594001Z               "path": "crates/spt-daemon/src/notifsync.rs",
2026-08-28T09:54:47.5594282Z               "line": 258
2026-08-28T09:54:47.5594540Z             },
2026-08-28T09:54:47.5594798Z             {
2026-08-28T09:54:47.5595155Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5595432Z               "line": 116
2026-08-28T09:54:47.5595690Z             },
2026-08-28T09:54:47.5596024Z             {
2026-08-28T09:54:47.5596383Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5596650Z               "line": 940
2026-08-28T09:54:47.5596917Z             },
2026-08-28T09:54:47.5597169Z             {
2026-08-28T09:54:47.5597532Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5597818Z               "line": 1143
2026-08-28T09:54:47.5598070Z             }
2026-08-28T09:54:47.5598332Z           ]
2026-08-28T09:54:47.5598582Z         }
2026-08-28T09:54:47.5598837Z       }
2026-08-28T09:54:47.5599178Z     },
2026-08-28T09:54:47.5599494Z     {
2026-08-28T09:54:47.5599808Z       "id": "REQ-NOTIF-SEAM-DISMISS",
2026-08-28T09:54:47.5603298Z       "title": "Staleness is dismissed at the seam that knows, never evaluated at surface: a successful update apply dismisses spt-core:update-staged; the update worker's next check, seeing running >= staged, dismisses it too (covers out-of-band installs); a later successful update dismisses a rollback row; the primitive stores rows and latches — NO relevance predicates, nothing evaluated at surface time",
2026-08-28T09:54:47.5603603Z       "requiredStages": [
2026-08-28T09:54:47.5603863Z         "doc",
2026-08-28T09:54:47.5604128Z         "impl",
2026-08-28T09:54:47.5604386Z         "unit",
2026-08-28T09:54:47.5604639Z         "int"
2026-08-28T09:54:47.5604891Z       ],
2026-08-28T09:54:47.5605157Z       "stages": {
2026-08-28T09:54:47.5605415Z         "doc": {
2026-08-28T09:54:47.5605701Z           "complete": true,
2026-08-28T09:54:47.5605983Z           "evidence": [
2026-08-28T09:54:47.5606236Z             {
2026-08-28T09:54:47.5606797Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5607061Z               "line": 58
2026-08-28T09:54:47.5607315Z             }
2026-08-28T09:54:47.5607553Z           ]
2026-08-28T09:54:47.5607806Z         },
2026-08-28T09:54:47.5608068Z         "impl": {
2026-08-28T09:54:47.5608412Z           "complete": true,
2026-08-28T09:54:47.5608683Z           "evidence": [
2026-08-28T09:54:47.5608931Z             {
2026-08-28T09:54:47.5609402Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:47.5609671Z               "line": 696
2026-08-28T09:54:47.5609972Z             },
2026-08-28T09:54:47.5610215Z             {
2026-08-28T09:54:47.5610615Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:47.5610882Z               "line": 97
2026-08-28T09:54:47.5611126Z             },
2026-08-28T09:54:47.5611464Z             {
2026-08-28T09:54:47.5611803Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5612084Z               "line": 490
2026-08-28T09:54:47.5612331Z             }
2026-08-28T09:54:47.5612584Z           ]
2026-08-28T09:54:47.5612831Z         },
2026-08-28T09:54:47.5613098Z         "int": {
2026-08-28T09:54:47.5613385Z           "complete": true,
2026-08-28T09:54:47.5613651Z           "evidence": [
2026-08-28T09:54:47.5613925Z             {
2026-08-28T09:54:47.5614314Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:47.5614594Z               "line": 845
2026-08-28T09:54:47.5614855Z             }
2026-08-28T09:54:47.5615112Z           ]
2026-08-28T09:54:47.5615360Z         },
2026-08-28T09:54:47.5615622Z         "unit": {
2026-08-28T09:54:47.5615899Z           "complete": true,
2026-08-28T09:54:47.5616171Z           "evidence": [
2026-08-28T09:54:47.5616430Z             {
2026-08-28T09:54:47.5616806Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:47.5617074Z               "line": 402
2026-08-28T09:54:47.5617333Z             },
2026-08-28T09:54:47.5617588Z             {
2026-08-28T09:54:47.5617931Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5618208Z               "line": 1108
2026-08-28T09:54:47.5618457Z             }
2026-08-28T09:54:47.5618709Z           ]
2026-08-28T09:54:47.5619053Z         }
2026-08-28T09:54:47.5619311Z       }
2026-08-28T09:54:47.5619573Z     },
2026-08-28T09:54:47.5619895Z     {
2026-08-28T09:54:47.5620202Z       "id": "REQ-NOTIF-TTL",
2026-08-28T09:54:47.5623120Z       "title": "Producer-optional TTL for informational kinds with no dismissal seam (node-paired, agent-issued): expired row auto-dismissed instead of surfaced — a timestamp compare, not a predicate; expiry IGNORES seen-state (TTL means stale-after-this; a producer that cannot accept silent expiry must not set one); no global default",
2026-08-28T09:54:47.5623425Z       "requiredStages": [
2026-08-28T09:54:47.5623687Z         "doc",
2026-08-28T09:54:47.5623946Z         "impl",
2026-08-28T09:54:47.5624270Z         "unit"
2026-08-28T09:54:47.5624518Z       ],
2026-08-28T09:54:47.5624786Z       "stages": {
2026-08-28T09:54:47.5625046Z         "doc": {
2026-08-28T09:54:47.5625324Z           "complete": true,
2026-08-28T09:54:47.5630181Z           "evidence": [
2026-08-28T09:54:47.5630488Z             {
2026-08-28T09:54:47.5631092Z               "path": "docs/adr/0046-notif-scope-supersession-quiet-delivery.md",
2026-08-28T09:54:47.5631373Z               "line": 89
2026-08-28T09:54:47.5631640Z             }
2026-08-28T09:54:47.5631888Z           ]
2026-08-28T09:54:47.5632147Z         },
2026-08-28T09:54:47.5632409Z         "impl": {
2026-08-28T09:54:47.5632690Z           "complete": true,
2026-08-28T09:54:47.5632961Z           "evidence": [
2026-08-28T09:54:47.5633218Z             {
2026-08-28T09:54:47.5633613Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5633890Z               "line": 193
2026-08-28T09:54:47.5634153Z             },
2026-08-28T09:54:47.5634415Z             {
2026-08-28T09:54:47.5634777Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5635045Z               "line": 309
2026-08-28T09:54:47.5635307Z             },
2026-08-28T09:54:47.5635562Z             {
2026-08-28T09:54:47.5635918Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5636295Z               "line": 729
2026-08-28T09:54:47.5636577Z             },
2026-08-28T09:54:47.5636862Z             {
2026-08-28T09:54:47.5637235Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5637531Z               "line": 157
2026-08-28T09:54:47.5637826Z             },
2026-08-28T09:54:47.5638107Z             {
2026-08-28T09:54:47.5638809Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5639196Z               "line": 215
2026-08-28T09:54:47.5639487Z             },
2026-08-28T09:54:47.5639758Z             {
2026-08-28T09:54:47.5640225Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5640516Z               "line": 265
2026-08-28T09:54:47.5640798Z             },
2026-08-28T09:54:47.5641078Z             {
2026-08-28T09:54:47.5641457Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5641753Z               "line": 398
2026-08-28T09:54:47.5642040Z             }
2026-08-28T09:54:47.5642320Z           ]
2026-08-28T09:54:47.5642615Z         },
2026-08-28T09:54:47.5642911Z         "int": {
2026-08-28T09:54:47.5643230Z           "complete": false,
2026-08-28T09:54:47.5643575Z           "evidence": []
2026-08-28T09:54:47.5643825Z         },
2026-08-28T09:54:47.5644088Z         "unit": {
2026-08-28T09:54:47.5644370Z           "complete": true,
2026-08-28T09:54:47.5644646Z           "evidence": [
2026-08-28T09:54:47.5644904Z             {
2026-08-28T09:54:47.5645266Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5645572Z               "line": 1762
2026-08-28T09:54:47.5645843Z             },
2026-08-28T09:54:47.5646099Z             {
2026-08-28T09:54:47.5646454Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.5646730Z               "line": 1798
2026-08-28T09:54:47.5646979Z             },
2026-08-28T09:54:47.5647237Z             {
2026-08-28T09:54:47.5647594Z               "path": "crates/spt-net/src/net/notif.rs",
2026-08-28T09:54:47.5647866Z               "line": 121
2026-08-28T09:54:47.5648124Z             },
2026-08-28T09:54:47.5648453Z             {
2026-08-28T09:54:47.5648816Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5649179Z               "line": 945
2026-08-28T09:54:47.5649437Z             },
2026-08-28T09:54:47.5649684Z             {
2026-08-28T09:54:47.5650028Z               "path": "crates/spt-store/src/notif.rs",
2026-08-28T09:54:47.5650299Z               "line": 1051
2026-08-28T09:54:47.5650551Z             }
2026-08-28T09:54:47.5650808Z           ]
2026-08-28T09:54:47.5651058Z         }
2026-08-28T09:54:47.5651316Z       }
2026-08-28T09:54:47.5651570Z     },
2026-08-28T09:54:47.5651882Z     {
2026-08-28T09:54:47.5652246Z       "id": "REQ-NOTIF-UPDATE-ROW-VERSION-RETIRE",
2026-08-28T09:54:47.5679451Z       "title": "An update-available notif row minted by a node running PRE-0.40.0 spt is retired on the version the running node has ALREADY reached — because the keyed catch-up dismissal is structurally blind to it. (DAEMON-LIFECYCLE W2 RIDER, operator-ordered; doyle root-caused end to end 2026-07-22 on the live box.) FIELD CHAIN, verified: GRAVITY-NVDA-PC (f15d837b, BIGNET) runs pre-0.40.0 spt, whose legacy producer mints the update notice SUBNET-scoped with NO coalesce key (the scoped+keyed producer shipped in 0.40.0). The row replicated fleet-wide. The modern catch-up dismissal (REQ-NOTIF-SEAM-DISMISS, pump/update.rs dismiss_staged_notif_if_caught_up) dismisses ONLY by coalesce key, so a keyless row can never be retired by it: a FULLY-UPDATED node holds a live 'v0.41.0 available' row forever, surfacing once per endpoint at every boundary (observed: todlando ~19:54 + Librarian/Athenaeum-Library; store showed seen=2, undismissed, the only undismissed update row in the whole history). FIX: a version-grounded retirement sweep at the EXISTING catch-up site, same per-tick per-subnet cadence, running ALONGSIDE the key path (which stays PRIMARY — belt-and-braces, not a replacement): dismiss any UNDISMISSED row whose from_id == 'spt-update' AND whose body advertises a version that PARSES AND is <= the running image's own env!(CARGO_PKG_VERSION) (the same running-image self-truth the existing out-of-band leg reads). CONSERVATISM INHERITED VERBATIM from version_ge: an unparseable advertised version NEVER dismisses (the ancient 'update-available 5' counter-shape stays untouched), and advertised > running STAYS LIVE (a genuinely pending notice must survive the sweep). MUST NOT KEY ON kind ALONE: kind=consent is SHARED with the grants act-gate asks (grants.rs mints consent-kind through the plain front door with from_id = the asking agent), so from_id == 'spt-update' PLUS the body version-parse is the discriminator. The relevance predicate stays DAEMON-side (ADR-0046: the notif primitive evaluates no relevance predicate) — the store keeps only its existing undismissed()/dismiss() primitives. KNOWN LIMIT, stated not hidden: the ORIGIN node's one-time cross-node wake at mint is a plain live send from old code and is not preventable from our side; retiring/updating the legacy node is the operator's lever. This fix kills the row's AFTERLIFE (undismissable + boundary-resurfaces at every endpoint forever), which is the repeating harm. Gate: impl — the sweep + the pure advertised-version extractor at the catch-up site; unit — the extractor cells (dotted token found / v-prefixed / counter-shape and garbage refused) and the retire predicate; int — RED-first four legs: (1) legacy-shaped row (subnet scope, NULL key, from_id spt-update, advertised <= running) SURVIVES pre-fix ticks and is DISMISSED post-fix; (2) sibling advertising > running stays live; (3) sibling with a garbage/counter-shape body stays live; (4) regression: a modern Node-scoped KEYED row still dismisses via the key path; plus an asserted (not assumed) replication leg — a sweep-minted dismissal merges as dismissed through notifsync, since the fleet-wide kill is the point.",
2026-08-28T09:54:47.5679989Z       "requiredStages": [
2026-08-28T09:54:47.5680251Z         "impl",
2026-08-28T09:54:47.5680519Z         "unit",
2026-08-28T09:54:47.5680780Z         "int"
2026-08-28T09:54:47.5681097Z       ],
2026-08-28T09:54:47.5681364Z       "stages": {
2026-08-28T09:54:47.5681616Z         "doc": {
2026-08-28T09:54:47.5681922Z           "complete": false,
2026-08-28T09:54:47.5682203Z           "evidence": []
2026-08-28T09:54:47.5682456Z         },
2026-08-28T09:54:47.5682710Z         "impl": {
2026-08-28T09:54:47.5682992Z           "complete": true,
2026-08-28T09:54:47.5683260Z           "evidence": [
2026-08-28T09:54:47.5683511Z             {
2026-08-28T09:54:47.5683921Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:47.5684266Z               "line": 139
2026-08-28T09:54:47.5684527Z             },
2026-08-28T09:54:47.5684789Z             {
2026-08-28T09:54:47.5685185Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:47.5685466Z               "line": 176
2026-08-28T09:54:47.5685719Z             }
2026-08-28T09:54:47.5685977Z           ]
2026-08-28T09:54:47.5686234Z         },
2026-08-28T09:54:47.5686496Z         "int": {
2026-08-28T09:54:47.5686776Z           "complete": true,
2026-08-28T09:54:47.5687057Z           "evidence": [
2026-08-28T09:54:47.5687316Z             {
2026-08-28T09:54:47.5687793Z               "path": "crates/spt-daemon/tests/notif_update_row_retire.rs",
2026-08-28T09:54:47.5688074Z               "line": 123
2026-08-28T09:54:47.5688330Z             },
2026-08-28T09:54:47.5688590Z             {
2026-08-28T09:54:47.5689144Z               "path": "crates/spt-daemon/tests/notif_update_row_retire.rs",
2026-08-28T09:54:47.5689421Z               "line": 298
2026-08-28T09:54:47.5689687Z             }
2026-08-28T09:54:47.5689958Z           ]
2026-08-28T09:54:47.5690211Z         },
2026-08-28T09:54:47.5690473Z         "unit": {
2026-08-28T09:54:47.5690759Z           "complete": true,
2026-08-28T09:54:47.5691033Z           "evidence": [
2026-08-28T09:54:47.5691292Z             {
2026-08-28T09:54:47.5691672Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:47.5692011Z               "line": 330
2026-08-28T09:54:47.5692274Z             },
2026-08-28T09:54:47.5692525Z             {
2026-08-28T09:54:47.5692913Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:47.5693184Z               "line": 375
2026-08-28T09:54:47.5693441Z             }
2026-08-28T09:54:47.5693693Z           ]
2026-08-28T09:54:47.5693949Z         }
2026-08-28T09:54:47.5694201Z       }
2026-08-28T09:54:47.5694458Z     },
2026-08-28T09:54:47.5694701Z     {
2026-08-28T09:54:47.5695030Z       "id": "REQ-NOW-SIGNAL-CATEGORIES-V1",
2026-08-28T09:54:47.5707964Z       "title": "THE v1 CATEGORY SET IS CLOSED AND EACH CATEGORY ANSWERS ONE QUESTION (ratified 2026-07-29 + operator ruling 10). HINTS carries the keyword-hint payload the alias verb used to. ENDPOINT_MENTIONS fires when the author's words exactly match a known endpoint name and answers existence, online status, node, shared subnets, and the description ONCE PER SESSION. MONICS surfaces the standing judgements a matched trigger raised — the second ratified consumer of the trigger vocabulary, which is why that vocabulary was ratified whole rather than sender-only. SHELLS reports shell instances and adapters, and SUBSUMES AND DEPRECATES the session-start spt-shells message, because the same datum arriving through two channels is the ambiguity this funnel exists to end. LAST_MSGS reports the last outgoing and incoming message as time, relative-to-now, peer, and a short excerpt — enough to re-ground after a reset without re-reading a transcript. EDGE_TRANSITIONS reports endpoint and node on/offline edges and subnet joins. DISPATCH_RESULTS renders the accumulated shortform per-target delivered/no-perch rows and the seal-mint outcomes and refusals, and IS THE ONLY CONFIRMATION SURFACE FOR THEM (ruling 10) — the reader the W3 and W4 accumulators were built to cost a registration rather than a rework. EACH CATEGORY OBEYS THE DELTA DISCIPLINE; none may render an unconditional static payload.",
2026-08-28T09:54:47.5708374Z       "requiredStages": [
2026-08-28T09:54:47.5708756Z         "doc",
2026-08-28T09:54:47.5709099Z         "impl",
2026-08-28T09:54:47.5709356Z         "unit",
2026-08-28T09:54:47.5709612Z         "int"
2026-08-28T09:54:47.5709863Z       ],
2026-08-28T09:54:47.5710125Z       "stages": {
2026-08-28T09:54:47.5710382Z         "doc": {
2026-08-28T09:54:47.5711189Z           "complete": true,
2026-08-28T09:54:47.5711475Z           "evidence": [
2026-08-28T09:54:47.5711723Z             {
2026-08-28T09:54:47.5712081Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.5712364Z               "line": 623
2026-08-28T09:54:47.5712691Z             }
2026-08-28T09:54:47.5712944Z           ]
2026-08-28T09:54:47.5713193Z         },
2026-08-28T09:54:47.5713446Z         "impl": {
2026-08-28T09:54:47.5713723Z           "complete": true,
2026-08-28T09:54:47.5713994Z           "evidence": [
2026-08-28T09:54:47.5714241Z             {
2026-08-28T09:54:47.5714604Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.5714884Z               "line": 73
2026-08-28T09:54:47.5715168Z             },
2026-08-28T09:54:47.5715421Z             {
2026-08-28T09:54:47.5715769Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.5716041Z               "line": 226
2026-08-28T09:54:47.5716285Z             },
2026-08-28T09:54:47.5716541Z             {
2026-08-28T09:54:47.5716895Z               "path": "crates/spt-daemon/src/iobus.rs",
2026-08-28T09:54:47.5717171Z               "line": 264
2026-08-28T09:54:47.5717433Z             },
2026-08-28T09:54:47.5717689Z             {
2026-08-28T09:54:47.5718061Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5718329Z               "line": 96
2026-08-28T09:54:47.5718591Z             },
2026-08-28T09:54:47.5718840Z             {
2026-08-28T09:54:47.5719306Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5719582Z               "line": 110
2026-08-28T09:54:47.5719930Z             },
2026-08-28T09:54:47.5720191Z             {
2026-08-28T09:54:47.5720548Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5720829Z               "line": 142
2026-08-28T09:54:47.5721082Z             },
2026-08-28T09:54:47.5721334Z             {
2026-08-28T09:54:47.5721682Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:47.5721958Z               "line": 754
2026-08-28T09:54:47.5722212Z             },
2026-08-28T09:54:47.5722468Z             {
2026-08-28T09:54:47.5722835Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5723161Z               "line": 384
2026-08-28T09:54:47.5723429Z             },
2026-08-28T09:54:47.5723687Z             {
2026-08-28T09:54:47.5724053Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5724321Z               "line": 408
2026-08-28T09:54:47.5724578Z             },
2026-08-28T09:54:47.5724835Z             {
2026-08-28T09:54:47.5725194Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5725463Z               "line": 440
2026-08-28T09:54:47.5725714Z             },
2026-08-28T09:54:47.5725973Z             {
2026-08-28T09:54:47.5726334Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5726606Z               "line": 525
2026-08-28T09:54:47.5726859Z             },
2026-08-28T09:54:47.5727121Z             {
2026-08-28T09:54:47.5727489Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5727765Z               "line": 541
2026-08-28T09:54:47.5728031Z             },
2026-08-28T09:54:47.5728283Z             {
2026-08-28T09:54:47.5728654Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5728926Z               "line": 582
2026-08-28T09:54:47.5729279Z             },
2026-08-28T09:54:47.5729532Z             {
2026-08-28T09:54:47.5729942Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5730214Z               "line": 629
2026-08-28T09:54:47.5730471Z             },
2026-08-28T09:54:47.5730732Z             {
2026-08-28T09:54:47.5731160Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5731432Z               "line": 679
2026-08-28T09:54:47.5731685Z             },
2026-08-28T09:54:47.5731943Z             {
2026-08-28T09:54:47.5732300Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.5732577Z               "line": 264
2026-08-28T09:54:47.5732838Z             }
2026-08-28T09:54:47.5733091Z           ]
2026-08-28T09:54:47.5733348Z         },
2026-08-28T09:54:47.5733614Z         "int": {
2026-08-28T09:54:47.5733893Z           "complete": true,
2026-08-28T09:54:47.5734223Z           "evidence": [
2026-08-28T09:54:47.5734485Z             {
2026-08-28T09:54:47.5734876Z               "path": "crates/spt/tests/now_signal_delta_e2e.rs",
2026-08-28T09:54:47.5735148Z               "line": 35
2026-08-28T09:54:47.5735410Z             }
2026-08-28T09:54:47.5735658Z           ]
2026-08-28T09:54:47.5735915Z         },
2026-08-28T09:54:47.5736171Z         "unit": {
2026-08-28T09:54:47.5736455Z           "complete": true,
2026-08-28T09:54:47.5736722Z           "evidence": [
2026-08-28T09:54:47.5736974Z             {
2026-08-28T09:54:47.5737332Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5737599Z               "line": 152
2026-08-28T09:54:47.5737858Z             },
2026-08-28T09:54:47.5738110Z             {
2026-08-28T09:54:47.5738481Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5738749Z               "line": 165
2026-08-28T09:54:47.5739088Z             },
2026-08-28T09:54:47.5739335Z             {
2026-08-28T09:54:47.5739701Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5739979Z               "line": 176
2026-08-28T09:54:47.5740231Z             },
2026-08-28T09:54:47.5740488Z             {
2026-08-28T09:54:47.5740846Z               "path": "crates/spt-store/src/lastmsg.rs",
2026-08-28T09:54:47.5741126Z               "line": 215
2026-08-28T09:54:47.5741438Z             },
2026-08-28T09:54:47.5741696Z             {
2026-08-28T09:54:47.5742063Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5742339Z               "line": 1026
2026-08-28T09:54:47.5742602Z             },
2026-08-28T09:54:47.5742851Z             {
2026-08-28T09:54:47.5743222Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5743499Z               "line": 1038
2026-08-28T09:54:47.5743814Z             }
2026-08-28T09:54:47.5744069Z           ]
2026-08-28T09:54:47.5744396Z         }
2026-08-28T09:54:47.5744648Z       }
2026-08-28T09:54:47.5744906Z     },
2026-08-28T09:54:47.5745160Z     {
2026-08-28T09:54:47.5745521Z       "id": "REQ-NOW-SIGNAL-DEFERRED-CATEGORIES",
2026-08-28T09:54:47.5749736Z       "title": "PROJECTS (spt-bs-releases#16) AND FILE_ACCESS_HELPER (#17) ARE MINTED AS DEFERRED NOW-SIGNAL CATEGORIES SO THEY ARE NOT LOST (ratified 2026-07-29). They are NAMED, NOT BUILT: v1 ships without them deliberately, and this requirement exists so that the decision is on the record as a deferral with an issue behind it rather than as an omission a later reader mistakes for an oversight. Activating this requirement is what the lane that builds them does; until then it carries no stages and fails nothing.",
2026-08-28T09:54:47.5750028Z       "requiredStages": [],
2026-08-28T09:54:47.5750285Z       "stages": {
2026-08-28T09:54:47.5750544Z         "doc": {
2026-08-28T09:54:47.5750820Z           "complete": false,
2026-08-28T09:54:47.5751101Z           "evidence": []
2026-08-28T09:54:47.5751353Z         },
2026-08-28T09:54:47.5751610Z         "impl": {
2026-08-28T09:54:47.5751894Z           "complete": false,
2026-08-28T09:54:47.5752171Z           "evidence": []
2026-08-28T09:54:47.5752423Z         },
2026-08-28T09:54:47.5752684Z         "int": {
2026-08-28T09:54:47.5752976Z           "complete": false,
2026-08-28T09:54:47.5753252Z           "evidence": []
2026-08-28T09:54:47.5753505Z         },
2026-08-28T09:54:47.5753768Z         "unit": {
2026-08-28T09:54:47.5754055Z           "complete": false,
2026-08-28T09:54:47.5754398Z           "evidence": []
2026-08-28T09:54:47.5754663Z         }
2026-08-28T09:54:47.5754917Z       }
2026-08-28T09:54:47.5755175Z     },
2026-08-28T09:54:47.5755429Z     {
2026-08-28T09:54:47.5756025Z       "id": "REQ-NOW-SIGNAL-DELTA",
2026-08-28T09:54:47.5766528Z       "title": "EVERY NOW-SIGNAL CATEGORY IS DELTA-ONLY, ON PER-SESSION SEEN-SETS, AND A POLL WITH NOTHING NEW EMITS NOTHING (ratified 2026-07-29). This is the keyword-hint mechanism GENERALIZED rather than re-invented per category: each category records what this session has already been shown and reports only what it has not. THE EMPTINESS IS THE CONTRACT, NOT AN ACCIDENT OF THERE BEING NO DATA — the adapter guidance is to inject on every UserPromptSubmit- and PreToolUse-equivalent, which is only affordable if a quiet poll costs zero context, so a category that re-emits an already-shown datum is a defect even though its output is TRUE. THE SEEN-SET IS PER SESSION, not per endpoint and not global: a new session has seen nothing and is entitled to the current picture once, which is what makes the first poll of a session useful without making every later poll noisy. A DESCRIPTION-CLASS DATUM IS SHOWN ONCE PER SESSION by the same mechanism rather than by a bespoke flag. Proving this needs a NON-VACUOUS FIRST POLL BESIDE THE EMPTY SECOND ONE: an assertion that the second poll is empty, standing alone, passes just as well against a verb that emits nothing ever, so the two polls are asserted together as one test.",
2026-08-28T09:54:47.5766952Z       "requiredStages": [
2026-08-28T09:54:47.5767210Z         "doc",
2026-08-28T09:54:47.5767478Z         "impl",
2026-08-28T09:54:47.5767742Z         "unit",
2026-08-28T09:54:47.5767992Z         "int"
2026-08-28T09:54:47.5768250Z       ],
2026-08-28T09:54:47.5768508Z       "stages": {
2026-08-28T09:54:47.5768766Z         "doc": {
2026-08-28T09:54:47.5769142Z           "complete": true,
2026-08-28T09:54:47.5769485Z           "evidence": [
2026-08-28T09:54:47.5769738Z             {
2026-08-28T09:54:47.5770110Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.5770378Z               "line": 601
2026-08-28T09:54:47.5770633Z             }
2026-08-28T09:54:47.5770885Z           ]
2026-08-28T09:54:47.5771134Z         },
2026-08-28T09:54:47.5771401Z         "impl": {
2026-08-28T09:54:47.5771683Z           "complete": true,
2026-08-28T09:54:47.5771959Z           "evidence": [
2026-08-28T09:54:47.5772202Z             {
2026-08-28T09:54:47.5772570Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5772907Z               "line": 175
2026-08-28T09:54:47.5773166Z             },
2026-08-28T09:54:47.5773423Z             {
2026-08-28T09:54:47.5773786Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5774058Z               "line": 724
2026-08-28T09:54:47.5774311Z             }
2026-08-28T09:54:47.5774569Z           ]
2026-08-28T09:54:47.5774822Z         },
2026-08-28T09:54:47.5775088Z         "int": {
2026-08-28T09:54:47.5775379Z           "complete": true,
2026-08-28T09:54:47.5775659Z           "evidence": [
2026-08-28T09:54:47.5775915Z             {
2026-08-28T09:54:47.5776305Z               "path": "crates/spt/tests/now_signal_delta_e2e.rs",
2026-08-28T09:54:47.5776591Z               "line": 34
2026-08-28T09:54:47.5776844Z             }
2026-08-28T09:54:47.5777103Z           ]
2026-08-28T09:54:47.5777365Z         },
2026-08-28T09:54:47.5777622Z         "unit": {
2026-08-28T09:54:47.5777908Z           "complete": true,
2026-08-28T09:54:47.5778193Z           "evidence": [
2026-08-28T09:54:47.5778453Z             {
2026-08-28T09:54:47.5778820Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5779172Z               "line": 804
2026-08-28T09:54:47.5779431Z             },
2026-08-28T09:54:47.5779692Z             {
2026-08-28T09:54:47.5780064Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5780336Z               "line": 853
2026-08-28T09:54:47.5780595Z             },
2026-08-28T09:54:47.5780924Z             {
2026-08-28T09:54:47.5781290Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5781556Z               "line": 872
2026-08-28T09:54:47.5781818Z             }
2026-08-28T09:54:47.5782075Z           ]
2026-08-28T09:54:47.5782333Z         }
2026-08-28T09:54:47.5782586Z       }
2026-08-28T09:54:47.5782835Z     },
2026-08-28T09:54:47.5783087Z     {
2026-08-28T09:54:47.5783391Z       "id": "REQ-NOW-SIGNAL-SPEC",
2026-08-28T09:54:47.5790487Z       "title": "THE HARNESS ADAPTER CAN PRESCRIBE AND TUNE CATEGORIES AT POLL TIME VIA --spec-manifest and --spec-file (ratified 2026-07-29). An adapter knows things core cannot: which categories its harness can render, which are noise in its surface, and what its injection budget is. --spec-manifest reads the tuning the runtime manifest already carries; --spec-file takes the same shape as JSON on disk for an adapter that composes it per poll. A SPEC NARROWS AND TUNES; IT DOES NOT INVENT — a category not in the v1 vocabulary cannot be conjured by a spec, so the vocabulary stays the one closed list every consumer reads. AN ABSENT, UNREADABLE OR MALFORMED SPEC IS THE DEFAULT PICTURE, NEVER A REFUSAL: this verb runs on a hook at every turn boundary, and a poll that fails hard on a bad config file is a hook that breaks a working session over a typo.",
2026-08-28T09:54:47.5790864Z       "requiredStages": [
2026-08-28T09:54:47.5791121Z         "doc",
2026-08-28T09:54:47.5791383Z         "impl",
2026-08-28T09:54:47.5791639Z         "unit"
2026-08-28T09:54:47.5791893Z       ],
2026-08-28T09:54:47.5792164Z       "stages": {
2026-08-28T09:54:47.5792417Z         "doc": {
2026-08-28T09:54:47.5792708Z           "complete": true,
2026-08-28T09:54:47.5792979Z           "evidence": [
2026-08-28T09:54:47.5793232Z             {
2026-08-28T09:54:47.5793661Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:47.5794017Z               "line": 401
2026-08-28T09:54:47.5794272Z             },
2026-08-28T09:54:47.5794539Z             {
2026-08-28T09:54:47.5794892Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.5795164Z               "line": 648
2026-08-28T09:54:47.5795422Z             },
2026-08-28T09:54:47.5795675Z             {
2026-08-28T09:54:47.5795980Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.5796504Z               "line": 358
2026-08-28T09:54:47.5796775Z             }
2026-08-28T09:54:47.5797021Z           ]
2026-08-28T09:54:47.5797279Z         },
2026-08-28T09:54:47.5797608Z         "impl": {
2026-08-28T09:54:47.5797894Z           "complete": true,
2026-08-28T09:54:47.5798170Z           "evidence": [
2026-08-28T09:54:47.5798422Z             {
2026-08-28T09:54:47.5798790Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5799139Z               "line": 269
2026-08-28T09:54:47.5799403Z             },
2026-08-28T09:54:47.5799659Z             {
2026-08-28T09:54:47.5800026Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5800302Z               "line": 288
2026-08-28T09:54:47.5800556Z             },
2026-08-28T09:54:47.5800809Z             {
2026-08-28T09:54:47.5801170Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5801443Z               "line": 320
2026-08-28T09:54:47.5801691Z             },
2026-08-28T09:54:47.5801953Z             {
2026-08-28T09:54:47.5802309Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5802580Z               "line": 338
2026-08-28T09:54:47.5802842Z             },
2026-08-28T09:54:47.5803091Z             {
2026-08-28T09:54:47.5803453Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5803725Z               "line": 695
2026-08-28T09:54:47.5803984Z             }
2026-08-28T09:54:47.5804236Z           ]
2026-08-28T09:54:47.5804491Z         },
2026-08-28T09:54:47.5804747Z         "int": {
2026-08-28T09:54:47.5805034Z           "complete": false,
2026-08-28T09:54:47.5805367Z           "evidence": []
2026-08-28T09:54:47.5805691Z         },
2026-08-28T09:54:47.5805954Z         "unit": {
2026-08-28T09:54:47.5806235Z           "complete": true,
2026-08-28T09:54:47.5806508Z           "evidence": [
2026-08-28T09:54:47.5806749Z             {
2026-08-28T09:54:47.5807108Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5807377Z               "line": 953
2026-08-28T09:54:47.5807643Z             },
2026-08-28T09:54:47.5807901Z             {
2026-08-28T09:54:47.5808253Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5808530Z               "line": 974
2026-08-28T09:54:47.5808859Z             },
2026-08-28T09:54:47.5809211Z             {
2026-08-28T09:54:47.5809569Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5809841Z               "line": 986
2026-08-28T09:54:47.5810102Z             }
2026-08-28T09:54:47.5810352Z           ]
2026-08-28T09:54:47.5810619Z         }
2026-08-28T09:54:47.5810871Z       }
2026-08-28T09:54:47.5811125Z     },
2026-08-28T09:54:47.5811378Z     {
2026-08-28T09:54:47.5811688Z       "id": "REQ-NOW-SIGNAL-VERB",
2026-08-28T09:54:47.5820913Z       "title": "spt api now-signal IS THE ONE SITUATIONAL-AWARENESS FUNNEL (ratified 2026-07-29, access-control grill; releases#233). One verb answers the question an agent asks at the top of every turn — what changed that I should know about — and it renders per-category XML tags nested under a single SPT-NOW-SIGNAL root. The hint verb SURVIVES AS A THIN ALIAS over the HINTS category and gains no independent behaviour, because two verbs answering the same question is how an adapter ends up injecting both and an agent ends up trusting whichever it happened to read. NO SECOND INJECTION FUNNEL MAY BE ADDED BESIDE IT (the design of record names this as the thing to avoid): a surface that wants to reach an agent at turn boundaries registers a CATEGORY here rather than growing its own injection point. The render is composed by ONE composer over a category list, so a category cannot invent its own envelope grammar, and an EMPTY render emits NOTHING AT ALL — not an empty root, because an empty root is a payload that costs context on every poll and says nothing.",
2026-08-28T09:54:47.5821342Z       "requiredStages": [
2026-08-28T09:54:47.5821600Z         "doc",
2026-08-28T09:54:47.5821862Z         "impl",
2026-08-28T09:54:47.5822114Z         "unit",
2026-08-28T09:54:47.5822372Z         "int"
2026-08-28T09:54:47.5822620Z       ],
2026-08-28T09:54:47.5822883Z       "stages": {
2026-08-28T09:54:47.5823203Z         "doc": {
2026-08-28T09:54:47.5823482Z           "complete": true,
2026-08-28T09:54:47.5823763Z           "evidence": [
2026-08-28T09:54:47.5824025Z             {
2026-08-28T09:54:47.5824417Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:47.5824688Z               "line": 342
2026-08-28T09:54:47.5824945Z             },
2026-08-28T09:54:47.5825197Z             {
2026-08-28T09:54:47.5825569Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:47.5825843Z               "line": 569
2026-08-28T09:54:47.5826301Z             }
2026-08-28T09:54:47.5826563Z           ]
2026-08-28T09:54:47.5826812Z         },
2026-08-28T09:54:47.5827074Z         "impl": {
2026-08-28T09:54:47.5827356Z           "complete": true,
2026-08-28T09:54:47.5827633Z           "evidence": [
2026-08-28T09:54:47.5827889Z             {
2026-08-28T09:54:47.5828214Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:47.5828484Z               "line": 590
2026-08-28T09:54:47.5828739Z             },
2026-08-28T09:54:47.5829073Z             {
2026-08-28T09:54:47.5829416Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:47.5829702Z               "line": 592
2026-08-28T09:54:47.5829955Z             },
2026-08-28T09:54:47.5830209Z             {
2026-08-28T09:54:47.5830576Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5830848Z               "line": 142
2026-08-28T09:54:47.5831098Z             },
2026-08-28T09:54:47.5831444Z             {
2026-08-28T09:54:47.5831807Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5832088Z               "line": 723
2026-08-28T09:54:47.5832344Z             }
2026-08-28T09:54:47.5832603Z           ]
2026-08-28T09:54:47.5832865Z         },
2026-08-28T09:54:47.5833119Z         "int": {
2026-08-28T09:54:47.5833405Z           "complete": true,
2026-08-28T09:54:47.5833677Z           "evidence": [
2026-08-28T09:54:47.5833932Z             {
2026-08-28T09:54:47.5834323Z               "path": "crates/spt/tests/now_signal_delta_e2e.rs",
2026-08-28T09:54:47.5834653Z               "line": 33
2026-08-28T09:54:47.5834909Z             }
2026-08-28T09:54:47.5835163Z           ]
2026-08-28T09:54:47.5835420Z         },
2026-08-28T09:54:47.5835678Z         "unit": {
2026-08-28T09:54:47.5835960Z           "complete": true,
2026-08-28T09:54:47.5836224Z           "evidence": [
2026-08-28T09:54:47.5836485Z             {
2026-08-28T09:54:47.5836842Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5837118Z               "line": 897
2026-08-28T09:54:47.5837372Z             },
2026-08-28T09:54:47.5837624Z             {
2026-08-28T09:54:47.5837996Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5838268Z               "line": 938
2026-08-28T09:54:47.5838532Z             },
2026-08-28T09:54:47.5838784Z             {
2026-08-28T09:54:47.5839234Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5839514Z               "line": 1006
2026-08-28T09:54:47.5839771Z             },
2026-08-28T09:54:47.5840024Z             {
2026-08-28T09:54:47.5840382Z               "path": "crates/spt/src/api/nowsignal.rs",
2026-08-28T09:54:47.5840653Z               "line": 1065
2026-08-28T09:54:47.5840911Z             }
2026-08-28T09:54:47.5841168Z           ]
2026-08-28T09:54:47.5841418Z         }
2026-08-28T09:54:47.5841677Z       }
2026-08-28T09:54:47.5841999Z     },
2026-08-28T09:54:47.5842252Z     {
2026-08-28T09:54:47.5842585Z       "id": "REQ-ONEWAY-STREAM-TERMINAL",
2026-08-28T09:54:47.5848884Z       "title": "REGISTRY-LIFECYCLE W1 (ADR-0040 decision 1, hertz defect B leg 1): a one-way fire-and-forget stream family is TERMINAL at successful FIN, sender-side — the registry pump retires its OWN feed row after write+FIN via the existing net-stream-retire verb (best-effort on N-1 brokers per ADR-0038 A). Sender history on the long-lived pump conn stops accumulating: steady-state row population is O(active exchanges), not O(feeds since conn start). Gate: impl — pump push_feed retire-after-FIN; unit — successful feed retires its row, failed/unFINed feed does not, retire failure is best-effort non-fatal; int — rides REQ-HAZARD-REGISTRY-STALL plateau seam (eligible rows plateau O(active) over N rounds); doc — ADR-0040.",
2026-08-28T09:54:47.5849358Z       "requiredStages": [
2026-08-28T09:54:47.5849623Z         "doc",
2026-08-28T09:54:47.5849883Z         "impl",
2026-08-28T09:54:47.5850156Z         "unit",
2026-08-28T09:54:47.5850422Z         "int"
2026-08-28T09:54:47.5850680Z       ],
2026-08-28T09:54:47.5850947Z       "stages": {
2026-08-28T09:54:47.5851209Z         "doc": {
2026-08-28T09:54:47.5851485Z           "complete": true,
2026-08-28T09:54:47.5851761Z           "evidence": [
2026-08-28T09:54:47.5852020Z             {
2026-08-28T09:54:47.5852656Z               "path": "docs/adr/0040-bounded-stream-seat-lifecycle-one-way-terminal.md",
2026-08-28T09:54:47.5852933Z               "line": 52
2026-08-28T09:54:47.5853189Z             }
2026-08-28T09:54:47.5853461Z           ]
2026-08-28T09:54:47.5853718Z         },
2026-08-28T09:54:47.5853990Z         "impl": {
2026-08-28T09:54:47.5854271Z           "complete": true,
2026-08-28T09:54:47.5854544Z           "evidence": [
2026-08-28T09:54:47.5854802Z             {
2026-08-28T09:54:47.5855153Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.5855429Z               "line": 2080
2026-08-28T09:54:47.5855686Z             },
2026-08-28T09:54:47.5855944Z             {
2026-08-28T09:54:47.5856378Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.5856645Z               "line": 9288
2026-08-28T09:54:47.5856907Z             },
2026-08-28T09:54:47.5857156Z             {
2026-08-28T09:54:47.5857529Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.5857796Z               "line": 2051
2026-08-28T09:54:47.5858053Z             },
2026-08-28T09:54:47.5858305Z             {
2026-08-28T09:54:47.5858683Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:47.5859031Z               "line": 366
2026-08-28T09:54:47.5859351Z             },
2026-08-28T09:54:47.5859604Z             {
2026-08-28T09:54:47.5859981Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.5860260Z               "line": 1553
2026-08-28T09:54:47.5860510Z             },
2026-08-28T09:54:47.5860767Z             {
2026-08-28T09:54:47.5861110Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.5861388Z               "line": 357
2026-08-28T09:54:47.5861645Z             }
2026-08-28T09:54:47.5861904Z           ]
2026-08-28T09:54:47.5862166Z         },
2026-08-28T09:54:47.5862422Z         "int": {
2026-08-28T09:54:47.5862712Z           "complete": true,
2026-08-28T09:54:47.5862991Z           "evidence": [
2026-08-28T09:54:47.5863240Z             {
2026-08-28T09:54:47.5863677Z               "path": "crates/spt-daemon/tests/registry_lifecycle.rs",
2026-08-28T09:54:47.5863949Z               "line": 163
2026-08-28T09:54:47.5864207Z             }
2026-08-28T09:54:47.5864466Z           ]
2026-08-28T09:54:47.5864723Z         },
2026-08-28T09:54:47.5864984Z         "unit": {
2026-08-28T09:54:47.5865265Z           "complete": true,
2026-08-28T09:54:47.5865536Z           "evidence": [
2026-08-28T09:54:47.5865795Z             {
2026-08-28T09:54:47.5866180Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.5866518Z               "line": 3307
2026-08-28T09:54:47.5866776Z             },
2026-08-28T09:54:47.5867034Z             {
2026-08-28T09:54:47.5867621Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.5867890Z               "line": 2712
2026-08-28T09:54:47.5868141Z             }
2026-08-28T09:54:47.5868385Z           ]
2026-08-28T09:54:47.5868657Z         }
2026-08-28T09:54:47.5868905Z       }
2026-08-28T09:54:47.5869243Z     },
2026-08-28T09:54:47.5869505Z     {
2026-08-28T09:54:47.5869864Z       "id": "REQ-OPID-MINTER-NAMESPACE",
2026-08-28T09:54:47.5890340Z       "title": "A-4a (REMOTE-TRUTH triage §A + ADR-0034 Decision 1 + Amendments 1 & 2): the broker effect journal's dedup key gains a minter dimension so ops minted by independent counters can never collide. ROOT (high, ground-truthed vs HEAD): the journaled-op producers key into ONE journal namespace (NET_EFFECT_SESSION|shell_sid, op) at broker.rs (EffectKey=(u64,u64)); a CLI wake op colliding with an already-journaled daemon op reproduces the typed 'already applied … retry with a fresh op_id' with NO broker restart (field-hit: spt endpoint wake id@node WOKE_FAIL). Same latent class: nethost dial_ops/stream_ops HashMap<u64,u64> ('Shares the one net op-id namespace') would re-clobber even after the journal separates them; AND shellchan::deliver_stdin_pending journals (shell_sid, row_id) so an rc operator's ops on the same shell_sid collide with spool row ids (dropped keystroke OR dropped spool row). Amendment 2 corrected the minter set: the REAL journal minters are {cli, pump, rc, shell} + legacy — psyche/epoch are the EpochSource notif/lease counter domain, NEVER submit to apply_once, DROPPED from the journal enum (a tag with no stamp site = doc'd-but-dead knob). FIX (Decision 1 + Amdt 2): ONE canonical Minter enum {Legacy, Cli, Pump, Rc, Shell, Wake} — Legacy reserved for pre-upgrade lines + untagged wire, monotonically shrinks; enum is the single source for the TEXTUAL journal-line token (self-describing during recovery). EffectKey becomes (effect-class, minter, op); recover() DUAL-PARSES (old shorter line → minter=Legacy, new longer line → parsed tag) so old journals need no migration and old-shape keys can never equal new-shape (migration-free). A MintedOp{minter, seq} newtype REPLACES bare op_id:u64 through the brain/daemon THREADING paths so forgot-to-stamp is UNCOMPILABLE (row_id stays the shell seq — never re-minted, the durable spool exactly-once identity). Wire keeps an additive optional minter field (serde default absent ⇒ Legacy materialized at broker decode; serde_json no deny_unknown_fields ⇒ NO wire version bump); the newtype is NOT forced into wire structs. nethost op-maps re-key by (minter, op). Red-first: mint an rc op == a journaled shell/pump/daemon op int on the same session → pre-fix the second dedups/clobbers (WOKE_FAIL class); post-fix both are distinct keys, both Applied.",
2026-08-28T09:54:47.5890892Z       "requiredStages": [
2026-08-28T09:54:47.5891145Z         "doc",
2026-08-28T09:54:47.5891416Z         "impl",
2026-08-28T09:54:47.5891689Z         "unit"
2026-08-28T09:54:47.5891955Z       ],
2026-08-28T09:54:47.5892219Z       "stages": {
2026-08-28T09:54:47.5892477Z         "doc": {
2026-08-28T09:54:47.5892758Z           "complete": true,
2026-08-28T09:54:47.5893025Z           "evidence": [
2026-08-28T09:54:47.5893283Z             {
2026-08-28T09:54:47.5893740Z               "path": "docs/adr/0034-per-minter-op-id-namespacing.md",
2026-08-28T09:54:47.5894026Z               "line": 70
2026-08-28T09:54:47.5894294Z             }
2026-08-28T09:54:47.5894545Z           ]
2026-08-28T09:54:47.5894815Z         },
2026-08-28T09:54:47.5895076Z         "impl": {
2026-08-28T09:54:47.5895367Z           "complete": true,
2026-08-28T09:54:47.5895854Z           "evidence": [
2026-08-28T09:54:47.5896103Z             {
2026-08-28T09:54:47.5896480Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5896742Z               "line": 134
2026-08-28T09:54:47.5896994Z             }
2026-08-28T09:54:47.5897321Z           ]
2026-08-28T09:54:47.5897574Z         },
2026-08-28T09:54:47.5897838Z         "int": {
2026-08-28T09:54:47.5898118Z           "complete": false,
2026-08-28T09:54:47.5898395Z           "evidence": []
2026-08-28T09:54:47.5898648Z         },
2026-08-28T09:54:47.5898909Z         "unit": {
2026-08-28T09:54:47.5899292Z           "complete": true,
2026-08-28T09:54:47.5899566Z           "evidence": [
2026-08-28T09:54:47.5899822Z             {
2026-08-28T09:54:47.5900193Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5900460Z               "line": 1010
2026-08-28T09:54:47.5900775Z             },
2026-08-28T09:54:47.5901028Z             {
2026-08-28T09:54:47.5901404Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5901676Z               "line": 1039
2026-08-28T09:54:47.5901939Z             },
2026-08-28T09:54:47.5902193Z             {
2026-08-28T09:54:47.5902553Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5902827Z               "line": 1109
2026-08-28T09:54:47.5903079Z             },
2026-08-28T09:54:47.5903342Z             {
2026-08-28T09:54:47.5903704Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5903976Z               "line": 1163
2026-08-28T09:54:47.5904234Z             },
2026-08-28T09:54:47.5904492Z             {
2026-08-28T09:54:47.5904840Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.5905105Z               "line": 2282
2026-08-28T09:54:47.5905365Z             },
2026-08-28T09:54:47.5905617Z             {
2026-08-28T09:54:47.5905990Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.5906261Z               "line": 2362
2026-08-28T09:54:47.5906529Z             }
2026-08-28T09:54:47.5906781Z           ]
2026-08-28T09:54:47.5907040Z         }
2026-08-28T09:54:47.5907298Z       }
2026-08-28T09:54:47.5907549Z     },
2026-08-28T09:54:47.5907801Z     {
2026-08-28T09:54:47.5908116Z       "id": "REQ-OPID-TRACING-RETRY",
2026-08-28T09:54:47.5920989Z       "title": "A-4b (REMOTE-TRUTH triage §A + ADR-0034 Decision 2): the tracing-only op families auto-retry ONCE with a fresh op on the typed no-longer-held error, so a broker-restart-dropped conn/stream self-heals instead of surfacing core lingo to the user. ROOT: net/rest.rs declares rest op-ids 'tracing/correlation only … redelivery needs reporting, not dedup', yet the journal enforced exactly-once on them — a rest/attach op whose conn the broker no longer holds (post-restart) returned the typed 'already applied … no longer held … retry with a fresh op_id' (broker.rs:2796 net-dial / 3047 stream-open) straight to the user (WOKE_FAIL / rc attach fail). FIX (Decision 2, scoped): the rest family (request_rest) + rc attach stream-open (request_attach_endpoint) — and ONLY those — catch the typed no-longer-held error INTERNALLY and re-issue ONCE with a FRESH op minted from the SAME minter (A-4a MintedOp; same producer, new seq). sync/update pull families (request_sync/request_update, durable open_op) are NOT wrapped — their exactly-once dedup is load-bearing (negative control). The typed op error becomes internal-only; if the retry ALSO fails, the user-facing line names the observable situation + next action in operator language, ZERO journal/op/brain lingo (F-1 public-error rule applies early — this string is user-facing). Red-first: mint a colliding op → assert the retry succeeds + the user sees NOTHING; NEGATIVE CONTROL — a durable family's no-longer-held stays a hard error, no silent retry.",
2026-08-28T09:54:47.5921505Z       "requiredStages": [
2026-08-28T09:54:47.5921777Z         "doc",
2026-08-28T09:54:47.5922034Z         "impl",
2026-08-28T09:54:47.5922301Z         "unit"
2026-08-28T09:54:47.5922553Z       ],
2026-08-28T09:54:47.5922815Z       "stages": {
2026-08-28T09:54:47.5923074Z         "doc": {
2026-08-28T09:54:47.5923361Z           "complete": true,
2026-08-28T09:54:47.5923639Z           "evidence": [
2026-08-28T09:54:47.5923899Z             {
2026-08-28T09:54:47.5924357Z               "path": "docs/adr/0034-per-minter-op-id-namespacing.md",
2026-08-28T09:54:47.5924696Z               "line": 136
2026-08-28T09:54:47.5924959Z             }
2026-08-28T09:54:47.5925226Z           ]
2026-08-28T09:54:47.5925469Z         },
2026-08-28T09:54:47.5925731Z         "impl": {
2026-08-28T09:54:47.5926030Z           "complete": true,
2026-08-28T09:54:47.5926305Z           "evidence": [
2026-08-28T09:54:47.5926557Z             {
2026-08-28T09:54:47.5926924Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5927192Z               "line": 212
2026-08-28T09:54:47.5927507Z             },
2026-08-28T09:54:47.5927759Z             {
2026-08-28T09:54:47.5928127Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5928394Z               "line": 219
2026-08-28T09:54:47.5928650Z             },
2026-08-28T09:54:47.5928912Z             {
2026-08-28T09:54:47.5929369Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5934095Z               "line": 227
2026-08-28T09:54:47.5934402Z             },
2026-08-28T09:54:47.5934670Z             {
2026-08-28T09:54:47.5935050Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5935337Z               "line": 238
2026-08-28T09:54:47.5935599Z             },
2026-08-28T09:54:47.5935863Z             {
2026-08-28T09:54:47.5936233Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5936506Z               "line": 260
2026-08-28T09:54:47.5936766Z             },
2026-08-28T09:54:47.5937026Z             {
2026-08-28T09:54:47.5937404Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5937690Z               "line": 287
2026-08-28T09:54:47.5937951Z             },
2026-08-28T09:54:47.5938204Z             {
2026-08-28T09:54:47.5938586Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.5938857Z               "line": 478
2026-08-28T09:54:47.5939191Z             }
2026-08-28T09:54:47.5939443Z           ]
2026-08-28T09:54:47.5939701Z         },
2026-08-28T09:54:47.5939968Z         "int": {
2026-08-28T09:54:47.5940354Z           "complete": false,
2026-08-28T09:54:47.5940631Z           "evidence": []
2026-08-28T09:54:47.5940883Z         },
2026-08-28T09:54:47.5941145Z         "unit": {
2026-08-28T09:54:47.5941422Z           "complete": true,
2026-08-28T09:54:47.5941698Z           "evidence": [
2026-08-28T09:54:47.5941949Z             {
2026-08-28T09:54:47.5942324Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5942602Z               "line": 1213
2026-08-28T09:54:47.5942864Z             },
2026-08-28T09:54:47.5943121Z             {
2026-08-28T09:54:47.5943550Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5943912Z               "line": 1255
2026-08-28T09:54:47.5944171Z             },
2026-08-28T09:54:47.5944429Z             {
2026-08-28T09:54:47.5944798Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5945078Z               "line": 1277
2026-08-28T09:54:47.5945535Z             },
2026-08-28T09:54:47.5945798Z             {
2026-08-28T09:54:47.5946231Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5946497Z               "line": 1299
2026-08-28T09:54:47.5946756Z             },
2026-08-28T09:54:47.5947014Z             {
2026-08-28T09:54:47.5947393Z               "path": "crates/spt-daemon/src/effect.rs",
2026-08-28T09:54:47.5947668Z               "line": 1327
2026-08-28T09:54:47.5947920Z             }
2026-08-28T09:54:47.5948173Z           ]
2026-08-28T09:54:47.5948422Z         }
2026-08-28T09:54:47.5948679Z       }
2026-08-28T09:54:47.5948932Z     },
2026-08-28T09:54:47.5949281Z     {
2026-08-28T09:54:47.5949562Z       "id": "REQ-PAIR-1",
2026-08-28T09:54:47.5949891Z       "title": "TOTP-seeded SPAKE2 pairing",
2026-08-28T09:54:47.5950179Z       "requiredStages": [
2026-08-28T09:54:47.5950441Z         "impl",
2026-08-28T09:54:47.5950699Z         "unit",
2026-08-28T09:54:47.5950953Z         "int"
2026-08-28T09:54:47.5951291Z       ],
2026-08-28T09:54:47.5951548Z       "stages": {
2026-08-28T09:54:47.5951812Z         "doc": {
2026-08-28T09:54:47.5952097Z           "complete": false,
2026-08-28T09:54:47.5952376Z           "evidence": []
2026-08-28T09:54:47.5952623Z         },
2026-08-28T09:54:47.5952884Z         "impl": {
2026-08-28T09:54:47.5953171Z           "complete": true,
2026-08-28T09:54:47.5953438Z           "evidence": [
2026-08-28T09:54:47.5953696Z             {
2026-08-28T09:54:47.5954096Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5954369Z               "line": 35
2026-08-28T09:54:47.5954684Z             },
2026-08-28T09:54:47.5954946Z             {
2026-08-28T09:54:47.5955339Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5955613Z               "line": 167
2026-08-28T09:54:47.5955875Z             },
2026-08-28T09:54:47.5956123Z             {
2026-08-28T09:54:47.5956514Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5956791Z               "line": 228
2026-08-28T09:54:47.5957053Z             },
2026-08-28T09:54:47.5957302Z             {
2026-08-28T09:54:47.5957697Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5957972Z               "line": 271
2026-08-28T09:54:47.5958233Z             },
2026-08-28T09:54:47.5958490Z             {
2026-08-28T09:54:47.5958886Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5959253Z               "line": 300
2026-08-28T09:54:47.5959512Z             },
2026-08-28T09:54:47.5959769Z             {
2026-08-28T09:54:47.5960146Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5960423Z               "line": 29
2026-08-28T09:54:47.5960677Z             },
2026-08-28T09:54:47.5960944Z             {
2026-08-28T09:54:47.5961384Z               "path": "crates/spt-net/src/net/pairing/transcript.rs",
2026-08-28T09:54:47.5961650Z               "line": 31
2026-08-28T09:54:47.5961912Z             },
2026-08-28T09:54:47.5962165Z             {
2026-08-28T09:54:47.5962638Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5962903Z               "line": 44
2026-08-28T09:54:47.5963163Z             },
2026-08-28T09:54:47.5963417Z             {
2026-08-28T09:54:47.5963802Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5964075Z               "line": 186
2026-08-28T09:54:47.5964332Z             },
2026-08-28T09:54:47.5964590Z             {
2026-08-28T09:54:47.5964976Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5965258Z               "line": 461
2026-08-28T09:54:47.5965568Z             }
2026-08-28T09:54:47.5965818Z           ]
2026-08-28T09:54:47.5966078Z         },
2026-08-28T09:54:47.5966336Z         "int": {
2026-08-28T09:54:47.5966627Z           "complete": true,
2026-08-28T09:54:47.5966903Z           "evidence": [
2026-08-28T09:54:47.5967152Z             {
2026-08-28T09:54:47.5967505Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5967767Z               "line": 989
2026-08-28T09:54:47.5968010Z             },
2026-08-28T09:54:47.5968267Z             {
2026-08-28T09:54:47.5968644Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.5968912Z               "line": 1804
2026-08-28T09:54:47.5969260Z             }
2026-08-28T09:54:47.5969518Z           ]
2026-08-28T09:54:47.5969775Z         },
2026-08-28T09:54:47.5970034Z         "unit": {
2026-08-28T09:54:47.5970324Z           "complete": true,
2026-08-28T09:54:47.5970610Z           "evidence": [
2026-08-28T09:54:47.5970867Z             {
2026-08-28T09:54:47.5971271Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5971538Z               "line": 354
2026-08-28T09:54:47.5971801Z             },
2026-08-28T09:54:47.5972049Z             {
2026-08-28T09:54:47.5972454Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:47.5972783Z               "line": 467
2026-08-28T09:54:47.5973044Z             },
2026-08-28T09:54:47.5973299Z             {
2026-08-28T09:54:47.5973690Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5973968Z               "line": 233
2026-08-28T09:54:47.5974225Z             },
2026-08-28T09:54:47.5974482Z             {
2026-08-28T09:54:47.5974864Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5975140Z               "line": 255
2026-08-28T09:54:47.5975397Z             },
2026-08-28T09:54:47.5975655Z             {
2026-08-28T09:54:47.5976099Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5976378Z               "line": 269
2026-08-28T09:54:47.5976633Z             },
2026-08-28T09:54:47.5976886Z             {
2026-08-28T09:54:47.5977277Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5977549Z               "line": 281
2026-08-28T09:54:47.5977806Z             },
2026-08-28T09:54:47.5978070Z             {
2026-08-28T09:54:47.5978455Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5978723Z               "line": 295
2026-08-28T09:54:47.5979040Z             },
2026-08-28T09:54:47.5979300Z             {
2026-08-28T09:54:47.5979692Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5979964Z               "line": 309
2026-08-28T09:54:47.5980221Z             },
2026-08-28T09:54:47.5980473Z             {
2026-08-28T09:54:47.5980865Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5981136Z               "line": 316
2026-08-28T09:54:47.5981398Z             },
2026-08-28T09:54:47.5981656Z             {
2026-08-28T09:54:47.5982056Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:47.5982323Z               "line": 334
2026-08-28T09:54:47.5982581Z             },
2026-08-28T09:54:47.5982834Z             {
2026-08-28T09:54:47.5983220Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5983572Z               "line": 1195
2026-08-28T09:54:47.5983826Z             },
2026-08-28T09:54:47.5984086Z             {
2026-08-28T09:54:47.5984475Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5984751Z               "line": 1278
2026-08-28T09:54:47.5985003Z             },
2026-08-28T09:54:47.5985261Z             {
2026-08-28T09:54:47.5985652Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5985928Z               "line": 1348
2026-08-28T09:54:47.5986191Z             },
2026-08-28T09:54:47.5986449Z             {
2026-08-28T09:54:47.5986886Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5987155Z               "line": 1409
2026-08-28T09:54:47.5987414Z             },
2026-08-28T09:54:47.5987667Z             {
2026-08-28T09:54:47.5988052Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5988329Z               "line": 1465
2026-08-28T09:54:47.5988587Z             },
2026-08-28T09:54:47.5988843Z             {
2026-08-28T09:54:47.5989405Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.5989684Z               "line": 1684
2026-08-28T09:54:47.5989938Z             }
2026-08-28T09:54:47.5990190Z           ]
2026-08-28T09:54:47.5990437Z         }
2026-08-28T09:54:47.5990695Z       }
2026-08-28T09:54:47.5990953Z     },
2026-08-28T09:54:47.5991192Z     {
2026-08-28T09:54:47.5991478Z       "id": "REQ-PAIR-2",
2026-08-28T09:54:47.5991896Z       "title": "Local trust store with TOFU + warn-on-change",
2026-08-28T09:54:47.5992211Z       "requiredStages": [],
2026-08-28T09:54:47.5992468Z       "stages": {
2026-08-28T09:54:47.5992735Z         "doc": {
2026-08-28T09:54:47.5993026Z           "complete": false,
2026-08-28T09:54:47.5993302Z           "evidence": []
2026-08-28T09:54:47.5993560Z         },
2026-08-28T09:54:47.5993813Z         "impl": {
2026-08-28T09:54:47.5994170Z           "complete": false,
2026-08-28T09:54:47.5994443Z           "evidence": []
2026-08-28T09:54:47.5994703Z         },
2026-08-28T09:54:47.5994953Z         "int": {
2026-08-28T09:54:47.5995244Z           "complete": false,
2026-08-28T09:54:47.5995516Z           "evidence": []
2026-08-28T09:54:47.5995760Z         },
2026-08-28T09:54:47.5996022Z         "unit": {
2026-08-28T09:54:47.5996308Z           "complete": false,
2026-08-28T09:54:47.5996585Z           "evidence": []
2026-08-28T09:54:47.5996837Z         }
2026-08-28T09:54:47.5997095Z       }
2026-08-28T09:54:47.5997343Z     },
2026-08-28T09:54:47.5997674Z     {
2026-08-28T09:54:47.5997959Z       "id": "REQ-PAIR-3",
2026-08-28T09:54:47.5998431Z       "title": "Fetch current pairing code from any paired node",
2026-08-28T09:54:47.5998745Z       "requiredStages": [
2026-08-28T09:54:47.5999123Z         "impl",
2026-08-28T09:54:47.5999409Z         "unit"
2026-08-28T09:54:47.5999685Z       ],
2026-08-28T09:54:47.5999975Z       "stages": {
2026-08-28T09:54:47.6000249Z         "doc": {
2026-08-28T09:54:47.6000564Z           "complete": false,
2026-08-28T09:54:47.6000860Z           "evidence": []
2026-08-28T09:54:47.6001141Z         },
2026-08-28T09:54:47.6001418Z         "impl": {
2026-08-28T09:54:47.6001714Z           "complete": true,
2026-08-28T09:54:47.6002005Z           "evidence": [
2026-08-28T09:54:47.6002280Z             {
2026-08-28T09:54:47.6002620Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6002918Z               "line": 12367
2026-08-28T09:54:47.6003195Z             },
2026-08-28T09:54:47.6003471Z             {
2026-08-28T09:54:47.6003819Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6004125Z               "line": 12518
2026-08-28T09:54:47.6004401Z             },
2026-08-28T09:54:47.6004688Z             {
2026-08-28T09:54:47.6005021Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6005329Z               "line": 13205
2026-08-28T09:54:47.6005605Z             },
2026-08-28T09:54:47.6005886Z             {
2026-08-28T09:54:47.6006220Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6006592Z               "line": 15138
2026-08-28T09:54:47.6006878Z             }
2026-08-28T09:54:47.6007155Z           ]
2026-08-28T09:54:47.6007436Z         },
2026-08-28T09:54:47.6007717Z         "int": {
2026-08-28T09:54:47.6008025Z           "complete": false,
2026-08-28T09:54:47.6008323Z           "evidence": []
2026-08-28T09:54:47.6008605Z         },
2026-08-28T09:54:47.6008887Z         "unit": {
2026-08-28T09:54:47.6009277Z           "complete": true,
2026-08-28T09:54:47.6009578Z           "evidence": [
2026-08-28T09:54:47.6009853Z             {
2026-08-28T09:54:47.6010255Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6010549Z               "line": 33534
2026-08-28T09:54:47.6010838Z             },
2026-08-28T09:54:47.6011120Z             {
2026-08-28T09:54:47.6011458Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6011754Z               "line": 33836
2026-08-28T09:54:47.6012039Z             },
2026-08-28T09:54:47.6012327Z             {
2026-08-28T09:54:47.6012660Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6012966Z               "line": 38394
2026-08-28T09:54:47.6013247Z             },
2026-08-28T09:54:47.6013531Z             {
2026-08-28T09:54:47.6013865Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6014165Z               "line": 38413
2026-08-28T09:54:47.6014441Z             },
2026-08-28T09:54:47.6014727Z             {
2026-08-28T09:54:47.6015066Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6015367Z               "line": 38437
2026-08-28T09:54:47.6015652Z             },
2026-08-28T09:54:47.6015931Z             {
2026-08-28T09:54:47.6016269Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6016574Z               "line": 38456
2026-08-28T09:54:47.6016861Z             },
2026-08-28T09:54:47.6017137Z             {
2026-08-28T09:54:47.6017485Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6017847Z               "line": 38469
2026-08-28T09:54:47.6018129Z             },
2026-08-28T09:54:47.6018425Z             {
2026-08-28T09:54:47.6018761Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6019146Z               "line": 38478
2026-08-28T09:54:47.6019428Z             }
2026-08-28T09:54:47.6019704Z           ]
2026-08-28T09:54:47.6019976Z         }
2026-08-28T09:54:47.6020258Z       }
2026-08-28T09:54:47.6020543Z     },
2026-08-28T09:54:47.6020815Z     {
2026-08-28T09:54:47.6021129Z       "id": "REQ-PAIR-4",
2026-08-28T09:54:47.6021546Z       "title": "Subnet naming on first pairing",
2026-08-28T09:54:47.6021866Z       "requiredStages": [
2026-08-28T09:54:47.6022146Z         "impl",
2026-08-28T09:54:47.6022427Z         "unit"
2026-08-28T09:54:47.6022709Z       ],
2026-08-28T09:54:47.6022996Z       "stages": {
2026-08-28T09:54:47.6023281Z         "doc": {
2026-08-28T09:54:47.6023591Z           "complete": false,
2026-08-28T09:54:47.6023897Z           "evidence": []
2026-08-28T09:54:47.6024173Z         },
2026-08-28T09:54:47.6024464Z         "impl": {
2026-08-28T09:54:47.6024774Z           "complete": true,
2026-08-28T09:54:47.6025074Z           "evidence": [
2026-08-28T09:54:47.6025355Z             {
2026-08-28T09:54:47.6025737Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:47.6026043Z               "line": 297
2026-08-28T09:54:47.6026322Z             }
2026-08-28T09:54:47.6026600Z           ]
2026-08-28T09:54:47.6026882Z         },
2026-08-28T09:54:47.6027163Z         "int": {
2026-08-28T09:54:47.6027477Z           "complete": false,
2026-08-28T09:54:47.6027792Z           "evidence": []
2026-08-28T09:54:47.6028074Z         },
2026-08-28T09:54:47.6028360Z         "unit": {
2026-08-28T09:54:47.6028675Z           "complete": true,
2026-08-28T09:54:47.6029056Z           "evidence": [
2026-08-28T09:54:47.6029344Z             {
2026-08-28T09:54:47.6029758Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.6030064Z               "line": 1521
2026-08-28T09:54:47.6030421Z             }
2026-08-28T09:54:47.6031008Z           ]
2026-08-28T09:54:47.6031294Z         }
2026-08-28T09:54:47.6031576Z       }
2026-08-28T09:54:47.6031855Z     },
2026-08-28T09:54:47.6032121Z     {
2026-08-28T09:54:47.6032431Z       "id": "REQ-PAIR-5",
2026-08-28T09:54:47.6033399Z       "title": "Multi-subnet pairing: subnet-name discovery input, create-new-names-up-front, rendezvous-token hashing",
2026-08-28T09:54:47.6033719Z       "requiredStages": [
2026-08-28T09:54:47.6034005Z         "impl",
2026-08-28T09:54:47.6034291Z         "unit",
2026-08-28T09:54:47.6034565Z         "int"
2026-08-28T09:54:47.6034913Z       ],
2026-08-28T09:54:47.6035209Z       "stages": {
2026-08-28T09:54:47.6035500Z         "doc": {
2026-08-28T09:54:47.6035814Z           "complete": false,
2026-08-28T09:54:47.6036106Z           "evidence": []
2026-08-28T09:54:47.6036382Z         },
2026-08-28T09:54:47.6036660Z         "impl": {
2026-08-28T09:54:47.6036963Z           "complete": true,
2026-08-28T09:54:47.6037280Z           "evidence": [
2026-08-28T09:54:47.6037557Z             {
2026-08-28T09:54:47.6037981Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6038272Z               "line": 44
2026-08-28T09:54:47.6038559Z             },
2026-08-28T09:54:47.6038840Z             {
2026-08-28T09:54:47.6039359Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6039654Z               "line": 96
2026-08-28T09:54:47.6039932Z             },
2026-08-28T09:54:47.6040215Z             {
2026-08-28T09:54:47.6040638Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6040943Z               "line": 107
2026-08-28T09:54:47.6041220Z             },
2026-08-28T09:54:47.6041506Z             {
2026-08-28T09:54:47.6041926Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6042220Z               "line": 124
2026-08-28T09:54:47.6042504Z             },
2026-08-28T09:54:47.6042843Z             {
2026-08-28T09:54:47.6043262Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6043557Z               "line": 155
2026-08-28T09:54:47.6043882Z             },
2026-08-28T09:54:47.6044135Z             {
2026-08-28T09:54:47.6044521Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6044798Z               "line": 195
2026-08-28T09:54:47.6045045Z             },
2026-08-28T09:54:47.6045303Z             {
2026-08-28T09:54:47.6045689Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6046027Z               "line": 251
2026-08-28T09:54:47.6046285Z             },
2026-08-28T09:54:47.6046543Z             {
2026-08-28T09:54:47.6046924Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6047196Z               "line": 273
2026-08-28T09:54:47.6047442Z             },
2026-08-28T09:54:47.6047692Z             {
2026-08-28T09:54:47.6048121Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6048383Z               "line": 33
2026-08-28T09:54:47.6048641Z             },
2026-08-28T09:54:47.6048890Z             {
2026-08-28T09:54:47.6049424Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6049691Z               "line": 45
2026-08-28T09:54:47.6049943Z             },
2026-08-28T09:54:47.6050204Z             {
2026-08-28T09:54:47.6050626Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6050903Z               "line": 59
2026-08-28T09:54:47.6051160Z             },
2026-08-28T09:54:47.6051423Z             {
2026-08-28T09:54:47.6051804Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.6052076Z               "line": 461
2026-08-28T09:54:47.6052334Z             }
2026-08-28T09:54:47.6052587Z           ]
2026-08-28T09:54:47.6052842Z         },
2026-08-28T09:54:47.6053098Z         "int": {
2026-08-28T09:54:47.6053388Z           "complete": true,
2026-08-28T09:54:47.6053656Z           "evidence": [
2026-08-28T09:54:47.6053990Z             {
2026-08-28T09:54:47.6054366Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.6054643Z               "line": 1804
2026-08-28T09:54:47.6054905Z             },
2026-08-28T09:54:47.6055154Z             {
2026-08-28T09:54:47.6055723Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6055995Z               "line": 360
2026-08-28T09:54:47.6056254Z             }
2026-08-28T09:54:47.6056506Z           ]
2026-08-28T09:54:47.6056755Z         },
2026-08-28T09:54:47.6057006Z         "unit": {
2026-08-28T09:54:47.6057365Z           "complete": true,
2026-08-28T09:54:47.6057636Z           "evidence": [
2026-08-28T09:54:47.6057892Z             {
2026-08-28T09:54:47.6058286Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6058557Z               "line": 311
2026-08-28T09:54:47.6058815Z             },
2026-08-28T09:54:47.6059163Z             {
2026-08-28T09:54:47.6059564Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6059826Z               "line": 322
2026-08-28T09:54:47.6060087Z             },
2026-08-28T09:54:47.6060337Z             {
2026-08-28T09:54:47.6060727Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:47.6061002Z               "line": 424
2026-08-28T09:54:47.6061258Z             },
2026-08-28T09:54:47.6061520Z             {
2026-08-28T09:54:47.6061949Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6062222Z               "line": 72
2026-08-28T09:54:47.6062484Z             },
2026-08-28T09:54:47.6062731Z             {
2026-08-28T09:54:47.6063162Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6063426Z               "line": 82
2026-08-28T09:54:47.6063686Z             },
2026-08-28T09:54:47.6063934Z             {
2026-08-28T09:54:47.6064431Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6064707Z               "line": 100
2026-08-28T09:54:47.6064969Z             },
2026-08-28T09:54:47.6065236Z             {
2026-08-28T09:54:47.6065661Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6065937Z               "line": 110
2026-08-28T09:54:47.6066189Z             },
2026-08-28T09:54:47.6066442Z             {
2026-08-28T09:54:47.6066880Z               "path": "crates/spt-net/src/net/pairing/rendezvous.rs",
2026-08-28T09:54:47.6067152Z               "line": 125
2026-08-28T09:54:47.6067467Z             },
2026-08-28T09:54:47.6067734Z             {
2026-08-28T09:54:47.6068129Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.6068401Z               "line": 1271
2026-08-28T09:54:47.6068657Z             },
2026-08-28T09:54:47.6068913Z             {
2026-08-28T09:54:47.6069390Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.6069671Z               "line": 1337
2026-08-28T09:54:47.6069929Z             },
2026-08-28T09:54:47.6070187Z             {
2026-08-28T09:54:47.6070582Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:47.6070855Z               "line": 1584
2026-08-28T09:54:47.6071107Z             }
2026-08-28T09:54:47.6071363Z           ]
2026-08-28T09:54:47.6071613Z         }
2026-08-28T09:54:47.6071876Z       }
2026-08-28T09:54:47.6072124Z     },
2026-08-28T09:54:47.6072380Z     {
2026-08-28T09:54:47.6072661Z       "id": "REQ-PAIR-6",
2026-08-28T09:54:47.6073473Z       "title": "Elevation-gated per-subnet code fetch (UAC/root or elevated agent; else authenticator app)",
2026-08-28T09:54:47.6073774Z       "requiredStages": [
2026-08-28T09:54:47.6074029Z         "impl",
2026-08-28T09:54:47.6074293Z         "unit"
2026-08-28T09:54:47.6074546Z       ],
2026-08-28T09:54:47.6074810Z       "stages": {
2026-08-28T09:54:47.6075067Z         "doc": {
2026-08-28T09:54:47.6075358Z           "complete": false,
2026-08-28T09:54:47.6075640Z           "evidence": []
2026-08-28T09:54:47.6075964Z         },
2026-08-28T09:54:47.6076706Z         "impl": {
2026-08-28T09:54:47.6076993Z           "complete": true,
2026-08-28T09:54:47.6077255Z           "evidence": [
2026-08-28T09:54:47.6077502Z             {
2026-08-28T09:54:47.6077807Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6078074Z               "line": 12518
2026-08-28T09:54:47.6078327Z             },
2026-08-28T09:54:47.6078580Z             {
2026-08-28T09:54:47.6078881Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6079245Z               "line": 13205
2026-08-28T09:54:47.6079574Z             },
2026-08-28T09:54:47.6079831Z             {
2026-08-28T09:54:47.6080175Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:47.6080442Z               "line": 18
2026-08-28T09:54:47.6080698Z             },
2026-08-28T09:54:47.6080956Z             {
2026-08-28T09:54:47.6081299Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:47.6081571Z               "line": 49
2026-08-28T09:54:47.6081828Z             },
2026-08-28T09:54:47.6082080Z             {
2026-08-28T09:54:47.6082417Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:47.6082684Z               "line": 318
2026-08-28T09:54:47.6082945Z             }
2026-08-28T09:54:47.6083193Z           ]
2026-08-28T09:54:47.6083446Z         },
2026-08-28T09:54:47.6083709Z         "int": {
2026-08-28T09:54:47.6083991Z           "complete": false,
2026-08-28T09:54:47.6084268Z           "evidence": []
2026-08-28T09:54:47.6084522Z         },
2026-08-28T09:54:47.6084783Z         "unit": {
2026-08-28T09:54:47.6085060Z           "complete": true,
2026-08-28T09:54:47.6085336Z           "evidence": [
2026-08-28T09:54:47.6085590Z             {
2026-08-28T09:54:47.6085909Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6086185Z               "line": 38491
2026-08-28T09:54:47.6086438Z             },
2026-08-28T09:54:47.6086781Z             {
2026-08-28T09:54:47.6087096Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6087371Z               "line": 38508
2026-08-28T09:54:47.6087623Z             },
2026-08-28T09:54:47.6087877Z             {
2026-08-28T09:54:47.6088215Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:47.6088487Z               "line": 383
2026-08-28T09:54:47.6088750Z             },
2026-08-28T09:54:47.6089089Z             {
2026-08-28T09:54:47.6089428Z               "path": "crates/spt/src/elevation.rs",
2026-08-28T09:54:47.6089759Z               "line": 392
2026-08-28T09:54:47.6090023Z             }
2026-08-28T09:54:47.6090275Z           ]
2026-08-28T09:54:47.6090538Z         }
2026-08-28T09:54:47.6090787Z       }
2026-08-28T09:54:47.6091044Z     },
2026-08-28T09:54:47.6091297Z     {
2026-08-28T09:54:47.6091578Z       "id": "REQ-PAIR-7",
2026-08-28T09:54:47.6092069Z       "title": "Subnet icon (inline image metadata, GUI-only consumer)",
2026-08-28T09:54:47.6092360Z       "requiredStages": [],
2026-08-28T09:54:47.6092621Z       "stages": {
2026-08-28T09:54:47.6092881Z         "doc": {
2026-08-28T09:54:47.6093172Z           "complete": false,
2026-08-28T09:54:47.6093429Z           "evidence": []
2026-08-28T09:54:47.6093683Z         },
2026-08-28T09:54:47.6093950Z         "impl": {
2026-08-28T09:54:47.6094222Z           "complete": false,
2026-08-28T09:54:47.6094499Z           "evidence": []
2026-08-28T09:54:47.6094745Z         },
2026-08-28T09:54:47.6095007Z         "int": {
2026-08-28T09:54:47.6095291Z           "complete": false,
2026-08-28T09:54:47.6095573Z           "evidence": []
2026-08-28T09:54:47.6095821Z         },
2026-08-28T09:54:47.6096087Z         "unit": {
2026-08-28T09:54:47.6096373Z           "complete": false,
2026-08-28T09:54:47.6096639Z           "evidence": []
2026-08-28T09:54:47.6096888Z         }
2026-08-28T09:54:47.6097141Z       }
2026-08-28T09:54:47.6097390Z     },
2026-08-28T09:54:47.6097637Z     {
2026-08-28T09:54:47.6097926Z       "id": "REQ-PAIR-8",
2026-08-28T09:54:47.6101848Z       "title": "NTP TOTP offset: the pairing ceremony queries NTP at ceremony time (both sides) and applies the derived offset to the TOTP calculation in-process only; system-clock fallback when NTP is unreachable (offline LAN pairing unaffected — NTP failure never blocks a pairing that succeeds today); never sets the OS clock; no background sync loop (M8 decision 18; field trigger: enlyzeam clock >1 min off exceeds the ±1 window)",
2026-08-28T09:54:47.6102230Z       "requiredStages": [
2026-08-28T09:54:47.6102681Z         "impl",
2026-08-28T09:54:47.6102948Z         "unit"
2026-08-28T09:54:47.6103200Z       ],
2026-08-28T09:54:47.6103533Z       "stages": {
2026-08-28T09:54:47.6103790Z         "doc": {
2026-08-28T09:54:47.6104066Z           "complete": false,
2026-08-28T09:54:47.6104337Z           "evidence": []
2026-08-28T09:54:47.6104595Z         },
2026-08-28T09:54:47.6104853Z         "impl": {
2026-08-28T09:54:47.6105135Z           "complete": true,
2026-08-28T09:54:47.6105426Z           "evidence": [
2026-08-28T09:54:47.6105686Z             {
2026-08-28T09:54:47.6106060Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:47.6106337Z               "line": 919
2026-08-28T09:54:47.6106594Z             },
2026-08-28T09:54:47.6106843Z             {
2026-08-28T09:54:47.6107238Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6107491Z               "line": 34
2026-08-28T09:54:47.6107753Z             },
2026-08-28T09:54:47.6108007Z             {
2026-08-28T09:54:47.6108401Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6108673Z               "line": 101
2026-08-28T09:54:47.6108935Z             }
2026-08-28T09:54:47.6109269Z           ]
2026-08-28T09:54:47.6109521Z         },
2026-08-28T09:54:47.6109783Z         "int": {
2026-08-28T09:54:47.6110060Z           "complete": false,
2026-08-28T09:54:47.6110341Z           "evidence": []
2026-08-28T09:54:47.6110595Z         },
2026-08-28T09:54:47.6110908Z         "unit": {
2026-08-28T09:54:47.6111187Z           "complete": true,
2026-08-28T09:54:47.6111468Z           "evidence": [
2026-08-28T09:54:47.6111720Z             {
2026-08-28T09:54:47.6112108Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6112378Z               "line": 363
2026-08-28T09:54:47.6112631Z             },
2026-08-28T09:54:47.6112888Z             {
2026-08-28T09:54:47.6113270Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6113537Z               "line": 375
2026-08-28T09:54:47.6113853Z             },
2026-08-28T09:54:47.6114112Z             {
2026-08-28T09:54:47.6114488Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6114755Z               "line": 428
2026-08-28T09:54:47.6115013Z             },
2026-08-28T09:54:47.6115265Z             {
2026-08-28T09:54:47.6115648Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6115919Z               "line": 444
2026-08-28T09:54:47.6116179Z             }
2026-08-28T09:54:47.6116430Z           ]
2026-08-28T09:54:47.6116683Z         }
2026-08-28T09:54:47.6116936Z       }
2026-08-28T09:54:47.6117188Z     },
2026-08-28T09:54:47.6117441Z     {
2026-08-28T09:54:47.6117760Z       "id": "REQ-PAIR-NTP-LOUD-FAIL",
2026-08-28T09:54:47.6124182Z       "title": "W1/D2 (JOIN-TRUTH): total NTP failure (no server on any family answered) is LOUD, not silent — a node running the ceremony on its raw skewed system clock must be visible. ROOT: current_offset_secs (ntp.rs) does `query_offset_secs().unwrap_or(0)` and eprintln's ONLY on a nonzero success, so an all-servers-unreachable refresh is indistinguishable from 'clock agrees'. Fix: log the TRANSITION into all-servers-failed once per refresh (suggested `NTP_TOTP_UNCORRECTED: all NTP servers unreachable — ceremony clock = raw system clock`) and the recovery transition back to corrected; the OFFSET_TTL already bounds refresh cadence so no per-call spam. Fallback behavior (offset 0 → system clock) is UNCHANGED — this adds observability only.",
2026-08-28T09:54:47.6124585Z       "requiredStages": [
2026-08-28T09:54:47.6124842Z         "impl",
2026-08-28T09:54:47.6125100Z         "unit"
2026-08-28T09:54:47.6125354Z       ],
2026-08-28T09:54:47.6125648Z       "stages": {
2026-08-28T09:54:47.6125903Z         "doc": {
2026-08-28T09:54:47.6126184Z           "complete": false,
2026-08-28T09:54:47.6126455Z           "evidence": []
2026-08-28T09:54:47.6126702Z         },
2026-08-28T09:54:47.6126966Z         "impl": {
2026-08-28T09:54:47.6127244Z           "complete": true,
2026-08-28T09:54:47.6127529Z           "evidence": [
2026-08-28T09:54:47.6127848Z             {
2026-08-28T09:54:47.6128249Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6128521Z               "line": 138
2026-08-28T09:54:47.6128779Z             },
2026-08-28T09:54:47.6129127Z             {
2026-08-28T09:54:47.6129517Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6129803Z               "line": 214
2026-08-28T09:54:47.6130060Z             }
2026-08-28T09:54:47.6130317Z           ]
2026-08-28T09:54:47.6130574Z         },
2026-08-28T09:54:47.6130842Z         "int": {
2026-08-28T09:54:47.6131123Z           "complete": false,
2026-08-28T09:54:47.6131405Z           "evidence": []
2026-08-28T09:54:47.6131663Z         },
2026-08-28T09:54:47.6131918Z         "unit": {
2026-08-28T09:54:47.6132207Z           "complete": true,
2026-08-28T09:54:47.6132473Z           "evidence": [
2026-08-28T09:54:47.6132727Z             {
2026-08-28T09:54:47.6133117Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6133394Z               "line": 458
2026-08-28T09:54:47.6133652Z             }
2026-08-28T09:54:47.6133901Z           ]
2026-08-28T09:54:47.6134153Z         }
2026-08-28T09:54:47.6134410Z       }
2026-08-28T09:54:47.6134657Z     },
2026-08-28T09:54:47.6134904Z     {
2026-08-28T09:54:47.6135237Z       "id": "REQ-PAIR-NTP-MULTIHOME",
2026-08-28T09:54:47.6143119Z       "title": "W1/D1 (JOIN-TRUTH): the ceremony NTP query reaches a server on EITHER IP family — `query_unix_secs` (ntp.rs) must iterate every address `to_socket_addrs()` resolves (not just the first) and bind a socket of the matching family per candidate (IPv4 addr → bind 0.0.0.0:0; IPv6 addr → bind [::]:0), first successful answer wins. ROOT (proven 3/3-FAIL via our exact code on enlyzeam): today `UdpSocket::bind((\"0.0.0.0\",0))` is v4-only and `send_to(&packet, server)` sends ONLY to the FIRST resolved addr — time.google.com resolves 4×AAAA before any A on a v6-first dual-stack box → the primary server is PERMANENTLY unreachable via our code (w32tm reaches it over v6), silently halving NTP redundancy (pool.ntp.org v4 carried everything; a DNS rotation making BOTH v6-first would zero it). Fix keeps the lazy-cache/TTL/fallback contract of REQ-PAIR-8 unchanged — only the socket/resolve leg changes.",
2026-08-28T09:54:47.6143536Z       "requiredStages": [
2026-08-28T09:54:47.6143864Z         "impl",
2026-08-28T09:54:47.6144122Z         "unit"
2026-08-28T09:54:47.6144388Z       ],
2026-08-28T09:54:47.6144650Z       "stages": {
2026-08-28T09:54:47.6144907Z         "doc": {
2026-08-28T09:54:47.6145194Z           "complete": false,
2026-08-28T09:54:47.6145643Z           "evidence": []
2026-08-28T09:54:47.6145896Z         },
2026-08-28T09:54:47.6146160Z         "impl": {
2026-08-28T09:54:47.6150534Z           "complete": true,
2026-08-28T09:54:47.6150847Z           "evidence": [
2026-08-28T09:54:47.6151103Z             {
2026-08-28T09:54:47.6151515Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6151801Z               "line": 262
2026-08-28T09:54:47.6152077Z             },
2026-08-28T09:54:47.6152334Z             {
2026-08-28T09:54:47.6152726Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6152996Z               "line": 276
2026-08-28T09:54:47.6153261Z             },
2026-08-28T09:54:47.6153514Z             {
2026-08-28T09:54:47.6153904Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6154295Z               "line": 284
2026-08-28T09:54:47.6154548Z             },
2026-08-28T09:54:47.6154805Z             {
2026-08-28T09:54:47.6155196Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6155472Z               "line": 302
2026-08-28T09:54:47.6155726Z             }
2026-08-28T09:54:47.6155987Z           ]
2026-08-28T09:54:47.6156237Z         },
2026-08-28T09:54:47.6157058Z         "int": {
2026-08-28T09:54:47.6157367Z           "complete": false,
2026-08-28T09:54:47.6157626Z           "evidence": []
2026-08-28T09:54:47.6157945Z         },
2026-08-28T09:54:47.6158203Z         "unit": {
2026-08-28T09:54:47.6158482Z           "complete": true,
2026-08-28T09:54:47.6158742Z           "evidence": [
2026-08-28T09:54:47.6159085Z             {
2026-08-28T09:54:47.6159472Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6159748Z               "line": 391
2026-08-28T09:54:47.6160005Z             },
2026-08-28T09:54:47.6160259Z             {
2026-08-28T09:54:47.6160639Z               "path": "crates/spt-net/src/net/pairing/ntp.rs",
2026-08-28T09:54:47.6160901Z               "line": 410
2026-08-28T09:54:47.6161170Z             }
2026-08-28T09:54:47.6161421Z           ]
2026-08-28T09:54:47.6161678Z         }
2026-08-28T09:54:47.6161935Z       }
2026-08-28T09:54:47.6162179Z     },
2026-08-28T09:54:47.6162432Z     {
2026-08-28T09:54:47.6162751Z       "id": "REQ-PEER-ABSENCE-VERDICT",
2026-08-28T09:54:47.6186547Z       "title": "Peer reachability has a THIRD verdict -- peers-absent, rendered `peers unreachable:` -- for the state where the failing peers are simply not there, distinct from healthy and from both degraded verdicts and never a synonym for either. The vocabulary had no way to say that machine is off: PRESENCE_DIAL_FAILED fires for any reason at all including the ordinary powered-down peer, so the word the operator read (degraded) pointed at THEIR OWN node. The discriminator is POSITIVE and INDEPENDENT, two conditions that must both hold and neither of which any peer SUCCESS can supply: every currently-failing target is a node the registry holds rows for and none of those rows is routable, AND last_registry_admit_ms is within the registry own silent-peer eviction window of the instant that offline set was sampled. Silence about a node is not evidence -- a node with no rows keeps the conservative verdict -- and stale gossip is memory rather than observation, so no fresh gossip means no basis to call anyone absent. The independence requirement is the load-bearing one: the tempting inference that a live peer proves this node egress and therefore acquits it of the other peers failures is one peer success testifying about a DIFFERENT peer failure, which is REQ-PEER-HEALTH-PARTIAL-DEGRADE (#41) outvoting logic wearing a new word; egress to X says nothing about the route to Y. The freshness gate is also what preserves the 2026-07-10 sequester fingerprint with no carve-out: a node that can reach nobody admits no inbound feed either, so its stamp goes stale and the verdict falls back to degraded on its own. SCOPE: it replaces a degraded verdict and only ever a degraded verdict -- unreachable with an empty failing set (so healthy is unreachable from it) and never replacing connecting (a round still working through its first dials has established nothing). Additive on the machine surface like degraded-partial before it, for the mirrored reason: an older reader meets an unfamiliar token rather than a degraded that blames the wrong machine. Gate: doc -- the ADR-0039 Decision 5 amendment naming the third word, both halves of the discriminator, the scope, and why the sequester survives; impl -- the verdict variant and its arm ordered ahead of both degraded arms, the registry per-node routability accessor whose three states keep unknown distinct from offline, the pump-side sample taken beside the admit stamp, and both render surfaces; unit -- a failing peer whose node the registry reports offline reads the new word and never healthy, ONE unaccounted failing peer holds the degraded-partial verdict (including a peer the registry merely knows nothing about), stale or never-admitted gossip forces the conservative read at the window boundary, and the arm never displaces connecting nor outlives a departed target.",
2026-08-28T09:54:47.6187073Z       "requiredStages": [
2026-08-28T09:54:47.6187326Z         "doc",
2026-08-28T09:54:47.6187586Z         "impl",
2026-08-28T09:54:47.6187832Z         "unit"
2026-08-28T09:54:47.6188085Z       ],
2026-08-28T09:54:47.6188343Z       "stages": {
2026-08-28T09:54:47.6188601Z         "doc": {
2026-08-28T09:54:47.6189043Z           "complete": true,
2026-08-28T09:54:47.6189315Z           "evidence": [
2026-08-28T09:54:47.6189569Z             {
2026-08-28T09:54:47.6190020Z               "path": "docs/adr/0039-peer-route-resolution-truth.md",
2026-08-28T09:54:47.6190290Z               "line": 85
2026-08-28T09:54:47.6190547Z             }
2026-08-28T09:54:47.6190808Z           ]
2026-08-28T09:54:47.6191061Z         },
2026-08-28T09:54:47.6191328Z         "impl": {
2026-08-28T09:54:47.6191619Z           "complete": true,
2026-08-28T09:54:47.6191891Z           "evidence": [
2026-08-28T09:54:47.6192149Z             {
2026-08-28T09:54:47.6192539Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6192812Z               "line": 39
2026-08-28T09:54:47.6193068Z             },
2026-08-28T09:54:47.6193320Z             {
2026-08-28T09:54:47.6193717Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6193997Z               "line": 113
2026-08-28T09:54:47.6194259Z             },
2026-08-28T09:54:47.6194513Z             {
2026-08-28T09:54:47.6194908Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6195174Z               "line": 120
2026-08-28T09:54:47.6195426Z             },
2026-08-28T09:54:47.6195673Z             {
2026-08-28T09:54:47.6196303Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6196651Z               "line": 210
2026-08-28T09:54:47.6196904Z             },
2026-08-28T09:54:47.6197155Z             {
2026-08-28T09:54:47.6197524Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6197780Z               "line": 254
2026-08-28T09:54:47.6198037Z             },
2026-08-28T09:54:47.6198298Z             {
2026-08-28T09:54:47.6198678Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6199030Z               "line": 322
2026-08-28T09:54:47.6199355Z             },
2026-08-28T09:54:47.6199613Z             {
2026-08-28T09:54:47.6200013Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6200290Z               "line": 448
2026-08-28T09:54:47.6200547Z             },
2026-08-28T09:54:47.6200799Z             {
2026-08-28T09:54:47.6201184Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6201450Z               "line": 456
2026-08-28T09:54:47.6202652Z             },
2026-08-28T09:54:47.6203229Z             {
2026-08-28T09:54:47.6203928Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6204806Z               "line": 508
2026-08-28T09:54:47.6205450Z             },
2026-08-28T09:54:47.6206005Z             {
2026-08-28T09:54:47.6206681Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6207540Z               "line": 722
2026-08-28T09:54:47.6208160Z             },
2026-08-28T09:54:47.6208721Z             {
2026-08-28T09:54:47.6209496Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6210379Z               "line": 1146
2026-08-28T09:54:47.6211009Z             },
2026-08-28T09:54:47.6211575Z             {
2026-08-28T09:54:47.6212249Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6213083Z               "line": 1163
2026-08-28T09:54:47.6213731Z             },
2026-08-28T09:54:47.6214289Z             {
2026-08-28T09:54:47.6215032Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.6216000Z               "line": 871
2026-08-28T09:54:47.6216631Z             },
2026-08-28T09:54:47.6217208Z             {
2026-08-28T09:54:47.6217875Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.6218725Z               "line": 326
2026-08-28T09:54:47.6219427Z             },
2026-08-28T09:54:47.6219985Z             {
2026-08-28T09:54:47.6220610Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6221425Z               "line": 8372
2026-08-28T09:54:47.6222079Z             },
2026-08-28T09:54:47.6222647Z             {
2026-08-28T09:54:47.6223324Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6224111Z               "line": 8434
2026-08-28T09:54:47.6224743Z             }
2026-08-28T09:54:47.6225306Z           ]
2026-08-28T09:54:47.6225845Z         },
2026-08-28T09:54:47.6226380Z         "int": {
2026-08-28T09:54:47.6226988Z           "complete": false,
2026-08-28T09:54:47.6227678Z           "evidence": []
2026-08-28T09:54:47.6228312Z         },
2026-08-28T09:54:47.6228865Z         "unit": {
2026-08-28T09:54:47.6229563Z           "complete": true,
2026-08-28T09:54:47.6230230Z           "evidence": [
2026-08-28T09:54:47.6230841Z             {
2026-08-28T09:54:47.6231542Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6232408Z               "line": 851
2026-08-28T09:54:47.6233039Z             },
2026-08-28T09:54:47.6233606Z             {
2026-08-28T09:54:47.6234303Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6235175Z               "line": 888
2026-08-28T09:54:47.6235799Z             },
2026-08-28T09:54:47.6236357Z             {
2026-08-28T09:54:47.6237053Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6237923Z               "line": 932
2026-08-28T09:54:47.6238548Z             },
2026-08-28T09:54:47.6239197Z             {
2026-08-28T09:54:47.6239959Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6240824Z               "line": 979
2026-08-28T09:54:47.6241444Z             },
2026-08-28T09:54:47.6242011Z             {
2026-08-28T09:54:47.6242670Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6243532Z               "line": 1961
2026-08-28T09:54:47.6244234Z             },
2026-08-28T09:54:47.6244811Z             {
2026-08-28T09:54:47.6245489Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.6246341Z               "line": 1199
2026-08-28T09:54:47.6247050Z             },
2026-08-28T09:54:47.6247608Z             {
2026-08-28T09:54:47.6248208Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6249075Z               "line": 34930
2026-08-28T09:54:47.6249699Z             }
2026-08-28T09:54:47.6250242Z           ]
2026-08-28T09:54:47.6250800Z         }
2026-08-28T09:54:47.6251336Z       }
2026-08-28T09:54:47.6251860Z     },
2026-08-28T09:54:47.6252399Z     {
2026-08-28T09:54:47.6253010Z       "id": "REQ-PEER-COUNT-TARGET-SCOPED",
2026-08-28T09:54:47.6271010Z       "title": "The rendered peer-reachability fraction counts ONE population at both ends: the live count is the intersection of the pump live connections with the CURRENT fan-out targets, re-derived whenever the targets move. The field specimen was 7/1 -- seven live peer connections over one remaining membership target -- because the numerator came from the connection cache (inserted on every PRESENCE_CONNECTED, is_target computed beside it and not gating the insert, removed only on PRESENCE_DISCONNECTED) while the denominator was roster-derived. Leaving a subnet disconnects NOBODY, so ex-members went on counting while the denominator followed the leave; the state therefore travels a targets change with no presence event anywhere near it, which is why the count cannot be maintained at the presence seam alone and must be re-derivable from a live-connection SET rather than stamped as a number. The fix is an INTERSECTION and explicitly not a teardown at leave: a peer can be justified by a second subnet, so dropping its connection would make the count right for the wrong reason and wrong again the moment the peer is re-justified. Connections to non-targets stay real and stay reported; they are simply not part of the answer to how many of the peers we are trying to reach are up. Consequence, in the honest direction: the sequester test narrows, since a live connection to a node we no longer fan out to used to hold the all-fail window shut while every actual target was failing. Distinguish from REQ-PEER-HEALTH-PARTIAL-DEGRADE, which owns WHICH VERDICT a mix of live and failing peers renders; this owns only the population the counts are taken over. Gate: impl -- the live-connection set on the snapshot, the derivation against targets, the re-derivation on set_targets, and the pump seam handing the whole conns key set rather than a length; unit -- a subnet leave re-derives the numerator with nobody disconnected and the connections still reported, a re-join restores it without a redial, a live non-target never enters the count nor renders green, and the rendered line reads 1/1 where it read 7/1.",
2026-08-28T09:54:47.6289373Z       "requiredStages": [
2026-08-28T09:54:47.6290022Z         "impl",
2026-08-28T09:54:47.6290609Z         "unit"
2026-08-28T09:54:47.6291181Z       ],
2026-08-28T09:54:47.6291735Z       "stages": {
2026-08-28T09:54:47.6292307Z         "doc": {
2026-08-28T09:54:47.6292919Z           "complete": true,
2026-08-28T09:54:47.6293596Z           "evidence": [
2026-08-28T09:54:47.6294216Z             {
2026-08-28T09:54:47.6295189Z               "path": "docs/adr/0039-peer-route-resolution-truth.md",
2026-08-28T09:54:47.6296138Z               "line": 119
2026-08-28T09:54:47.6296773Z             }
2026-08-28T09:54:47.6297330Z           ]
2026-08-28T09:54:47.6297879Z         },
2026-08-28T09:54:47.6298428Z         "impl": {
2026-08-28T09:54:47.6299104Z           "complete": true,
2026-08-28T09:54:47.6299847Z           "evidence": [
2026-08-28T09:54:47.6300467Z             {
2026-08-28T09:54:47.6301169Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6302037Z               "line": 53
2026-08-28T09:54:47.6302657Z             },
2026-08-28T09:54:47.6303225Z             {
2026-08-28T09:54:47.6303941Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6304810Z               "line": 71
2026-08-28T09:54:47.6305430Z             },
2026-08-28T09:54:47.6306050Z             {
2026-08-28T09:54:47.6306742Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6307662Z               "line": 260
2026-08-28T09:54:47.6308302Z             },
2026-08-28T09:54:47.6308864Z             {
2026-08-28T09:54:47.6309654Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6310522Z               "line": 276
2026-08-28T09:54:47.6311162Z             },
2026-08-28T09:54:47.6311719Z             {
2026-08-28T09:54:47.6312436Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6313303Z               "line": 295
2026-08-28T09:54:47.6313937Z             },
2026-08-28T09:54:47.6314506Z             {
2026-08-28T09:54:47.6315360Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6316262Z               "line": 312
2026-08-28T09:54:47.6316889Z             },
2026-08-28T09:54:47.6317453Z             {
2026-08-28T09:54:47.6318131Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6319085Z               "line": 343
2026-08-28T09:54:47.6319732Z             },
2026-08-28T09:54:47.6320318Z             {
2026-08-28T09:54:47.6321005Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6321863Z               "line": 354
2026-08-28T09:54:47.6322500Z             },
2026-08-28T09:54:47.6323062Z             {
2026-08-28T09:54:47.6323763Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6324628Z               "line": 399
2026-08-28T09:54:47.6325344Z             },
2026-08-28T09:54:47.6325902Z             {
2026-08-28T09:54:47.6326573Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6327425Z               "line": 629
2026-08-28T09:54:47.6328062Z             }
2026-08-28T09:54:47.6328610Z           ]
2026-08-28T09:54:47.6329235Z         },
2026-08-28T09:54:47.6329793Z         "int": {
2026-08-28T09:54:47.6330398Z           "complete": false,
2026-08-28T09:54:47.6331089Z           "evidence": []
2026-08-28T09:54:47.6331719Z         },
2026-08-28T09:54:47.6332268Z         "unit": {
2026-08-28T09:54:47.6332931Z           "complete": true,
2026-08-28T09:54:47.6333609Z           "evidence": [
2026-08-28T09:54:47.6334219Z             {
2026-08-28T09:54:47.6334920Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6335808Z               "line": 787
2026-08-28T09:54:47.6336433Z             },
2026-08-28T09:54:47.6337000Z             {
2026-08-28T09:54:47.6337697Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6338560Z               "line": 831
2026-08-28T09:54:47.6339266Z             },
2026-08-28T09:54:47.6339819Z             {
2026-08-28T09:54:47.6340434Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6341196Z               "line": 34965
2026-08-28T09:54:47.6341831Z             }
2026-08-28T09:54:47.6342383Z           ]
2026-08-28T09:54:47.6342936Z         }
2026-08-28T09:54:47.6343496Z       }
2026-08-28T09:54:47.6344082Z     },
2026-08-28T09:54:47.6344630Z     {
2026-08-28T09:54:47.6345260Z       "id": "REQ-PEER-HEALTH-PARTIAL-DEGRADE",
2026-08-28T09:54:47.6360948Z       "title": "WAN-TRUTH #41 leg 3: a partial peer outage renders its own verdict (degraded-partial) instead of healthy. The field shape: 2 of 7 peers live and the other 5 failing for days, reported green, because the green test was at-least-one-live-connection and any single dial success also closed the only incident window there was. INSTRUMENT SOUNDNESS is the governing principle and the reason this is a requirement rather than a nicety -- the monitor green must not be producible by the fault it watches, and persistent per-peer dial failure was exactly such a producer. Two changes carry it: the failing set is consulted BEFORE the live count so green requires that nothing is failing rather than that something works, and an ANY-fail window spans the all-fail one so a single peer reconnecting narrows the verdict without erasing the incident measured age. The full-sequester verdict, its window, and the stage attribution are unchanged; this is additive on the machine surface, and an older reader meeting an unfamiliar token is the intended failure mode, since healthy is precisely what it used to be told. Distinguish from REQ-PUMP-STAGE-TRUTH (same ADR-0039 Decision 5 surface): that owns the TOTAL-failure fingerprint and the per-stage attribution, this owns only the partial-failure verdict and the window that survives one peer recovery. Gate: impl -- the verdict variant, the any-fail window recomputed with the all-fail one, the ordering change, and both render surfaces (human line and machine token); unit -- some-failing-while-others-live renders the partial verdict and never healthy, green requires progress on EVERY target, one peer success does not restart the incident clock, and the total-failure fingerprint still renders the unchanged full verdict.",
2026-08-28T09:54:47.6376826Z       "requiredStages": [
2026-08-28T09:54:47.6377475Z         "impl",
2026-08-28T09:54:47.6378053Z         "unit"
2026-08-28T09:54:47.6378639Z       ],
2026-08-28T09:54:47.6379283Z       "stages": {
2026-08-28T09:54:47.6379865Z         "doc": {
2026-08-28T09:54:47.6380467Z           "complete": false,
2026-08-28T09:54:47.6381148Z           "evidence": []
2026-08-28T09:54:47.6381778Z         },
2026-08-28T09:54:47.6382331Z         "impl": {
2026-08-28T09:54:47.6382937Z           "complete": true,
2026-08-28T09:54:47.6383600Z           "evidence": [
2026-08-28T09:54:47.6384205Z             {
2026-08-28T09:54:47.6385006Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6385889Z               "line": 16
2026-08-28T09:54:47.6386513Z             },
2026-08-28T09:54:47.6387081Z             {
2026-08-28T09:54:47.6387767Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6388647Z               "line": 91
2026-08-28T09:54:47.6389353Z             },
2026-08-28T09:54:47.6389925Z             {
2026-08-28T09:54:47.6390611Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6391481Z               "line": 160
2026-08-28T09:54:47.6392186Z             },
2026-08-28T09:54:47.6392740Z             {
2026-08-28T09:54:47.6393417Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6394278Z               "line": 275
2026-08-28T09:54:47.6394907Z             },
2026-08-28T09:54:47.6395465Z             {
2026-08-28T09:54:47.6396149Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6397021Z               "line": 398
2026-08-28T09:54:47.6397651Z             },
2026-08-28T09:54:47.6398215Z             {
2026-08-28T09:54:47.6398908Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6399865Z               "line": 447
2026-08-28T09:54:47.6400490Z             },
2026-08-28T09:54:47.6401048Z             {
2026-08-28T09:54:47.6401683Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6402475Z               "line": 8433
2026-08-28T09:54:47.6403104Z             }
2026-08-28T09:54:47.6403667Z           ]
2026-08-28T09:54:47.6404208Z         },
2026-08-28T09:54:47.6404767Z         "int": {
2026-08-28T09:54:47.6405377Z           "complete": false,
2026-08-28T09:54:47.6406059Z           "evidence": []
2026-08-28T09:54:47.6406680Z         },
2026-08-28T09:54:47.6407229Z         "unit": {
2026-08-28T09:54:47.6407830Z           "complete": true,
2026-08-28T09:54:47.6408503Z           "evidence": [
2026-08-28T09:54:47.6409320Z             {
2026-08-28T09:54:47.6410024Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6410892Z               "line": 625
2026-08-28T09:54:47.6411526Z             },
2026-08-28T09:54:47.6412090Z             {
2026-08-28T09:54:47.6412776Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6413635Z               "line": 685
2026-08-28T09:54:47.6414265Z             },
2026-08-28T09:54:47.6414836Z             {
2026-08-28T09:54:47.6415518Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.6416444Z               "line": 756
2026-08-28T09:54:47.6417100Z             }
2026-08-28T09:54:47.6417660Z           ]
2026-08-28T09:54:47.6418208Z         }
2026-08-28T09:54:47.6418748Z       }
2026-08-28T09:54:47.6419368Z     },
2026-08-28T09:54:47.6419904Z     {
2026-08-28T09:54:47.6420512Z       "id": "REQ-PEER-PUMP-CHURN-STALL",
2026-08-28T09:54:47.6427730Z       "title": "B5 (F028, perri F-a; DEFECT daemon, OBSERVED-ONCE, HIGH): the peer pump STALLS under rapid rc attach/EOF-detach/--take churn. Fresh 0.22.0 daemon ~10min after restart, during rapid rc cycling: `peer pump: STALLED (last tick 122s)`; while stalled `spt rc --view` -> `RC_FAIL: attach request: brain IPC read deadline elapsed` (repeatable) and controlled-clear stopped propagating. Daemon restart recovered + endpoints auto-revived. Prior class: REQ-HAZARD-PUMP-IPC-DEADLINE (reader-thread+channel carrier), REQ-broker-QUIC-deadline (bounded_block_on) — something in the rc-churn path can still wedge the pump tick. perri holds exact timestamps + a repro candidate (rapid attach/detach/take against one endpoint) — REQUEST before RCA. See triage B5.",
2026-08-28T09:54:47.6434636Z       "requiredStages": [],
2026-08-28T09:54:47.6435319Z       "stages": {
2026-08-28T09:54:47.6435903Z         "doc": {
2026-08-28T09:54:47.6436495Z           "complete": false,
2026-08-28T09:54:47.6437171Z           "evidence": []
2026-08-28T09:54:47.6437806Z         },
2026-08-28T09:54:47.6438361Z         "impl": {
2026-08-28T09:54:47.6439138Z           "complete": false,
2026-08-28T09:54:47.6439825Z           "evidence": []
2026-08-28T09:54:47.6440446Z         },
2026-08-28T09:54:47.6440996Z         "int": {
2026-08-28T09:54:47.6441599Z           "complete": false,
2026-08-28T09:54:47.6442266Z           "evidence": []
2026-08-28T09:54:47.6442901Z         },
2026-08-28T09:54:47.6443450Z         "unit": {
2026-08-28T09:54:47.6444096Z           "complete": false,
2026-08-28T09:54:47.6444777Z           "evidence": []
2026-08-28T09:54:47.6445421Z         }
2026-08-28T09:54:47.6445960Z       }
2026-08-28T09:54:47.6446502Z     },
2026-08-28T09:54:47.6447156Z     {
2026-08-28T09:54:47.6447741Z       "id": "REQ-PEER-ROUTE-CHAIN",
2026-08-28T09:54:47.6460340Z       "title": "MESH-RECOVERY W1 (ADR-0039, RCA wave 1): dial-address resolution is the ROUTE CHAIN — exact peer-cache entry, then VALIDATED RosterEntry.address (address.id must match the peer key; a poison row never becomes a route), then id-only discovery — always fully consulted in order (no failure-count heuristics gating legs; rotation machinery REJECTED). Retention is NONDESTRUCTIVE: PRESENCE_DIAL_FAILED demotes the cached route to suspect (skipped in favor of the roster leg while suspect, superseded by any validated fresher address from connect write-back or reconcile), never deletes a sole route; removal only via validated-fresher replacement or roster tombstone. Validated roster addresses RECONCILE into the cache at daemon startup and on roster merge (beyond gapfill's fill-only: validated-fresher replaces failed/suspect rows) — recovery is connection-independent. Amends REQ-CONV-1's drop-on-fail mechanism; peeraddrs.rs/pump doc-comment truth rides the same change. Gate: impl — chain + demote + reconcile; unit — chain order incl. id-mismatch roster row resolves nothing + suspect row survives N failures with no replacement + reconcile replaces suspect with validated-fresher; int — rides REQ-HAZARD-MESH-BOOTSTRAP-TRAP D-legs; doc — ADR-0039 + CONTEXT peer-route chain entry. Kin REQ-PEERADDR-INVARIANT, REQ-CONV-1.",
2026-08-28T09:54:47.6472700Z       "requiredStages": [
2026-08-28T09:54:47.6473366Z         "doc",
2026-08-28T09:54:47.6473933Z         "impl",
2026-08-28T09:54:47.6474500Z         "unit",
2026-08-28T09:54:47.6475224Z         "int"
2026-08-28T09:54:47.6475794Z       ],
2026-08-28T09:54:47.6476333Z       "stages": {
2026-08-28T09:54:47.6476916Z         "doc": {
2026-08-28T09:54:47.6477507Z           "complete": true,
2026-08-28T09:54:47.6478182Z           "evidence": [
2026-08-28T09:54:47.6478889Z             {
2026-08-28T09:54:47.6479737Z               "path": "docs/adr/0039-peer-route-resolution-truth.md",
2026-08-28T09:54:47.6480672Z               "line": 45
2026-08-28T09:54:47.6481278Z             }
2026-08-28T09:54:47.6481822Z           ]
2026-08-28T09:54:47.6487026Z         },
2026-08-28T09:54:47.6487637Z         "impl": {
2026-08-28T09:54:47.6488242Z           "complete": true,
2026-08-28T09:54:47.6489038Z           "evidence": [
2026-08-28T09:54:47.6489663Z             {
2026-08-28T09:54:47.6490346Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6491199Z               "line": 1094
2026-08-28T09:54:47.6491838Z             },
2026-08-28T09:54:47.6492396Z             {
2026-08-28T09:54:47.6493068Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6493911Z               "line": 1223
2026-08-28T09:54:47.6494554Z             },
2026-08-28T09:54:47.6495101Z             {
2026-08-28T09:54:47.6495775Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6496629Z               "line": 1485
2026-08-28T09:54:47.6497262Z             },
2026-08-28T09:54:47.6497820Z             {
2026-08-28T09:54:47.6498507Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6499432Z               "line": 1518
2026-08-28T09:54:47.6500071Z             },
2026-08-28T09:54:47.6500634Z             {
2026-08-28T09:54:47.6501325Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.6502318Z               "line": 999
2026-08-28T09:54:47.6502966Z             },
2026-08-28T09:54:47.6503530Z             {
2026-08-28T09:54:47.6504192Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6505041Z               "line": 117
2026-08-28T09:54:47.6505671Z             },
2026-08-28T09:54:47.6506234Z             {
2026-08-28T09:54:47.6506896Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6507757Z               "line": 163
2026-08-28T09:54:47.6508390Z             },
2026-08-28T09:54:47.6509029Z             {
2026-08-28T09:54:47.6509777Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6510626Z               "line": 194
2026-08-28T09:54:47.6511241Z             }
2026-08-28T09:54:47.6511800Z           ]
2026-08-28T09:54:47.6512343Z         },
2026-08-28T09:54:47.6512887Z         "int": {
2026-08-28T09:54:47.6513488Z           "complete": true,
2026-08-28T09:54:47.6514160Z           "evidence": [
2026-08-28T09:54:47.6514780Z             {
2026-08-28T09:54:47.6515478Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:47.6516365Z               "line": 227
2026-08-28T09:54:47.6517004Z             },
2026-08-28T09:54:47.6517561Z             {
2026-08-28T09:54:47.6518246Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:47.6519204Z               "line": 312
2026-08-28T09:54:47.6519829Z             }
2026-08-28T09:54:47.6520389Z           ]
2026-08-28T09:54:47.6520942Z         },
2026-08-28T09:54:47.6521491Z         "unit": {
2026-08-28T09:54:47.6522093Z           "complete": true,
2026-08-28T09:54:47.6522762Z           "evidence": [
2026-08-28T09:54:47.6523381Z             {
2026-08-28T09:54:47.6524063Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6524917Z               "line": 2304
2026-08-28T09:54:47.6525578Z             },
2026-08-28T09:54:47.6526206Z             {
2026-08-28T09:54:47.6526869Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6527731Z               "line": 2649
2026-08-28T09:54:47.6528347Z             },
2026-08-28T09:54:47.6528906Z             {
2026-08-28T09:54:47.6529668Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.6530526Z               "line": 1386
2026-08-28T09:54:47.6531165Z             },
2026-08-28T09:54:47.6531718Z             {
2026-08-28T09:54:47.6532385Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6533295Z               "line": 275
2026-08-28T09:54:47.6533927Z             },
2026-08-28T09:54:47.6534490Z             {
2026-08-28T09:54:47.6535153Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6536143Z               "line": 327
2026-08-28T09:54:47.6536785Z             }
2026-08-28T09:54:47.6537332Z           ]
2026-08-28T09:54:47.6537881Z         }
2026-08-28T09:54:47.6538425Z       }
2026-08-28T09:54:47.6539041Z     },
2026-08-28T09:54:47.6539565Z     {
2026-08-28T09:54:47.6540166Z       "id": "REQ-PEERADDR-INVARIANT",
2026-08-28T09:54:47.6549659Z       "title": "MESH-RECOVERY W1 (ADR-0039, RCA wave 2): the peer-addrs cache INVARIANT — outer peer key == address.id — is ENFORCED on load and on write: invalid rows are repaired from the current roster when possible, rejected (dropped loudly) otherwise; never silently kept, never used as a route. MIGRATION = rebuild invalid rows from roster on first post-upgrade load; bare-deleting peer-addrs.json is REJECTED (cold recovery depends on the id-only path staying BEHIND warm routes — nuking every warm route trades one trap for another). gapfill_peeraddrs and PeerAddrStore::put stop accepting mismatched mappings (the live 5ff…-outer poison-row class on both incident nodes). Absent/corrupt-degrades-empty behavior untouched. Gate: impl — load/write enforcement + repair + migration; unit — mismatch rejected on put, repaired-or-dropped on load, valid rows untouched by migration, gapfill refuses a mismatched roster entry; doc — ADR-0039. Kin REQ-PEER-ROUTE-CHAIN, REQ-MESH-2 (gapfill), REQ-CONV-1.",
2026-08-28T09:54:47.6558448Z       "requiredStages": [
2026-08-28T09:54:47.6559193Z         "doc",
2026-08-28T09:54:47.6559763Z         "impl",
2026-08-28T09:54:47.6560342Z         "unit"
2026-08-28T09:54:47.6560910Z       ],
2026-08-28T09:54:47.6561459Z       "stages": {
2026-08-28T09:54:47.6562031Z         "doc": {
2026-08-28T09:54:47.6562640Z           "complete": true,
2026-08-28T09:54:47.6563298Z           "evidence": [
2026-08-28T09:54:47.6563928Z             {
2026-08-28T09:54:47.6564676Z               "path": "docs/adr/0039-peer-route-resolution-truth.md",
2026-08-28T09:54:47.6565684Z               "line": 46
2026-08-28T09:54:47.6566299Z             }
2026-08-28T09:54:47.6566871Z           ]
2026-08-28T09:54:47.6567425Z         },
2026-08-28T09:54:47.6567983Z         "impl": {
2026-08-28T09:54:47.6568575Z           "complete": true,
2026-08-28T09:54:47.6569333Z           "evidence": [
2026-08-28T09:54:47.6569938Z             {
2026-08-28T09:54:47.6570635Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6571494Z               "line": 1486
2026-08-28T09:54:47.6572114Z             },
2026-08-28T09:54:47.6572696Z             {
2026-08-28T09:54:47.6573367Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.6574254Z               "line": 1000
2026-08-28T09:54:47.6574898Z             },
2026-08-28T09:54:47.6575454Z             {
2026-08-28T09:54:47.6576134Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6576968Z               "line": 54
2026-08-28T09:54:47.6577588Z             },
2026-08-28T09:54:47.6578146Z             {
2026-08-28T09:54:47.6578792Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6579726Z               "line": 118
2026-08-28T09:54:47.6580356Z             },
2026-08-28T09:54:47.6580926Z             {
2026-08-28T09:54:47.6581711Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6582584Z               "line": 141
2026-08-28T09:54:47.6583242Z             },
2026-08-28T09:54:47.6583832Z             {
2026-08-28T09:54:47.6584490Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.6585310Z               "line": 211
2026-08-28T09:54:47.6585929Z             }
2026-08-28T09:54:47.6586489Z           ]
2026-08-28T09:54:47.6587038Z         },
2026-08-28T09:54:47.6587605Z         "int": {
2026-08-28T09:54:47.6588225Z           "complete": true,
2026-08-28T09:54:47.6589075Z           "evidence": [
2026-08-28T09:54:47.6589695Z             {
2026-08-28T09:54:47.6590424Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:47.6591301Z               "line": 312
2026-08-28T09:54:47.6591928Z             }
2026-08-28T09:54:47.6592500Z           ]
2026-08-28T09:54:47.6593043Z         },
2026-08-28T09:54:47.6593597Z         "unit": {
2026-08-28T09:54:47.6594210Z           "complete": true,
2026-08-28T09:54:47.6594877Z           "evidence": [
2026-08-28T09:54:47.6595498Z             {
2026-08-28T09:54:47.6596179Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.6597017Z               "line": 2654
2026-08-28T09:54:47.6597650Z             },
2026-08-28T09:54:47.6598218Z             {
2026-08-28T09:54:47.6598895Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.6599826Z               "line": 1445
2026-08-28T09:54:47.6600484Z             },
2026-08-28T09:54:47.6601042Z             {
2026-08-28T09:54:47.6601715Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6602669Z               "line": 260
2026-08-28T09:54:47.6603337Z             },
2026-08-28T09:54:47.6603885Z             {
2026-08-28T09:54:47.6604548Z               "path": "crates/spt-store/src/peeraddrs.rs",
2026-08-28T09:54:47.6605391Z               "line": 311
2026-08-28T09:54:47.6606025Z             },
2026-08-28T09:54:47.6606593Z             {
2026-08-28T09:54:47.6607201Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.6608101Z               "line": 2186
2026-08-28T09:54:47.6608740Z             }
2026-08-28T09:54:47.6609389Z           ]
2026-08-28T09:54:47.6609940Z         }
2026-08-28T09:54:47.6610477Z       }
2026-08-28T09:54:47.6611011Z     },
2026-08-28T09:54:47.6611544Z     {
2026-08-28T09:54:47.6612164Z       "id": "REQ-PERCH-GC-REFUSAL-REPORT",
2026-08-28T09:54:47.6624876Z       "title": "The perch GC is REPORT-ONLY BY DEFAULT and every refusal is LOUD, distinct and per-path (releases#109, doyle-ruled 2026-08-04 — 3.4's own doctrine transplanted: loudness, not a self-heal, is what keeps a PERMANENT refusal from being a silent one). Bare `spt endpoint gc` classifies every perch directory and deletes NOTHING; `--reap` removes exactly the ruled population. There is deliberately NO `--dry-run`: when the default deletes nothing, a dry-run flag is a synonym that implies the default is dangerous. The classification pass completes BEFORE any removal, so the census prints IDENTICALLY with and without `--reap` (same subjects, same tokens, same order) and the two runs compare line for line — a bare run is a faithful preview. Each refused row names its own token (RESIDUE-WITH-SPOOL, RESIDUE-EMPTY, OCCUPIED-RECORD, OCCUPIED-CORRUPT-RECORD, OCCUPIED-UNREADABLE-RECORD, OCCUPIED-UNREADABLE-DIR, OCCUPIED-REPARSE-POINT, OCCUPIED-WRITE-IN-FLIGHT, OCCUPIED-CHILD-HELD) rather than one lumped 'skipped', and each PERMANENTLY-refused residue row carries the manual remedy that is the operator's only remaining handle. A removal that fails is reported by path with its error and exits non-zero; an unreadable owlery root exits non-zero having classified and removed nothing. The report is the evidence layer the daemon-fired sweep (releases#158) must earn its automation from.",
2026-08-28T09:54:47.6636751Z       "requiredStages": [
2026-08-28T09:54:47.6637400Z         "doc",
2026-08-28T09:54:47.6637963Z         "impl",
2026-08-28T09:54:47.6638620Z         "unit"
2026-08-28T09:54:47.6639276Z       ],
2026-08-28T09:54:47.6639848Z       "stages": {
2026-08-28T09:54:47.6640420Z         "doc": {
2026-08-28T09:54:47.6641021Z           "complete": true,
2026-08-28T09:54:47.6641701Z           "evidence": [
2026-08-28T09:54:47.6642328Z             {
2026-08-28T09:54:47.6642924Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.6643669Z               "line": 239
2026-08-28T09:54:47.6644340Z             }
2026-08-28T09:54:47.6644895Z           ]
2026-08-28T09:54:47.6645438Z         },
2026-08-28T09:54:47.6645987Z         "impl": {
2026-08-28T09:54:47.6646649Z           "complete": true,
2026-08-28T09:54:47.6647321Z           "evidence": [
2026-08-28T09:54:47.6647955Z             {
2026-08-28T09:54:47.6648632Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:47.6649554Z               "line": 170
2026-08-28T09:54:47.6650165Z             },
2026-08-28T09:54:47.6650742Z             {
2026-08-28T09:54:47.6651409Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6652242Z               "line": 281
2026-08-28T09:54:47.6652942Z             },
2026-08-28T09:54:47.6653499Z             {
2026-08-28T09:54:47.6654123Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6654918Z               "line": 671
2026-08-28T09:54:47.6655528Z             },
2026-08-28T09:54:47.6656090Z             {
2026-08-28T09:54:47.6656705Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6657473Z               "line": 24259
2026-08-28T09:54:47.6658129Z             },
2026-08-28T09:54:47.6658683Z             {
2026-08-28T09:54:47.6659370Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6660148Z               "line": 24318
2026-08-28T09:54:47.6660781Z             }
2026-08-28T09:54:47.6661345Z           ]
2026-08-28T09:54:47.6661894Z         },
2026-08-28T09:54:47.6662441Z         "int": {
2026-08-28T09:54:47.6663034Z           "complete": false,
2026-08-28T09:54:47.6663706Z           "evidence": []
2026-08-28T09:54:47.6664331Z         },
2026-08-28T09:54:47.6664912Z         "unit": {
2026-08-28T09:54:47.6665516Z           "complete": true,
2026-08-28T09:54:47.6666183Z           "evidence": [
2026-08-28T09:54:47.6666793Z             {
2026-08-28T09:54:47.6667446Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6668284Z               "line": 915
2026-08-28T09:54:47.6668924Z             },
2026-08-28T09:54:47.6669582Z             {
2026-08-28T09:54:47.6670255Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6671094Z               "line": 932
2026-08-28T09:54:47.6671709Z             },
2026-08-28T09:54:47.6672348Z             {
2026-08-28T09:54:47.6673021Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6673852Z               "line": 966
2026-08-28T09:54:47.6674472Z             },
2026-08-28T09:54:47.6675035Z             {
2026-08-28T09:54:47.6675707Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6676615Z               "line": 993
2026-08-28T09:54:47.6677249Z             },
2026-08-28T09:54:47.6677810Z             {
2026-08-28T09:54:47.6678426Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6679289Z               "line": 24395
2026-08-28T09:54:47.6679936Z             }
2026-08-28T09:54:47.6680486Z           ]
2026-08-28T09:54:47.6681036Z         }
2026-08-28T09:54:47.6681287Z       }
2026-08-28T09:54:47.6681545Z     },
2026-08-28T09:54:47.6681798Z     {
2026-08-28T09:54:47.6682155Z       "id": "REQ-PERCH-GC-RESIDUE-PREDICATE",
2026-08-28T09:54:47.6704492Z       "title": "A perch directory is RESIDUE only on a POSITIVE record-absence predicate, and the store that answers it is the owlery tree itself (3.4 extension; releases#109, doyle-ruled 2026-08-04). There is NO independent endpoint-existence store on a node: `spt::roster::enumerate`, the daemon's `projwriter::enumerate_perches` and `perch::list_self_perch_ids_checked` all derive the endpoint set from `read_dir(owlery)`, and a dir with no `info.json` is not a perch — so THE PERCH DIRECTORY PLUS ITS PARSEABLE RECORD IS THE ENDPOINT RECORD. The local registry is NOT that store and must never be asked: KNOWN-HAZARDS 4.3 has `clean_stale_entries` DELETE dead-pid rows and `unregister_address` fire on an ordinary stop, so registry-absence is the normal steady state of every OFFLINE endpoint (measured HFENDULEAM 2026-08-04: 6 of 14). PREDICATE: residue iff no `info.json` is present on ANY read attempt. Positive, present-tense, one read, and NEVER an age/mtime heuristic — a dormant endpoint, a suspended session and a long-idle live agent are indistinguishable from 'old' by mtime. Absent is the ONLY answer that authorizes deletion, so the read keeps NotFound distinct from every other I/O error: unreadable ⇒ occupied, corrupt (present, unparseable) ⇒ occupied (a destroyed record belongs to an endpoint that exists). REAP POPULATION IS NARROWER THAN RESIDUE: recordless AND spool-less AND non-empty AND no record-write in flight (`.info.lock` held ⇒ a bringup mid-create) AND every nested/shells child independently reapable (deepest-first; a recordless parent holding ANY non-reaped child is itself refused). A REFUSED DIRECTORY SHIELDS ITS WHOLE SUBTREE (doyle, ruled 2026-08-04): a descendant that would qualify on its own is reported SHIELDED-BY-REFUSED-PARENT and left alone, because refusing a directory must mean not modifying its CONTENTS either — carving a child out destroys part of what the refusal report just asked the operator to look at, and can move the parent's own classification on the next pass, and a sweep whose refusals are unstable across its own runs is untrustworthy. A recordless dir carrying a SPOOL is refused permanently — undeliverable-by-construction settles deliverability, not VALUE, and that spool is the only surviving copy of what was queued. An EMPTY dir is refused permanently — the mid-create race 3.4 protects exists here identically and no positive discriminator for 'not mid-create' exists for an empty dir. A reparse point anywhere in the subtree is refused. Store unavailable (`read_dir` on the root fails) ⇒ DO NOTHING and say so, reported distinctly from an empty owlery.",
2026-08-28T09:54:47.6705053Z       "requiredStages": [
2026-08-28T09:54:47.6705303Z         "doc",
2026-08-28T09:54:47.6705551Z         "impl",
2026-08-28T09:54:47.6705800Z         "unit"
2026-08-28T09:54:47.6706119Z       ],
2026-08-28T09:54:47.6706562Z       "stages": {
2026-08-28T09:54:47.6706920Z         "doc": {
2026-08-28T09:54:47.6707345Z           "complete": true,
2026-08-28T09:54:47.6707738Z           "evidence": [
2026-08-28T09:54:47.6708141Z             {
2026-08-28T09:54:47.6708537Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.6708929Z               "line": 129
2026-08-28T09:54:47.6709273Z             }
2026-08-28T09:54:47.6709530Z           ]
2026-08-28T09:54:47.6709777Z         },
2026-08-28T09:54:47.6710049Z         "impl": {
2026-08-28T09:54:47.6710329Z           "complete": true,
2026-08-28T09:54:47.6710677Z           "evidence": [
2026-08-28T09:54:47.6710945Z             {
2026-08-28T09:54:47.6711321Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6711598Z               "line": 280
2026-08-28T09:54:47.6711856Z             },
2026-08-28T09:54:47.6712109Z             {
2026-08-28T09:54:47.6712438Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6712712Z               "line": 24319
2026-08-28T09:54:47.6712967Z             }
2026-08-28T09:54:47.6713225Z           ]
2026-08-28T09:54:47.6713483Z         },
2026-08-28T09:54:47.6713741Z         "int": {
2026-08-28T09:54:47.6714037Z           "complete": false,
2026-08-28T09:54:47.6714317Z           "evidence": []
2026-08-28T09:54:47.6714579Z         },
2026-08-28T09:54:47.6714832Z         "unit": {
2026-08-28T09:54:47.6715118Z           "complete": true,
2026-08-28T09:54:47.6715381Z           "evidence": [
2026-08-28T09:54:47.6715637Z             {
2026-08-28T09:54:47.6716017Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6716288Z               "line": 623
2026-08-28T09:54:47.6716550Z             },
2026-08-28T09:54:47.6716812Z             {
2026-08-28T09:54:47.6717179Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6717451Z               "line": 692
2026-08-28T09:54:47.6717703Z             },
2026-08-28T09:54:47.6717967Z             {
2026-08-28T09:54:47.6718331Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6718602Z               "line": 721
2026-08-28T09:54:47.6718855Z             },
2026-08-28T09:54:47.6719269Z             {
2026-08-28T09:54:47.6719642Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6719917Z               "line": 735
2026-08-28T09:54:47.6720172Z             },
2026-08-28T09:54:47.6720424Z             {
2026-08-28T09:54:47.6720801Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6721066Z               "line": 754
2026-08-28T09:54:47.6721323Z             },
2026-08-28T09:54:47.6721585Z             {
2026-08-28T09:54:47.6722015Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6722291Z               "line": 792
2026-08-28T09:54:47.6722553Z             },
2026-08-28T09:54:47.6722810Z             {
2026-08-28T09:54:47.6723177Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6723452Z               "line": 818
2026-08-28T09:54:47.6723705Z             },
2026-08-28T09:54:47.6723962Z             {
2026-08-28T09:54:47.6724324Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6724602Z               "line": 862
2026-08-28T09:54:47.6724858Z             },
2026-08-28T09:54:47.6725115Z             {
2026-08-28T09:54:47.6725478Z               "path": "crates/spt-store/src/perchgc.rs",
2026-08-28T09:54:47.6725745Z               "line": 885
2026-08-28T09:54:47.6726007Z             }
2026-08-28T09:54:47.6726263Z           ]
2026-08-28T09:54:47.6726529Z         }
2026-08-28T09:54:47.6726920Z       }
2026-08-28T09:54:47.6727187Z     },
2026-08-28T09:54:47.6727449Z     {
2026-08-28T09:54:47.6727735Z       "id": "REQ-PICKER-1",
2026-08-28T09:54:47.6738209Z       "title": "The picker renders a FOUR-state endpoint status (extending the W2 online/offline duality): the list-item square AND a color-coded STATUS line at the top of the pick-existing right-side details both show — gray OFFLINE; green ONLINE (online + PTY-controllable spt-hosted, not controlled); amber 'ONLINE - HARNESS ONLY' (online but NOT broker-PTY-controllable = harness-hosted, no broker PTY seat — today mis-shows green); blue 'ONLINE + CONTROLLED' (online + driven_by.is_some()). Derived on EndpointRow from {offline | controllable | driven_by} with precedence offline→gray, else driven_by→blue, else !controllable→amber, else green (driven_by outranks harness-only; mutually exclusive in practice — a harness-only endpoint has no broker PTY to control). The controllable discriminator is a NEW InfoJson.controllable: Option<bool> (serde-default, N-1-safe), stamped at the establish seam — cmd_listen (harness-hosted relay, no broker PTY) → Some(false); cmd_bind live_agent (spt-hosted broker PTY) → Some(true); absent → not-controllable (amber) default (harness-hosted is the common mis-reported case; one bind self-corrects). Store-projection-only (no live daemon query — doyle ruling). (v0.10.0)",
2026-08-28T09:54:47.6738687Z       "requiredStages": [
2026-08-28T09:54:47.6739035Z         "impl",
2026-08-28T09:54:47.6739295Z         "unit"
2026-08-28T09:54:47.6739554Z       ],
2026-08-28T09:54:47.6739813Z       "stages": {
2026-08-28T09:54:47.6740090Z         "doc": {
2026-08-28T09:54:47.6740376Z           "complete": false,
2026-08-28T09:54:47.6740671Z           "evidence": []
2026-08-28T09:54:47.6740925Z         },
2026-08-28T09:54:47.6741191Z         "impl": {
2026-08-28T09:54:47.6741472Z           "complete": true,
2026-08-28T09:54:47.6741758Z           "evidence": [
2026-08-28T09:54:47.6742024Z             {
2026-08-28T09:54:47.6742382Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.6742687Z               "line": 689
2026-08-28T09:54:47.6742944Z             },
2026-08-28T09:54:47.6743207Z             {
2026-08-28T09:54:47.6743565Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6743847Z               "line": 654
2026-08-28T09:54:47.6744152Z             }
2026-08-28T09:54:47.6744417Z           ]
2026-08-28T09:54:47.6744676Z         },
2026-08-28T09:54:47.6744929Z         "int": {
2026-08-28T09:54:47.6745230Z           "complete": false,
2026-08-28T09:54:47.6745511Z           "evidence": []
2026-08-28T09:54:47.6745826Z         },
2026-08-28T09:54:47.6746089Z         "unit": {
2026-08-28T09:54:47.6746385Z           "complete": true,
2026-08-28T09:54:47.6746652Z           "evidence": [
2026-08-28T09:54:47.6746908Z             {
2026-08-28T09:54:47.6747264Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.6747529Z               "line": 1119
2026-08-28T09:54:47.6747791Z             },
2026-08-28T09:54:47.6748045Z             {
2026-08-28T09:54:47.6748454Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.6748726Z               "line": 1974
2026-08-28T09:54:47.6749064Z             },
2026-08-28T09:54:47.6749318Z             {
2026-08-28T09:54:47.6749675Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6749945Z               "line": 2113
2026-08-28T09:54:47.6750187Z             },
2026-08-28T09:54:47.6750443Z             {
2026-08-28T09:54:47.6750787Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6751064Z               "line": 919
2026-08-28T09:54:47.6751317Z             }
2026-08-28T09:54:47.6751579Z           ]
2026-08-28T09:54:47.6751833Z         }
2026-08-28T09:54:47.6752090Z       }
2026-08-28T09:54:47.6752342Z     },
2026-08-28T09:54:47.6752589Z     {
2026-08-28T09:54:47.6752881Z       "id": "REQ-PICKER-2",
2026-08-28T09:54:47.6758310Z       "title": "The picker's project-history loader reads the git-backed context store, not the bare working tree: data.rs project_history_for enumerates an endpoint's projects via the BranchStore branch set (the context store keeps per-project context in git branches — contextstore::project_branch(project_id), checked out to projects/<project>/<id>/ only on-demand) instead of raw std::fs::read_dir over the empty working tree (which returned empty for ALL rows incl wall-a — the operator bug). Ordered newest→oldest by branch commit recency; degrades to empty (informational pane), never fails. (v0.10.0)",
2026-08-28T09:54:47.6758644Z       "requiredStages": [
2026-08-28T09:54:47.6758896Z         "impl",
2026-08-28T09:54:47.6759311Z         "unit"
2026-08-28T09:54:47.6759563Z       ],
2026-08-28T09:54:47.6759822Z       "stages": {
2026-08-28T09:54:47.6760084Z         "doc": {
2026-08-28T09:54:47.6760372Z           "complete": false,
2026-08-28T09:54:47.6760637Z           "evidence": []
2026-08-28T09:54:47.6760895Z         },
2026-08-28T09:54:47.6761148Z         "impl": {
2026-08-28T09:54:47.6761491Z           "complete": true,
2026-08-28T09:54:47.6761768Z           "evidence": [
2026-08-28T09:54:47.6762025Z             {
2026-08-28T09:54:47.6762416Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.6762694Z               "line": 257
2026-08-28T09:54:47.6762951Z             }
2026-08-28T09:54:47.6763206Z           ]
2026-08-28T09:54:47.6763469Z         },
2026-08-28T09:54:47.6763727Z         "int": {
2026-08-28T09:54:47.6764008Z           "complete": false,
2026-08-28T09:54:47.6764280Z           "evidence": []
2026-08-28T09:54:47.6764536Z         },
2026-08-28T09:54:47.6764794Z         "unit": {
2026-08-28T09:54:47.6765089Z           "complete": true,
2026-08-28T09:54:47.6765366Z           "evidence": [
2026-08-28T09:54:47.6765618Z             {
2026-08-28T09:54:47.6766203Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.6766503Z               "line": 913
2026-08-28T09:54:47.6766764Z             }
2026-08-28T09:54:47.6767023Z           ]
2026-08-28T09:54:47.6767275Z         }
2026-08-28T09:54:47.6767524Z       }
2026-08-28T09:54:47.6767767Z     },
2026-08-28T09:54:47.6768019Z     {
2026-08-28T09:54:47.6768309Z       "id": "REQ-PICKER-3",
2026-08-28T09:54:47.6775527Z       "title": "A self-owned subnet row reconciles its status to the LIVE roster: a Subnet-category row whose endpoint_id overlaps a local (is_local) roster id is self-owned (this node hosts it), so its status square is OVERRIDDEN with the live roster status — the WAN registry snapshot (wansend::load_snapshots) is a periodically-advertised, independently-stale projection, while the local roster (p.alive) is ground truth for an endpoint this node hosts. One status square per endpoint (CONTEXT.md:348-350 — nothing licenses opposite squares for one endpoint across its Local vs Subnet listings). A reconcile pass in data.rs after the local_rows + subnet_rows gather; BOTH category listings are preserved (Local + Subnet are legitimately distinct views — you are in your own subnet), only the STATUS is unified. (v0.10.0)",
2026-08-28T09:54:47.6775997Z       "requiredStages": [
2026-08-28T09:54:47.6776257Z         "impl",
2026-08-28T09:54:47.6776520Z         "unit"
2026-08-28T09:54:47.6776772Z       ],
2026-08-28T09:54:47.6777048Z       "stages": {
2026-08-28T09:54:47.6777315Z         "doc": {
2026-08-28T09:54:47.6777601Z           "complete": false,
2026-08-28T09:54:47.6777878Z           "evidence": []
2026-08-28T09:54:47.6778136Z         },
2026-08-28T09:54:47.6778403Z         "impl": {
2026-08-28T09:54:47.6778681Z           "complete": true,
2026-08-28T09:54:47.6779064Z           "evidence": [
2026-08-28T09:54:47.6779320Z             {
2026-08-28T09:54:47.6784608Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.6784932Z               "line": 159
2026-08-28T09:54:47.6785223Z             }
2026-08-28T09:54:47.6785485Z           ]
2026-08-28T09:54:47.6785730Z         },
2026-08-28T09:54:47.6785991Z         "int": {
2026-08-28T09:54:47.6786291Z           "complete": false,
2026-08-28T09:54:47.6786562Z           "evidence": []
2026-08-28T09:54:47.6786822Z         },
2026-08-28T09:54:47.6787080Z         "unit": {
2026-08-28T09:54:47.6787361Z           "complete": true,
2026-08-28T09:54:47.6787638Z           "evidence": [
2026-08-28T09:54:47.6787894Z             {
2026-08-28T09:54:47.6788243Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.6788524Z               "line": 1003
2026-08-28T09:54:47.6788782Z             }
2026-08-28T09:54:47.6789158Z           ]
2026-08-28T09:54:47.6789429Z         }
2026-08-28T09:54:47.6789680Z       }
2026-08-28T09:54:47.6789938Z     },
2026-08-28T09:54:47.6790276Z     {
2026-08-28T09:54:47.6790572Z       "id": "REQ-PICKER-4",
2026-08-28T09:54:47.6796108Z       "title": "The picker's Subnet category renders the canonical node LABEL, not bare key-hex: a subnet row's node renders as 'LABEL (keyprefix…)' (e.g. 'HFENDULEAM (bcead52b…)') per CONTEXT.md:650 + Instance.node_label, NOT the raw node key-hex (SPT_DEV:14efb80cb… — a picker-only regression because resource_projection→ResourceRow drops node_label, so data.rs subnet_rows uses the raw row.node). Thread node_label into the picker subnet path (ResourceRow gains node_label, or subnet_rows looks it up via the registry's node_labels) and REUSE the one canonical render (format!(\"{l} ({}…)\", key_prefix) — cli.rs / wansend.rs), never a re-implementation. (v0.10.0)",
2026-08-28T09:54:47.6796527Z       "requiredStages": [
2026-08-28T09:54:47.6796794Z         "impl",
2026-08-28T09:54:47.6797051Z         "unit"
2026-08-28T09:54:47.6797312Z       ],
2026-08-28T09:54:47.6797583Z       "stages": {
2026-08-28T09:54:47.6797859Z         "doc": {
2026-08-28T09:54:47.6798149Z           "complete": false,
2026-08-28T09:54:47.6798426Z           "evidence": []
2026-08-28T09:54:47.6798683Z         },
2026-08-28T09:54:47.6799046Z         "impl": {
2026-08-28T09:54:47.6799332Z           "complete": true,
2026-08-28T09:54:47.6799603Z           "evidence": [
2026-08-28T09:54:47.6799876Z             {
2026-08-28T09:54:47.6800259Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.6800545Z               "line": 575
2026-08-28T09:54:47.6800808Z             },
2026-08-28T09:54:47.6801060Z             {
2026-08-28T09:54:47.6801404Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.6801670Z               "line": 140
2026-08-28T09:54:47.6801923Z             }
2026-08-28T09:54:47.6802170Z           ]
2026-08-28T09:54:47.6802424Z         },
2026-08-28T09:54:47.6802695Z         "int": {
2026-08-28T09:54:47.6803050Z           "complete": false,
2026-08-28T09:54:47.6803327Z           "evidence": []
2026-08-28T09:54:47.6803583Z         },
2026-08-28T09:54:47.6803846Z         "unit": {
2026-08-28T09:54:47.6804123Z           "complete": true,
2026-08-28T09:54:47.6804394Z           "evidence": [
2026-08-28T09:54:47.6804648Z             {
2026-08-28T09:54:47.6805019Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.6805287Z               "line": 1950
2026-08-28T09:54:47.6805542Z             },
2026-08-28T09:54:47.6805867Z             {
2026-08-28T09:54:47.6806206Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.6806482Z               "line": 1410
2026-08-28T09:54:47.6806734Z             }
2026-08-28T09:54:47.6806992Z           ]
2026-08-28T09:54:47.6807250Z         }
2026-08-28T09:54:47.6807503Z       }
2026-08-28T09:54:47.6807768Z     },
2026-08-28T09:54:47.6808014Z     {
2026-08-28T09:54:47.6808304Z       "id": "REQ-PICKER-5",
2026-08-28T09:54:47.6817238Z       "title": "`spt endpoint list` (bare/subnet view) renders an ALIGNED table with canonical node labels: cmd_endpoint_list prints subnet rows with `\\t` TAB separators (cli.rs:~1651-1662) so variable-width endpoint_ids snap fields to different tab-stops → a RAGGED status column (operator screenshot: X/help statuses misaligned vs rt-*/sptc-*/wall-a); and it calls the node renderer with no label → bare key-hex for every row (SAME ResourceRow-drops-node_label root as REQ-PICKER-4). FIX: max-width per-column padding (mirror render_node_rows' pad, pad by char count not byte len — '…' is multibyte) replacing the tabs, and render the node via the shared node_label_display now that ResourceRow carries node_label (REQ-PICKER-4). Extract a pure row-formatter seam so the alignment+label is unit-testable. ALSO: the bare list is the SUBNET view (a just-run LOCAL perch is invisible cross-subnet until the next advertise tick), so emit a `--local` hint line so a freshly-run endpoint isn't perceived as lost. (v0.10.0; operator-flagged + doyle dispatch 2026-06-17)",
2026-08-28T09:54:47.6817628Z       "requiredStages": [
2026-08-28T09:54:47.6817962Z         "impl",
2026-08-28T09:54:47.6818218Z         "unit"
2026-08-28T09:54:47.6818475Z       ],
2026-08-28T09:54:47.6818737Z       "stages": {
2026-08-28T09:54:47.6819066Z         "doc": {
2026-08-28T09:54:47.6819357Z           "complete": false,
2026-08-28T09:54:47.6819628Z           "evidence": []
2026-08-28T09:54:47.6819953Z         },
2026-08-28T09:54:47.6820214Z         "impl": {
2026-08-28T09:54:47.6820514Z           "complete": true,
2026-08-28T09:54:47.6820786Z           "evidence": [
2026-08-28T09:54:47.6821057Z             {
2026-08-28T09:54:47.6821379Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6821661Z               "line": 7154
2026-08-28T09:54:47.6821923Z             },
2026-08-28T09:54:47.6822180Z             {
2026-08-28T09:54:47.6822505Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6822776Z               "line": 7226
2026-08-28T09:54:47.6823038Z             }
2026-08-28T09:54:47.6823290Z           ]
2026-08-28T09:54:47.6823549Z         },
2026-08-28T09:54:47.6823795Z         "int": {
2026-08-28T09:54:47.6824089Z           "complete": false,
2026-08-28T09:54:47.6824364Z           "evidence": []
2026-08-28T09:54:47.6824618Z         },
2026-08-28T09:54:47.6824871Z         "unit": {
2026-08-28T09:54:47.6825152Z           "complete": true,
2026-08-28T09:54:47.6825430Z           "evidence": [
2026-08-28T09:54:47.6825810Z             {
2026-08-28T09:54:47.6826153Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6826421Z               "line": 26584
2026-08-28T09:54:47.6826677Z             },
2026-08-28T09:54:47.6826934Z             {
2026-08-28T09:54:47.6827248Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6827521Z               "line": 26937
2026-08-28T09:54:47.6827773Z             }
2026-08-28T09:54:47.6828027Z           ]
2026-08-28T09:54:47.6828285Z         }
2026-08-28T09:54:47.6828546Z       }
2026-08-28T09:54:47.6828873Z     },
2026-08-28T09:54:47.6829215Z     {
2026-08-28T09:54:47.6829582Z       "id": "REQ-PICKER-ADAPTER-DESCRIPTION",
2026-08-28T09:54:47.6833700Z       "title": "The Create-new adapter-CHOICE screen of `spt endpoint run`'s picker shows a right-hand Description panel (like the Pick-existing endpoint picker's two-pane) surfacing per-adapter detail: install date, last-updated, adapter TYPE / the endpoint types it hosts, and the adapter description — so the user can see WHAT each adapter is before choosing it (today the selector lists bare names). DEFERRED fast-follow to v0.12.0 (operator 2026-06-18). (post-v0.12.0)",
2026-08-28T09:54:47.6834082Z       "requiredStages": [],
2026-08-28T09:54:47.6834351Z       "stages": {
2026-08-28T09:54:47.6834610Z         "doc": {
2026-08-28T09:54:47.6834897Z           "complete": false,
2026-08-28T09:54:47.6835173Z           "evidence": []
2026-08-28T09:54:47.6835431Z         },
2026-08-28T09:54:47.6835684Z         "impl": {
2026-08-28T09:54:47.6835976Z           "complete": false,
2026-08-28T09:54:47.6836247Z           "evidence": []
2026-08-28T09:54:47.6836504Z         },
2026-08-28T09:54:47.6836746Z         "int": {
2026-08-28T09:54:47.6837047Z           "complete": false,
2026-08-28T09:54:47.6837333Z           "evidence": []
2026-08-28T09:54:47.6837586Z         },
2026-08-28T09:54:47.6837843Z         "unit": {
2026-08-28T09:54:47.6838133Z           "complete": false,
2026-08-28T09:54:47.6838424Z           "evidence": []
2026-08-28T09:54:47.6838682Z         }
2026-08-28T09:54:47.6838935Z       }
2026-08-28T09:54:47.6839268Z     },
2026-08-28T09:54:47.6839510Z     {
2026-08-28T09:54:47.6839814Z       "id": "REQ-PICKER-BACK-NAV",
2026-08-28T09:54:47.6847565Z       "title": "C-4 (REMOTE-TRUTH triage §C-4 #9): Backspace is a back() ALIAS across the picker — one keypress backs out one screen along the SAME reverse map Esc walks (model back(), complete for all screens incl. the C-3 ConfirmPurge), and from the kind layer it cancels the picker (Esc parity) — EXCEPT the two text-edit contexts, where Backspace stays CHAR-DELETE: CreateId entry (id_backspace) and the pick-list filter mode (filter_backspace). DELIBERATE: no empty-buffer fallthrough to back() in the text contexts — mixing delete and nav on one key invites miskeys mid-typing; Esc already backs out (the triage's optional extra, declined). Pure key routing in handle_key (picker/mod.rs) ahead of the per-screen arms; zero model change (the reverse map pre-existed). Red-first: Backspace on Confirm → PickExisting (pre-fix: dead key); on CreateId with a buffer → buffer shortens, screen unchanged; empty buffer → STILL no nav.",
2026-08-28T09:54:47.6848031Z       "requiredStages": [
2026-08-28T09:54:47.6848288Z         "impl",
2026-08-28T09:54:47.6848551Z         "unit"
2026-08-28T09:54:47.6848809Z       ],
2026-08-28T09:54:47.6849152Z       "stages": {
2026-08-28T09:54:47.6849415Z         "doc": {
2026-08-28T09:54:47.6849700Z           "complete": false,
2026-08-28T09:54:47.6849984Z           "evidence": []
2026-08-28T09:54:47.6850259Z         },
2026-08-28T09:54:47.6850521Z         "impl": {
2026-08-28T09:54:47.6850822Z           "complete": true,
2026-08-28T09:54:47.6851089Z           "evidence": [
2026-08-28T09:54:47.6851352Z             {
2026-08-28T09:54:47.6851695Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.6851977Z               "line": 246
2026-08-28T09:54:47.6852229Z             }
2026-08-28T09:54:47.6852500Z           ]
2026-08-28T09:54:47.6852767Z         },
2026-08-28T09:54:47.6853032Z         "int": {
2026-08-28T09:54:47.6853318Z           "complete": false,
2026-08-28T09:54:47.6853594Z           "evidence": []
2026-08-28T09:54:47.6853856Z         },
2026-08-28T09:54:47.6854108Z         "unit": {
2026-08-28T09:54:47.6854395Z           "complete": true,
2026-08-28T09:54:47.6854666Z           "evidence": [
2026-08-28T09:54:47.6854929Z             {
2026-08-28T09:54:47.6855268Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.6855543Z               "line": 693
2026-08-28T09:54:47.6855870Z             },
2026-08-28T09:54:47.6856127Z             {
2026-08-28T09:54:47.6856471Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.6856738Z               "line": 712
2026-08-28T09:54:47.6857004Z             }
2026-08-28T09:54:47.6857257Z           ]
2026-08-28T09:54:47.6857542Z         }
2026-08-28T09:54:47.6857797Z       }
2026-08-28T09:54:47.6858050Z     },
2026-08-28T09:54:47.6858309Z     {
2026-08-28T09:54:47.6858653Z       "id": "REQ-PICKER-CHANGE-ADAPTER-FLOW",
2026-08-28T09:54:47.6865898Z       "title": "B-2 (F029, operator; LARGEST item): `ConfirmOption::ChangeAdapter` wrongly routes into the CREATE flow (Screen::CreateAdapter → CreateId → CreateHome → START, reenter_create(true)) — it re-prompts id + home and then STARTS the endpoint. Required: prompt ONLY the harness-adapter pick, apply the change to the perch record (update info.json.adapter via the existing write seam; an `<adapter>:<profile>` pick stamps the full option, composing with A-4), then RETURN to the endpoint's Confirm menu — NO id prompt, NO home prompt, NO start. FIX: a return-to-Confirm mode on the adapter-pick screen (flag or dedicated Screen::ChangeAdapterPick) skipping CreateId/CreateHome + the launch outcome. Unit the flow-state transitions + the record write. Shared-seam: touches picker flow state — run the full picker cluster. See triage B-2.",
2026-08-28T09:54:47.6866224Z       "requiredStages": [
2026-08-28T09:54:47.6866492Z         "impl",
2026-08-28T09:54:47.6866759Z         "unit"
2026-08-28T09:54:47.6867021Z       ],
2026-08-28T09:54:47.6867269Z       "stages": {
2026-08-28T09:54:47.6867530Z         "doc": {
2026-08-28T09:54:47.6867813Z           "complete": false,
2026-08-28T09:54:47.6868089Z           "evidence": []
2026-08-28T09:54:47.6868338Z         },
2026-08-28T09:54:47.6868600Z         "impl": {
2026-08-28T09:54:47.6868874Z           "complete": true,
2026-08-28T09:54:47.6869228Z           "evidence": [
2026-08-28T09:54:47.6869489Z             {
2026-08-28T09:54:47.6869838Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.6870182Z               "line": 435
2026-08-28T09:54:47.6870438Z             },
2026-08-28T09:54:47.6870696Z             {
2026-08-28T09:54:47.6871039Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6871312Z               "line": 1610
2026-08-28T09:54:47.6871566Z             },
2026-08-28T09:54:47.6871876Z             {
2026-08-28T09:54:47.6872233Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6872505Z               "line": 1628
2026-08-28T09:54:47.6872768Z             },
2026-08-28T09:54:47.6873019Z             {
2026-08-28T09:54:47.6873383Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6873659Z               "line": 1638
2026-08-28T09:54:47.6873920Z             }
2026-08-28T09:54:47.6874170Z           ]
2026-08-28T09:54:47.6874433Z         },
2026-08-28T09:54:47.6874696Z         "int": {
2026-08-28T09:54:47.6874976Z           "complete": false,
2026-08-28T09:54:47.6875257Z           "evidence": []
2026-08-28T09:54:47.6875510Z         },
2026-08-28T09:54:47.6875777Z         "unit": {
2026-08-28T09:54:47.6876049Z           "complete": true,
2026-08-28T09:54:47.6876326Z           "evidence": [
2026-08-28T09:54:47.6876582Z             {
2026-08-28T09:54:47.6876952Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6877248Z               "line": 1937
2026-08-28T09:54:47.6877524Z             },
2026-08-28T09:54:47.6877781Z             {
2026-08-28T09:54:47.6878124Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6878396Z               "line": 1184
2026-08-28T09:54:47.6878649Z             }
2026-08-28T09:54:47.6878903Z           ]
2026-08-28T09:54:47.6879232Z         }
2026-08-28T09:54:47.6879487Z       }
2026-08-28T09:54:47.6879749Z     },
2026-08-28T09:54:47.6879997Z     {
2026-08-28T09:54:47.6880335Z       "id": "REQ-PICKER-CHOOSE-DEDUP-ALL",
2026-08-28T09:54:47.6884413Z       "title": "A4 (F028, operator #5): choose-project duplicate rows. model.rs:314-337 build_project_choices dedups the `Here: <run_cwd>` row only against the HEAD ref's dir (line 324) — an OLDER history ref with the SAME dir still renders, giving `Here: C:\\...\\projects` + `projects` as two rows for one project (operator screenshot). FIX: dedupe `Here` against ALL history dirs, and skip rest-rows whose dir == run_cwd when Here is present. Extend the model.rs:1847 choose-project test. See triage A4.",
2026-08-28T09:54:47.6884863Z       "requiredStages": [
2026-08-28T09:54:47.6885126Z         "impl",
2026-08-28T09:54:47.6885365Z         "unit"
2026-08-28T09:54:47.6885618Z       ],
2026-08-28T09:54:47.6885875Z       "stages": {
2026-08-28T09:54:47.6886137Z         "doc": {
2026-08-28T09:54:47.6886418Z           "complete": false,
2026-08-28T09:54:47.6886699Z           "evidence": []
2026-08-28T09:54:47.6886952Z         },
2026-08-28T09:54:47.6887213Z         "impl": {
2026-08-28T09:54:47.6887517Z           "complete": true,
2026-08-28T09:54:47.6887793Z           "evidence": [
2026-08-28T09:54:47.6888060Z             {
2026-08-28T09:54:47.6888408Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6888684Z               "line": 360
2026-08-28T09:54:47.6889023Z             }
2026-08-28T09:54:47.6889290Z           ]
2026-08-28T09:54:47.6889543Z         },
2026-08-28T09:54:47.6889801Z         "int": {
2026-08-28T09:54:47.6890096Z           "complete": false,
2026-08-28T09:54:47.6890377Z           "evidence": []
2026-08-28T09:54:47.6890634Z         },
2026-08-28T09:54:47.6890891Z         "unit": {
2026-08-28T09:54:47.6891173Z           "complete": true,
2026-08-28T09:54:47.6891444Z           "evidence": [
2026-08-28T09:54:47.6891703Z             {
2026-08-28T09:54:47.6892056Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6892330Z               "line": 2579
2026-08-28T09:54:47.6892586Z             }
2026-08-28T09:54:47.6892843Z           ]
2026-08-28T09:54:47.6893100Z         }
2026-08-28T09:54:47.6893348Z       }
2026-08-28T09:54:47.6893602Z     },
2026-08-28T09:54:47.6893917Z     {
2026-08-28T09:54:47.6894288Z       "id": "REQ-PICKER-CONTROL-LINE-STATUS-GATE",
2026-08-28T09:54:47.6898911Z       "title": "A2 (F028, operator #2): the picker confirm-panel 'controlled locally' line renders for OFFLINE endpoints. view.rs:425-436 builds control_line from ep.controlled with NO status gate; an offline endpoint with a stale controlled stamp shows 'controlled locally' (operator screenshot: hall-a offline + controlled locally). RENDER HALF (this REQ): control_line MUST be empty when status != Online. The upstream STICKY-stamp half (stamp survives client SIGKILL >=5min) is B3/REQ-PRESENCE-CONTROL-REAP-ON-EXIT. FIX: gate the render. See triage A2(a).",
2026-08-28T09:54:47.6899374Z       "requiredStages": [
2026-08-28T09:54:47.6899637Z         "impl",
2026-08-28T09:54:47.6899893Z         "unit"
2026-08-28T09:54:47.6900151Z       ],
2026-08-28T09:54:47.6900412Z       "stages": {
2026-08-28T09:54:47.6900685Z         "doc": {
2026-08-28T09:54:47.6900971Z           "complete": false,
2026-08-28T09:54:47.6901248Z           "evidence": []
2026-08-28T09:54:47.6901509Z         },
2026-08-28T09:54:47.6901766Z         "impl": {
2026-08-28T09:54:47.6902062Z           "complete": true,
2026-08-28T09:54:47.6902329Z           "evidence": [
2026-08-28T09:54:47.6902592Z             {
2026-08-28T09:54:47.6902937Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6903223Z               "line": 612
2026-08-28T09:54:47.6903480Z             }
2026-08-28T09:54:47.6903736Z           ]
2026-08-28T09:54:47.6903994Z         },
2026-08-28T09:54:47.6904252Z         "int": {
2026-08-28T09:54:47.6904538Z           "complete": false,
2026-08-28T09:54:47.6904816Z           "evidence": []
2026-08-28T09:54:47.6905078Z         },
2026-08-28T09:54:47.6905335Z         "unit": {
2026-08-28T09:54:47.6905619Z           "complete": true,
2026-08-28T09:54:47.6905889Z           "evidence": [
2026-08-28T09:54:47.6906185Z             {
2026-08-28T09:54:47.6906528Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6906805Z               "line": 1011
2026-08-28T09:54:47.6907063Z             }
2026-08-28T09:54:47.6907315Z           ]
2026-08-28T09:54:47.6907572Z         }
2026-08-28T09:54:47.6907825Z       }
2026-08-28T09:54:47.6908082Z     },
2026-08-28T09:54:47.6908339Z     {
2026-08-28T09:54:47.6908685Z       "id": "REQ-PICKER-CONTROLLED-LOCAL",
2026-08-28T09:54:47.6917660Z       "title": "#3 local half: a LOCALLY-controlled endpoint renders CONTROLLED in its own node's picker. display_status() (crates/spt/src/picker/model.rs:415) derives Controlled ONLY from driven_by.is_some(), but the legacy LOCAL attach path left driven_by=None (the remote-only reading stated here was falsified by doyle ruling v3 2026-07-19 — driven_by names the controlling node, own included; KH 7.15 governs CLEARING it, not who may latch it) — so a locally-controlled endpoint of that era has driven_by=None + controlled=true, and local_rows (data.rs:220) never threads controlled into EndpointRow, so a locally-RC'd endpoint shows plain ONLINE in its own picker (remote rows are fine — gossip stamps controller_node=self, REQ-GOSSIP-CONTROLLED-ANY; the asymmetry is the bug). Fix: EndpointRow gains controlled:bool (local: rec.controlled; remote: controller_node.is_some()); display_status -> Controlled when driven_by.is_some()||controlled; desc pane says 'controlled locally' when the driver is unnamed. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #3.",
2026-08-28T09:54:47.6918070Z       "requiredStages": [
2026-08-28T09:54:47.6918327Z         "impl",
2026-08-28T09:54:47.6918596Z         "unit"
2026-08-28T09:54:47.6918846Z       ],
2026-08-28T09:54:47.6919212Z       "stages": {
2026-08-28T09:54:47.6919474Z         "doc": {
2026-08-28T09:54:47.6919754Z           "complete": false,
2026-08-28T09:54:47.6920026Z           "evidence": []
2026-08-28T09:54:47.6920280Z         },
2026-08-28T09:54:47.6920541Z         "impl": {
2026-08-28T09:54:47.6920838Z           "complete": true,
2026-08-28T09:54:47.6921115Z           "evidence": [
2026-08-28T09:54:47.6921430Z             {
2026-08-28T09:54:47.6921752Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.6922024Z               "line": 7064
2026-08-28T09:54:47.6922290Z             },
2026-08-28T09:54:47.6922538Z             {
2026-08-28T09:54:47.6922891Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.6923312Z               "line": 288
2026-08-28T09:54:47.6923617Z             },
2026-08-28T09:54:47.6923915Z             {
2026-08-28T09:54:47.6924266Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6924527Z               "line": 623
2026-08-28T09:54:47.6924790Z             },
2026-08-28T09:54:47.6925039Z             {
2026-08-28T09:54:47.6925382Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6925658Z               "line": 681
2026-08-28T09:54:47.6925912Z             }
2026-08-28T09:54:47.6926174Z           ]
2026-08-28T09:54:47.6926421Z         },
2026-08-28T09:54:47.6926688Z         "int": {
2026-08-28T09:54:47.6926971Z           "complete": false,
2026-08-28T09:54:47.6927248Z           "evidence": []
2026-08-28T09:54:47.6927501Z         },
2026-08-28T09:54:47.6927758Z         "unit": {
2026-08-28T09:54:47.6928043Z           "complete": true,
2026-08-28T09:54:47.6928316Z           "evidence": [
2026-08-28T09:54:47.6928573Z             {
2026-08-28T09:54:47.6928925Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6929316Z               "line": 2086
2026-08-28T09:54:47.6929566Z             },
2026-08-28T09:54:47.6929825Z             {
2026-08-28T09:54:47.6930178Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6930449Z               "line": 955
2026-08-28T09:54:47.6930707Z             },
2026-08-28T09:54:47.6930958Z             {
2026-08-28T09:54:47.6931313Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6931579Z               "line": 972
2026-08-28T09:54:47.6931908Z             }
2026-08-28T09:54:47.6932174Z           ]
2026-08-28T09:54:47.6932427Z         }
2026-08-28T09:54:47.6932684Z       }
2026-08-28T09:54:47.6932937Z     },
2026-08-28T09:54:47.6933194Z     {
2026-08-28T09:54:47.6933528Z       "id": "REQ-PICKER-CURRENT-DIR-LABEL",
2026-08-28T09:54:47.6940145Z       "title": "A-2/A-3 (F029, operator, semantic pair): the Choose-project rows must self-identify the CURRENT DIR. build_project_choices (picker/model.rs:322-352). A-2: when the run cwd IS already a history dir the `Here:` row is (correctly) suppressed by the dedup (REQ-PICKER-CHOOSE-DEDUP-ALL), but the matching history row rendered bare `r.display` with no cwd affordance — mark it `<display> (CURRENT DIR)`. A-3: the not-in-history current-dir row changes from `Here: <run_cwd>` to `CURRENT DIR --> <project>`, deriving the display the SAME way the history refs do (folder tail; honest fallback to the raw path when underivable). `cwd` payload unchanged. Grep-tests rule: 3 `starts_with(\"Here: \")` asserts (model.rs) + a `Here: /here` render assert (view.rs) are behavior assertions on the OLD label. See triage A-2/A-3.",
2026-08-28T09:54:47.6940555Z       "requiredStages": [
2026-08-28T09:54:47.6940812Z         "impl",
2026-08-28T09:54:47.6941081Z         "unit"
2026-08-28T09:54:47.6941329Z       ],
2026-08-28T09:54:47.6941591Z       "stages": {
2026-08-28T09:54:47.6941858Z         "doc": {
2026-08-28T09:54:47.6942149Z           "complete": false,
2026-08-28T09:54:47.6942439Z           "evidence": []
2026-08-28T09:54:47.6942691Z         },
2026-08-28T09:54:47.6942959Z         "impl": {
2026-08-28T09:54:47.6943235Z           "complete": true,
2026-08-28T09:54:47.6943517Z           "evidence": [
2026-08-28T09:54:47.6943773Z             {
2026-08-28T09:54:47.6944137Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6944456Z               "line": 385
2026-08-28T09:54:47.6944708Z             },
2026-08-28T09:54:47.6944964Z             {
2026-08-28T09:54:47.6945328Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6945662Z               "line": 398
2026-08-28T09:54:47.6945915Z             }
2026-08-28T09:54:47.6946174Z           ]
2026-08-28T09:54:47.6946426Z         },
2026-08-28T09:54:47.6946698Z         "int": {
2026-08-28T09:54:47.6946984Z           "complete": false,
2026-08-28T09:54:47.6947260Z           "evidence": []
2026-08-28T09:54:47.6947633Z         },
2026-08-28T09:54:47.6947893Z         "unit": {
2026-08-28T09:54:47.6948186Z           "complete": true,
2026-08-28T09:54:47.6948463Z           "evidence": [
2026-08-28T09:54:47.6948726Z             {
2026-08-28T09:54:47.6949159Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6949436Z               "line": 2552
2026-08-28T09:54:47.6949698Z             }
2026-08-28T09:54:47.6949947Z           ]
2026-08-28T09:54:47.6950205Z         }
2026-08-28T09:54:47.6950455Z       }
2026-08-28T09:54:47.6950715Z     },
2026-08-28T09:54:47.6950964Z     {
2026-08-28T09:54:47.6951302Z       "id": "REQ-PICKER-FORK-LABEL-CWD",
2026-08-28T09:54:47.6954557Z       "title": "B-3 (F029, operator): the confirm-panel `Fork endpoint` option label is static and says nothing about WHERE the fork lands. A fork runs in the picker's launch cwd (run_cwd); the label must state that dir honestly: `Fork endpoint here --> <current dir>`. Anchor picker/view.rs confirm_option_label (was `fn(opt)->&'static str`). Make the label model-aware for the dir-relative options. See triage B-3.",
2026-08-28T09:54:47.6954863Z       "requiredStages": [
2026-08-28T09:54:47.6955115Z         "impl",
2026-08-28T09:54:47.6955365Z         "unit"
2026-08-28T09:54:47.6955629Z       ],
2026-08-28T09:54:47.6955884Z       "stages": {
2026-08-28T09:54:47.6956146Z         "doc": {
2026-08-28T09:54:47.6956424Z           "complete": false,
2026-08-28T09:54:47.6956695Z           "evidence": []
2026-08-28T09:54:47.6956963Z         },
2026-08-28T09:54:47.6957230Z         "impl": {
2026-08-28T09:54:47.6957525Z           "complete": true,
2026-08-28T09:54:47.6957860Z           "evidence": [
2026-08-28T09:54:47.6958126Z             {
2026-08-28T09:54:47.6958482Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6958761Z               "line": 537
2026-08-28T09:54:47.6959094Z             }
2026-08-28T09:54:47.6959357Z           ]
2026-08-28T09:54:47.6959615Z         },
2026-08-28T09:54:47.6959872Z         "int": {
2026-08-28T09:54:47.6960164Z           "complete": false,
2026-08-28T09:54:47.6960507Z           "evidence": []
2026-08-28T09:54:47.6960770Z         },
2026-08-28T09:54:47.6961024Z         "unit": {
2026-08-28T09:54:47.6961308Z           "complete": true,
2026-08-28T09:54:47.6961576Z           "evidence": [
2026-08-28T09:54:47.6961843Z             {
2026-08-28T09:54:47.6962196Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6962472Z               "line": 1231
2026-08-28T09:54:47.6962735Z             }
2026-08-28T09:54:47.6962988Z           ]
2026-08-28T09:54:47.6963249Z         }
2026-08-28T09:54:47.6963497Z       }
2026-08-28T09:54:47.6963755Z     },
2026-08-28T09:54:47.6964002Z     {
2026-08-28T09:54:47.6964317Z       "id": "REQ-PICKER-HISTORY-FRESH",
2026-08-28T09:54:47.6967628Z       "title": "The `spt endpoint run` picker shows project history for FRESH endpoints (operator-raised v0.12.0 real-harness finding). Symptom: a fresh endpoint shows no project history in the picker. ROOT TBD — investigate the project-history loader (v0.10.0 PICKER-2, picker/data.rs) before fixing: distinguish a real loader bug from 'fresh = no history yet' semantics. (v0.12.1)",
2026-08-28T09:54:47.6967932Z       "requiredStages": [
2026-08-28T09:54:47.6968195Z         "impl",
2026-08-28T09:54:47.6968448Z         "unit"
2026-08-28T09:54:47.6968705Z       ],
2026-08-28T09:54:47.6969071Z       "stages": {
2026-08-28T09:54:47.6969330Z         "doc": {
2026-08-28T09:54:47.6969612Z           "complete": false,
2026-08-28T09:54:47.6969889Z           "evidence": []
2026-08-28T09:54:47.6970151Z         },
2026-08-28T09:54:47.6970409Z         "impl": {
2026-08-28T09:54:47.6970762Z           "complete": true,
2026-08-28T09:54:47.6971034Z           "evidence": [
2026-08-28T09:54:47.6971292Z             {
2026-08-28T09:54:47.6971676Z               "path": "crates/spt-store/src/projderive.rs",
2026-08-28T09:54:47.6971950Z               "line": 111
2026-08-28T09:54:47.6972207Z             }
2026-08-28T09:54:47.6972541Z           ]
2026-08-28T09:54:47.6972793Z         },
2026-08-28T09:54:47.6973056Z         "int": {
2026-08-28T09:54:47.6973342Z           "complete": false,
2026-08-28T09:54:47.6973619Z           "evidence": []
2026-08-28T09:54:47.6973877Z         },
2026-08-28T09:54:47.6974139Z         "unit": {
2026-08-28T09:54:47.6974418Z           "complete": true,
2026-08-28T09:54:47.6974700Z           "evidence": [
2026-08-28T09:54:47.6974949Z             {
2026-08-28T09:54:47.6975302Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.6975573Z               "line": 1344
2026-08-28T09:54:47.6975822Z             }
2026-08-28T09:54:47.6976079Z           ]
2026-08-28T09:54:47.6976355Z         }
2026-08-28T09:54:47.6976602Z       }
2026-08-28T09:54:47.6976849Z     },
2026-08-28T09:54:47.6977096Z     {
2026-08-28T09:54:47.6977444Z       "id": "REQ-PICKER-KEY-GATE-LAUNCH-CAPABLE",
2026-08-28T09:54:47.6982587Z       "title": "B-1 (F029, operator): the `h` (headless start) / `s` (shortcut) keybinds fire from broad picker contexts (mod.rs handle_confirm_key / ChooseProject / Resume) regardless of whether the highlighted row would LAUNCH the endpoint. Restrict both to launch-capable highlights: (a) `Start now` in the immediate-start case (should_offer_project_choice == false), (b) a Choose-project row, (c) a Resume-from-history row. The footer hint line must render `h`/`s` ONLY when actually live (hint truth = availability truth). FIX: gate the key handlers on (screen, highlighted-option), unit the gate as a pure matrix. See triage B-1.",
2026-08-28T09:54:47.6982888Z       "requiredStages": [
2026-08-28T09:54:47.6983212Z         "impl",
2026-08-28T09:54:47.6983474Z         "unit"
2026-08-28T09:54:47.6983731Z       ],
2026-08-28T09:54:47.6984002Z       "stages": {
2026-08-28T09:54:47.6984259Z         "doc": {
2026-08-28T09:54:47.6984560Z           "complete": false,
2026-08-28T09:54:47.6984833Z           "evidence": []
2026-08-28T09:54:47.6985194Z         },
2026-08-28T09:54:47.6985461Z         "impl": {
2026-08-28T09:54:47.6985743Z           "complete": true,
2026-08-28T09:54:47.6986100Z           "evidence": [
2026-08-28T09:54:47.6986363Z             {
2026-08-28T09:54:47.6986730Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6987002Z               "line": 1330
2026-08-28T09:54:47.6987266Z             },
2026-08-28T09:54:47.6987517Z             {
2026-08-28T09:54:47.6987865Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6988142Z               "line": 1510
2026-08-28T09:54:47.6988404Z             },
2026-08-28T09:54:47.6988662Z             {
2026-08-28T09:54:47.6989086Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6989372Z               "line": 1525
2026-08-28T09:54:47.6989626Z             }
2026-08-28T09:54:47.6989884Z           ]
2026-08-28T09:54:47.6990138Z         },
2026-08-28T09:54:47.6990403Z         "int": {
2026-08-28T09:54:47.6990690Z           "complete": false,
2026-08-28T09:54:47.6990967Z           "evidence": []
2026-08-28T09:54:47.6991224Z         },
2026-08-28T09:54:47.6991482Z         "unit": {
2026-08-28T09:54:47.6991767Z           "complete": true,
2026-08-28T09:54:47.6992039Z           "evidence": [
2026-08-28T09:54:47.6992296Z             {
2026-08-28T09:54:47.6992648Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.6992927Z               "line": 1860
2026-08-28T09:54:47.6993191Z             },
2026-08-28T09:54:47.6993443Z             {
2026-08-28T09:54:47.6993791Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.6994058Z               "line": 1203
2026-08-28T09:54:47.6994319Z             }
2026-08-28T09:54:47.6994634Z           ]
2026-08-28T09:54:47.6994891Z         }
2026-08-28T09:54:47.6995144Z       }
2026-08-28T09:54:47.6995407Z     },
2026-08-28T09:54:47.6995663Z     {
2026-08-28T09:54:47.6995983Z       "id": "REQ-PICKER-LIST-SCROLL",
2026-08-28T09:54:47.7022384Z       "title": "EVERY LIST VIEW IN THE ENDPOINT PICKER SCROLLS TO KEEP THE CARET VISIBLE. A selection the operator cannot see is a selection they cannot make: when a list is longer than the terminal, moving the caret past the last drawn row currently walks it off the bottom of the screen, leaving the highlighted row unrendered while the keys still move it — so the picker is taking input about a choice it is not showing (releases#65, reported from the field with a screenshot). THE REQUIREMENT IS ON ALL LIST VIEWS, NOT THE ONE THAT WAS REPORTED. Stated that way at mint because the reporter's own words ask for it and because the failure is structural rather than incidental: every view that draws a bounded window over an unbounded list has the same gap, so fixing the reported view alone leaves the identical defect behind every other list a later operator happens to fill up, with nothing failing until they do. A SCROLLED VIEW IS ONE CONCERN AND BELONGS IN ONE PLACE — a single primitive every list view draws through, never a per-view calculation repeated until one of them is subtly different. THE MECHANISM IS STATED BY REPLACEMENT AFTER RECON (this sentence previously described a hand-rolled offset derivation over (caret index, item count, visible rows), which was written before the render path was read and is NOT what the picker's shape calls for): the views render with ratatui, and a plain stateless list widget has no offset at all — it draws from the first item and stops at the bottom of the area, which is exactly why a caret below that line is never drawn while the keys keep moving it. The primitive therefore HANDS THE CARET OVER AS LIST STATE and lets the widget scroll to keep it visible; re-deriving the offset by hand beside a widget that already does it correctly would be a second implementation to keep in agreement, which is the drift this requirement exists to prevent rather than an instance of preventing it. WHAT THE PRIMITIVE MUST BE GIVEN IS THE CARET'S ROW AMONG THE RENDERED ITEMS, NOT A MODEL CURSOR, and this is the subtle half: the endpoint list interleaves group headers and subnet sub-lines as NON-SELECTABLE display rows, so the caret's row index runs ahead of the cursor by however many headers precede it. Handing over the cursor would scroll short by exactly the number of groups above the caret — invisibly correct on an ungrouped list, and wrong on the only list long enough to need scrolling at all. The caret stays visible at BOTH ENDS and across every way it can move. Gate: impl — the one caret-aware draw primitive, and EVERY picker list view going through it (asserted by there being no stateless list render left); unit — over a viewport deliberately SHORTER than the list, the caret's row is drawn with the caret at the first row, the last row and each step across both boundaries, the grouped list still reaches its last row (the header-offset property, which a cursor-indexed implementation fails), and list views beyond the reported one are covered too; the evidence is buffer-level through the picker's existing TestBackend seam, which is this module's established gate, so no separate int stage is owed.",
2026-08-28T09:54:47.7023027Z       "requiredStages": [
2026-08-28T09:54:47.7023295Z         "impl",
2026-08-28T09:54:47.7023548Z         "unit"
2026-08-28T09:54:47.7023802Z       ],
2026-08-28T09:54:47.7024068Z       "stages": {
2026-08-28T09:54:47.7024328Z         "doc": {
2026-08-28T09:54:47.7024603Z           "complete": false,
2026-08-28T09:54:47.7024885Z           "evidence": []
2026-08-28T09:54:47.7025133Z         },
2026-08-28T09:54:47.7025395Z         "impl": {
2026-08-28T09:54:47.7025676Z           "complete": true,
2026-08-28T09:54:47.7025952Z           "evidence": [
2026-08-28T09:54:47.7026205Z             {
2026-08-28T09:54:47.7026553Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7026839Z               "line": 140
2026-08-28T09:54:47.7027215Z             },
2026-08-28T09:54:47.7027482Z             {
2026-08-28T09:54:47.7027820Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7028083Z               "line": 153
2026-08-28T09:54:47.7028384Z             },
2026-08-28T09:54:47.7028632Z             {
2026-08-28T09:54:47.7029037Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7029304Z               "line": 182
2026-08-28T09:54:47.7029569Z             },
2026-08-28T09:54:47.7029819Z             {
2026-08-28T09:54:47.7030168Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7030434Z               "line": 194
2026-08-28T09:54:47.7030692Z             },
2026-08-28T09:54:47.7030945Z             {
2026-08-28T09:54:47.7031298Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7031575Z               "line": 210
2026-08-28T09:54:47.7031833Z             },
2026-08-28T09:54:47.7032105Z             {
2026-08-28T09:54:47.7032446Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7032725Z               "line": 259
2026-08-28T09:54:47.7032982Z             },
2026-08-28T09:54:47.7033245Z             {
2026-08-28T09:54:47.7033587Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7033865Z               "line": 358
2026-08-28T09:54:47.7034127Z             },
2026-08-28T09:54:47.7034381Z             {
2026-08-28T09:54:47.7034729Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7034993Z               "line": 399
2026-08-28T09:54:47.7035253Z             },
2026-08-28T09:54:47.7035506Z             {
2026-08-28T09:54:47.7035845Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7036117Z               "line": 667
2026-08-28T09:54:47.7036384Z             },
2026-08-28T09:54:47.7036708Z             {
2026-08-28T09:54:47.7037051Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7037333Z               "line": 699
2026-08-28T09:54:47.7037592Z             },
2026-08-28T09:54:47.7037851Z             {
2026-08-28T09:54:47.7038200Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7038476Z               "line": 730
2026-08-28T09:54:47.7038729Z             }
2026-08-28T09:54:47.7039062Z           ]
2026-08-28T09:54:47.7039405Z         },
2026-08-28T09:54:47.7039668Z         "int": {
2026-08-28T09:54:47.7039954Z           "complete": false,
2026-08-28T09:54:47.7040229Z           "evidence": []
2026-08-28T09:54:47.7040485Z         },
2026-08-28T09:54:47.7040742Z         "unit": {
2026-08-28T09:54:47.7041023Z           "complete": true,
2026-08-28T09:54:47.7041290Z           "evidence": [
2026-08-28T09:54:47.7041553Z             {
2026-08-28T09:54:47.7041896Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7042168Z               "line": 809
2026-08-28T09:54:47.7042431Z             },
2026-08-28T09:54:47.7042737Z             {
2026-08-28T09:54:47.7043087Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7043352Z               "line": 850
2026-08-28T09:54:47.7043614Z             },
2026-08-28T09:54:47.7043871Z             {
2026-08-28T09:54:47.7044258Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7044535Z               "line": 878
2026-08-28T09:54:47.7044787Z             }
2026-08-28T09:54:47.7045049Z           ]
2026-08-28T09:54:47.7045303Z         }
2026-08-28T09:54:47.7045558Z       }
2026-08-28T09:54:47.7045808Z     },
2026-08-28T09:54:47.7046062Z     {
2026-08-28T09:54:47.7046381Z       "id": "REQ-PICKER-NODE-GROUPING",
2026-08-28T09:54:47.7051132Z       "title": "Bug #13: the endpoint run Subnet tab shows a machine once PER shared subnet (subnet_rows data.rs:253 iterates per-subnet, groups by subnet:node, no cross-subnet dedup). Fix: dedup by (node, endpoint_id) across the subnet loop, collect the set of shared subnet names per endpoint, emit one group per MACHINE (group = node_display) with its shared subnets listed beneath the machine name; reconcile per-endpoint status across subnets (most-alive). Couples REQ-ENDPOINT-LIST-PALETTE (both edit subnet_rows). See docs/NEXT-MILESTONE-BUG-TRIAGE.md #13.",
2026-08-28T09:54:47.7051451Z       "requiredStages": [
2026-08-28T09:54:47.7051784Z         "impl",
2026-08-28T09:54:47.7052042Z         "int"
2026-08-28T09:54:47.7052300Z       ],
2026-08-28T09:54:47.7052562Z       "stages": {
2026-08-28T09:54:47.7052823Z         "doc": {
2026-08-28T09:54:47.7053105Z           "complete": false,
2026-08-28T09:54:47.7053376Z           "evidence": []
2026-08-28T09:54:47.7053628Z         },
2026-08-28T09:54:47.7053893Z         "impl": {
2026-08-28T09:54:47.7054169Z           "complete": true,
2026-08-28T09:54:47.7054441Z           "evidence": [
2026-08-28T09:54:47.7054694Z             {
2026-08-28T09:54:47.7055056Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7055333Z               "line": 373
2026-08-28T09:54:47.7055591Z             },
2026-08-28T09:54:47.7055845Z             {
2026-08-28T09:54:47.7056181Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7056455Z               "line": 373
2026-08-28T09:54:47.7056707Z             }
2026-08-28T09:54:47.7056969Z           ]
2026-08-28T09:54:47.7057228Z         },
2026-08-28T09:54:47.7057481Z         "int": {
2026-08-28T09:54:47.7057786Z           "complete": true,
2026-08-28T09:54:47.7058053Z           "evidence": [
2026-08-28T09:54:47.7058305Z             {
2026-08-28T09:54:47.7058645Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7058923Z               "line": 936
2026-08-28T09:54:47.7059267Z             }
2026-08-28T09:54:47.7059524Z           ]
2026-08-28T09:54:47.7059778Z         },
2026-08-28T09:54:47.7060035Z         "unit": {
2026-08-28T09:54:47.7060327Z           "complete": false,
2026-08-28T09:54:47.7060665Z           "evidence": []
2026-08-28T09:54:47.7060923Z         }
2026-08-28T09:54:47.7061173Z       }
2026-08-28T09:54:47.7061429Z     },
2026-08-28T09:54:47.7061682Z     {
2026-08-28T09:54:47.7062011Z       "id": "REQ-PICKER-OFFLINE-NO-VIEW",
2026-08-28T09:54:47.7064916Z       "title": "A3 (F028, operator #3): 'View now (read-only)' is offered for OFFLINE endpoints. model.rs:1030 offline branch of confirm_options is vec![Start, View] — View is meaningless with no live PTY. FIX: offline set = [Start] (+ the existing Resume/ChangeAdapter/Instantiate/Fork/Shortcut tail). Update the view.rs options tests. See triage A3.",
2026-08-28T09:54:47.7065297Z       "requiredStages": [
2026-08-28T09:54:47.7065560Z         "impl",
2026-08-28T09:54:47.7065813Z         "unit"
2026-08-28T09:54:47.7066070Z       ],
2026-08-28T09:54:47.7066333Z       "stages": {
2026-08-28T09:54:47.7066598Z         "doc": {
2026-08-28T09:54:47.7066886Z           "complete": false,
2026-08-28T09:54:47.7067159Z           "evidence": []
2026-08-28T09:54:47.7067420Z         },
2026-08-28T09:54:47.7067679Z         "impl": {
2026-08-28T09:54:47.7068041Z           "complete": true,
2026-08-28T09:54:47.7068318Z           "evidence": [
2026-08-28T09:54:47.7068599Z             {
2026-08-28T09:54:47.7069248Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7073352Z               "line": 1281
2026-08-28T09:54:47.7073648Z             }
2026-08-28T09:54:47.7073925Z           ]
2026-08-28T09:54:47.7074177Z         },
2026-08-28T09:54:47.7074440Z         "int": {
2026-08-28T09:54:47.7074729Z           "complete": false,
2026-08-28T09:54:47.7075014Z           "evidence": []
2026-08-28T09:54:47.7075261Z         },
2026-08-28T09:54:47.7075523Z         "unit": {
2026-08-28T09:54:47.7075805Z           "complete": true,
2026-08-28T09:54:47.7076077Z           "evidence": [
2026-08-28T09:54:47.7076330Z             {
2026-08-28T09:54:47.7076683Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7076965Z               "line": 1153
2026-08-28T09:54:47.7077220Z             }
2026-08-28T09:54:47.7077475Z           ]
2026-08-28T09:54:47.7077723Z         }
2026-08-28T09:54:47.7077981Z       }
2026-08-28T09:54:47.7078229Z     },
2026-08-28T09:54:47.7078525Z     {
2026-08-28T09:54:47.7078849Z       "id": "REQ-PICKER-ONLINE-ACTION",
2026-08-28T09:54:47.7083598Z       "title": "The `spt endpoint run` picker shows the correct action for an ALREADY-ONLINE endpoint — Attach, NOT 'Start now' (operator-raised v0.12.0 real-harness finding). Symptom: the picker offers 'Start now' for endpoints that are already online. ROOT TBD — investigate the status→action mapping (v0.10.0 PICKER-1 four-state status, picker/model.rs): is it reading live/online state correctly, or rendering stale/wedged broker state (i.e. partly a symptom of the broker wedge / status=online latch)? Fix so online → Attach. (v0.12.1)",
2026-08-28T09:54:47.7084023Z       "requiredStages": [
2026-08-28T09:54:47.7084281Z         "impl",
2026-08-28T09:54:47.7084547Z         "unit"
2026-08-28T09:54:47.7084804Z       ],
2026-08-28T09:54:47.7085080Z       "stages": {
2026-08-28T09:54:47.7085345Z         "doc": {
2026-08-28T09:54:47.7085631Z           "complete": false,
2026-08-28T09:54:47.7085913Z           "evidence": []
2026-08-28T09:54:47.7086165Z         },
2026-08-28T09:54:47.7086427Z         "impl": {
2026-08-28T09:54:47.7086713Z           "complete": true,
2026-08-28T09:54:47.7086999Z           "evidence": [
2026-08-28T09:54:47.7087257Z             {
2026-08-28T09:54:47.7087623Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7087898Z               "line": 1286
2026-08-28T09:54:47.7088150Z             }
2026-08-28T09:54:47.7088407Z           ]
2026-08-28T09:54:47.7088659Z         },
2026-08-28T09:54:47.7088918Z         "int": {
2026-08-28T09:54:47.7089303Z           "complete": false,
2026-08-28T09:54:47.7089585Z           "evidence": []
2026-08-28T09:54:47.7089847Z         },
2026-08-28T09:54:47.7090101Z         "unit": {
2026-08-28T09:54:47.7090449Z           "complete": true,
2026-08-28T09:54:47.7090719Z           "evidence": [
2026-08-28T09:54:47.7090981Z             {
2026-08-28T09:54:47.7091344Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7091620Z               "line": 2393
2026-08-28T09:54:47.7091872Z             },
2026-08-28T09:54:47.7092136Z             {
2026-08-28T09:54:47.7092492Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7092764Z               "line": 2407
2026-08-28T09:54:47.7093085Z             }
2026-08-28T09:54:47.7093334Z           ]
2026-08-28T09:54:47.7093601Z         }
2026-08-28T09:54:47.7093853Z       }
2026-08-28T09:54:47.7094115Z     },
2026-08-28T09:54:47.7094364Z     {
2026-08-28T09:54:47.7094725Z       "id": "REQ-PICKER-PROJECT-DISPLAY-NAME",
2026-08-28T09:54:47.7101614Z       "title": "A1 (F028, operator #1/#4/#6-display): `github-com-*` 'ghost' project entries are NOT phantoms — project_id_for_dir (spt-store/src/project.rs:64) derives ids from the git remote slug BY DESIGN (REQ-STORE-1 cross-machine sync): `github.com/SaberMage/spt-core` -> `github-com-sabermage-spt-core`. The ref is truthful; the BUG is presentation — the raw slug renders as the DISPLAY NAME everywhere (confirm-panel history view.rs:415-419, choose-project labels model.rs:314-337, resume-row titles, endpoint-list project column via latest_project_ref data.rs:417), which no operator recognizes as 'spt-core'. FIX: keep the slug as the KEY, render a friendly display name — the repo tail (spt-core) reusing the disambiguate_project_ids (model.rs:346) suffix mechanism for collisions. One shared display-name seam across all four surfaces. See triage A1.",
2026-08-28T09:54:47.7102009Z       "requiredStages": [
2026-08-28T09:54:47.7102266Z         "impl",
2026-08-28T09:54:47.7102525Z         "unit"
2026-08-28T09:54:47.7102776Z       ],
2026-08-28T09:54:47.7103043Z       "stages": {
2026-08-28T09:54:47.7103301Z         "doc": {
2026-08-28T09:54:47.7103585Z           "complete": false,
2026-08-28T09:54:47.7103870Z           "evidence": []
2026-08-28T09:54:47.7104127Z         },
2026-08-28T09:54:47.7104403Z         "impl": {
2026-08-28T09:54:47.7104689Z           "complete": true,
2026-08-28T09:54:47.7104966Z           "evidence": [
2026-08-28T09:54:47.7105219Z             {
2026-08-28T09:54:47.7105596Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:47.7105867Z               "line": 92
2026-08-28T09:54:47.7106210Z             },
2026-08-28T09:54:47.7106503Z             {
2026-08-28T09:54:47.7106874Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7107175Z               "line": 22
2026-08-28T09:54:47.7107448Z             },
2026-08-28T09:54:47.7107715Z             {
2026-08-28T09:54:47.7108067Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7108335Z               "line": 32
2026-08-28T09:54:47.7108588Z             },
2026-08-28T09:54:47.7108847Z             {
2026-08-28T09:54:47.7109270Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7109609Z               "line": 68
2026-08-28T09:54:47.7109871Z             },
2026-08-28T09:54:47.7110128Z             {
2026-08-28T09:54:47.7110481Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7110748Z               "line": 281
2026-08-28T09:54:47.7111001Z             },
2026-08-28T09:54:47.7111258Z             {
2026-08-28T09:54:47.7111611Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7111883Z               "line": 416
2026-08-28T09:54:47.7112140Z             },
2026-08-28T09:54:47.7112397Z             {
2026-08-28T09:54:47.7112750Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7113026Z               "line": 853
2026-08-28T09:54:47.7113274Z             },
2026-08-28T09:54:47.7113532Z             {
2026-08-28T09:54:47.7113875Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7114150Z               "line": 589
2026-08-28T09:54:47.7114406Z             }
2026-08-28T09:54:47.7114658Z           ]
2026-08-28T09:54:47.7114915Z         },
2026-08-28T09:54:47.7115216Z         "int": {
2026-08-28T09:54:47.7115498Z           "complete": false,
2026-08-28T09:54:47.7115769Z           "evidence": []
2026-08-28T09:54:47.7116033Z         },
2026-08-28T09:54:47.7116300Z         "unit": {
2026-08-28T09:54:47.7116586Z           "complete": true,
2026-08-28T09:54:47.7116856Z           "evidence": [
2026-08-28T09:54:47.7117111Z             {
2026-08-28T09:54:47.7117555Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:47.7117826Z               "line": 194
2026-08-28T09:54:47.7118083Z             },
2026-08-28T09:54:47.7118336Z             {
2026-08-28T09:54:47.7118684Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7119028Z               "line": 637
2026-08-28T09:54:47.7119290Z             },
2026-08-28T09:54:47.7119551Z             {
2026-08-28T09:54:47.7119893Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7120174Z               "line": 1362
2026-08-28T09:54:47.7120485Z             },
2026-08-28T09:54:47.7120742Z             {
2026-08-28T09:54:47.7121085Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7121381Z               "line": 1791
2026-08-28T09:54:47.7121633Z             },
2026-08-28T09:54:47.7121890Z             {
2026-08-28T09:54:47.7122237Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7122509Z               "line": 1807
2026-08-28T09:54:47.7122767Z             },
2026-08-28T09:54:47.7123020Z             {
2026-08-28T09:54:47.7123363Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7123635Z               "line": 1159
2026-08-28T09:54:47.7123891Z             }
2026-08-28T09:54:47.7124149Z           ]
2026-08-28T09:54:47.7124406Z         }
2026-08-28T09:54:47.7124663Z       }
2026-08-28T09:54:47.7124918Z     },
2026-08-28T09:54:47.7125204Z     {
2026-08-28T09:54:47.7125563Z       "id": "REQ-PICKER-PROJECT-HISTORY-TRUTH",
2026-08-28T09:54:47.7134558Z       "title": "#1: picker project history is derived from sessions.log cwds (newest->oldest, deduped by project_id_for_dir) UNION context-store branches, EXCLUDING owlery-internal paths (any cwd under spt_home()/owlery) everywhere a project is displayed or inferred. Fixes three stacked defects (crates/spt/src/picker/data.rs): (1a) project_history_for (data.rs:372) reads ONLY context-store p-* branches, which are empty on this box -> history []; (1b) the fallback origin project (data.rs:207) is derived from info.json.cwd = latest-boot-cwd (rewritten every rebind), not origin; (1c) psyche-host sessions bind owlery-internal cwds that pollute history. Full DIRS stay available in the model (feature #5 needs them). PROJECT REPRESENTATION RULING (operator 2026-07-03): project IDs ONLY, EVERYWHERE incl local display; on ID collision disambiguate minimally via a PURE disambiguate_project_ids(entries)->display-names fn (append one-level-up parent folder and/or root drive letter, e.g. 'spt-core (projects)' vs 'spt-core (D:)'). See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #1.",
2026-08-28T09:54:47.7134976Z       "requiredStages": [
2026-08-28T09:54:47.7135237Z         "impl",
2026-08-28T09:54:47.7135498Z         "unit"
2026-08-28T09:54:47.7135755Z       ],
2026-08-28T09:54:47.7136017Z       "stages": {
2026-08-28T09:54:47.7136270Z         "doc": {
2026-08-28T09:54:47.7136552Z           "complete": false,
2026-08-28T09:54:47.7136838Z           "evidence": []
2026-08-28T09:54:47.7137092Z         },
2026-08-28T09:54:47.7137353Z         "impl": {
2026-08-28T09:54:47.7137634Z           "complete": true,
2026-08-28T09:54:47.7137909Z           "evidence": [
2026-08-28T09:54:47.7138160Z             {
2026-08-28T09:54:47.7138517Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7138789Z               "line": 427
2026-08-28T09:54:47.7139123Z             }
2026-08-28T09:54:47.7139381Z           ]
2026-08-28T09:54:47.7139629Z         },
2026-08-28T09:54:47.7139895Z         "int": {
2026-08-28T09:54:47.7140181Z           "complete": false,
2026-08-28T09:54:47.7140466Z           "evidence": []
2026-08-28T09:54:47.7140713Z         },
2026-08-28T09:54:47.7140985Z         "unit": {
2026-08-28T09:54:47.7141271Z           "complete": true,
2026-08-28T09:54:47.7141542Z           "evidence": [
2026-08-28T09:54:47.7141799Z             {
2026-08-28T09:54:47.7142138Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7142414Z               "line": 1320
2026-08-28T09:54:47.7142733Z             }
2026-08-28T09:54:47.7142990Z           ]
2026-08-28T09:54:47.7143245Z         }
2026-08-28T09:54:47.7143501Z       }
2026-08-28T09:54:47.7143753Z     },
2026-08-28T09:54:47.7144001Z     {
2026-08-28T09:54:47.7144392Z       "id": "REQ-PICKER-PURGE-SHORTCUT",
2026-08-28T09:54:47.7154947Z       "title": "C-3 (REMOTE-TRUTH triage §C-3 #8): the pick-existing list gains an `x` purge shortcut — on an OFFLINE LOCAL highlight, `x` opens a small in-TUI confirm screen (Screen::ConfirmPurge, the B-2 ChangeAdapterPick shape) and Enter purges via the ONE existing purge core `cmd_endpoint_purge(id, yes=true, force=false)` — NEVER the core's stdin [y/N] (it fights the picker's raw mode; the confirm screen IS the confirm). The shortcut INHERITS both purge gates (offline-only + node-local, cli.rs cmd_endpoint_purge / CONTEXT:189): gated-off presses stay on the list and FLASH WHY (online → offline-only, remote → local-only). force=false is deliberate — the model gate is advisory; the core's own offline check is the authority, and a race to online between gate and purge must REFUSE, never stop-then-purge. After a successful purge the picker STAYS (inline outcome, like Shortcut/ChangeAdapter): the row leaves the in-memory list (remove_endpoint, cursor re-clamped) + flash PURGED:{id}. Hint truth (B-1/F029 discipline): the pick legend renders `x purge` ONLY when purge_key_live() — the same predicate the handler gates on. Red-first: purge outcome reachable ONLY from an offline LOCAL highlight (online/remote → no screen change + why-flash).",
2026-08-28T09:54:47.7155382Z       "requiredStages": [
2026-08-28T09:54:47.7155659Z         "impl",
2026-08-28T09:54:47.7155915Z         "unit"
2026-08-28T09:54:47.7156172Z       ],
2026-08-28T09:54:47.7156437Z       "stages": {
2026-08-28T09:54:47.7156690Z         "doc": {
2026-08-28T09:54:47.7156976Z           "complete": false,
2026-08-28T09:54:47.7157258Z           "evidence": []
2026-08-28T09:54:47.7157572Z         },
2026-08-28T09:54:47.7157848Z         "impl": {
2026-08-28T09:54:47.7158125Z           "complete": true,
2026-08-28T09:54:47.7158396Z           "evidence": [
2026-08-28T09:54:47.7158648Z             {
2026-08-28T09:54:47.7159081Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7159356Z               "line": 164
2026-08-28T09:54:47.7159619Z             },
2026-08-28T09:54:47.7159877Z             {
2026-08-28T09:54:47.7160220Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7160492Z               "line": 310
2026-08-28T09:54:47.7160811Z             },
2026-08-28T09:54:47.7161074Z             {
2026-08-28T09:54:47.7161408Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7161687Z               "line": 354
2026-08-28T09:54:47.7161941Z             },
2026-08-28T09:54:47.7162190Z             {
2026-08-28T09:54:47.7162543Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7162810Z               "line": 827
2026-08-28T09:54:47.7163082Z             },
2026-08-28T09:54:47.7163369Z             {
2026-08-28T09:54:47.7163787Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7164059Z               "line": 1194
2026-08-28T09:54:47.7164318Z             },
2026-08-28T09:54:47.7164578Z             {
2026-08-28T09:54:47.7164922Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7165198Z               "line": 1202
2026-08-28T09:54:47.7165450Z             },
2026-08-28T09:54:47.7165713Z             {
2026-08-28T09:54:47.7166061Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7166342Z               "line": 1218
2026-08-28T09:54:47.7166600Z             },
2026-08-28T09:54:47.7166861Z             {
2026-08-28T09:54:47.7167217Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7167488Z               "line": 1227
2026-08-28T09:54:47.7167745Z             },
2026-08-28T09:54:47.7167998Z             {
2026-08-28T09:54:47.7168355Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7168699Z               "line": 414
2026-08-28T09:54:47.7169028Z             },
2026-08-28T09:54:47.7169285Z             {
2026-08-28T09:54:47.7169628Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7169897Z               "line": 437
2026-08-28T09:54:47.7170151Z             }
2026-08-28T09:54:47.7170408Z           ]
2026-08-28T09:54:47.7170661Z         },
2026-08-28T09:54:47.7170922Z         "int": {
2026-08-28T09:54:47.7171208Z           "complete": false,
2026-08-28T09:54:47.7171495Z           "evidence": []
2026-08-28T09:54:47.7171804Z         },
2026-08-28T09:54:47.7172067Z         "unit": {
2026-08-28T09:54:47.7172356Z           "complete": true,
2026-08-28T09:54:47.7172617Z           "evidence": [
2026-08-28T09:54:47.7172874Z             {
2026-08-28T09:54:47.7173227Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7173493Z               "line": 2824
2026-08-28T09:54:47.7173742Z             },
2026-08-28T09:54:47.7174019Z             {
2026-08-28T09:54:47.7174366Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7174647Z               "line": 2866
2026-08-28T09:54:47.7174902Z             },
2026-08-28T09:54:47.7175152Z             {
2026-08-28T09:54:47.7175506Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7175772Z               "line": 2882
2026-08-28T09:54:47.7176029Z             }
2026-08-28T09:54:47.7176283Z           ]
2026-08-28T09:54:47.7176540Z         }
2026-08-28T09:54:47.7176793Z       }
2026-08-28T09:54:47.7177065Z     },
2026-08-28T09:54:47.7177335Z     {
2026-08-28T09:54:47.7177666Z       "id": "REQ-PICKER-PURGE-STRUCTURED",
2026-08-28T09:54:47.7187110Z       "title": "RC-RENDER-TRUTH W3 (ADR-0043 decision 3, hertz stale-glyphs RCA leg 3 P0): core verbs invoked from inside an active TUI return STRUCTURED outcomes and write NOTHING to the terminal — the picker purge path calls a structured-outcome purge core (no stdout/stderr under the live alternate screen) and remains the sole renderer via model.flash (today cmd_endpoint_purge writes diagnostics/PURGED to stderr while ratatui owns the alt screen, mutating the physical screen behind the previous-Buffer diff baseline => later draws skip 'already blank' cells and stderr glyph fragments persist — the x-purge symptom). Baseline-desync regression REQUIRES a stateful/recording backend (pure TestBackend view snapshots cannot catch it). Gate: impl — structured purge outcome + silent-under-TUI routing; unit — purge core emits no terminal bytes in structured mode, picker converts outcomes to flash; int — recording backend: draw ConfirmPurge, inject an external display mutation, transition back => next frame reconstructs the COMPLETE target screen; doc — ADR-0043.",
2026-08-28T09:54:47.7187558Z       "requiredStages": [
2026-08-28T09:54:47.7187815Z         "doc",
2026-08-28T09:54:47.7188075Z         "impl",
2026-08-28T09:54:47.7188337Z         "unit",
2026-08-28T09:54:47.7188599Z         "int"
2026-08-28T09:54:47.7188870Z       ],
2026-08-28T09:54:47.7189204Z       "stages": {
2026-08-28T09:54:47.7189466Z         "doc": {
2026-08-28T09:54:47.7189743Z           "complete": true,
2026-08-28T09:54:47.7190024Z           "evidence": [
2026-08-28T09:54:47.7190273Z             {
2026-08-28T09:54:47.7190700Z               "path": "docs/adr/0043-terminal-render-lifecycle.md",
2026-08-28T09:54:47.7190966Z               "line": 57
2026-08-28T09:54:47.7191228Z             }
2026-08-28T09:54:47.7191485Z           ]
2026-08-28T09:54:47.7191747Z         },
2026-08-28T09:54:47.7192009Z         "impl": {
2026-08-28T09:54:47.7192296Z           "complete": true,
2026-08-28T09:54:47.7192572Z           "evidence": [
2026-08-28T09:54:47.7192831Z             {
2026-08-28T09:54:47.7193150Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7193424Z               "line": 23957
2026-08-28T09:54:47.7193679Z             },
2026-08-28T09:54:47.7193946Z             {
2026-08-28T09:54:47.7194280Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7194623Z               "line": 165
2026-08-28T09:54:47.7194876Z             },
2026-08-28T09:54:47.7195134Z             {
2026-08-28T09:54:47.7195472Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7195749Z               "line": 202
2026-08-28T09:54:47.7195999Z             }
2026-08-28T09:54:47.7196258Z           ]
2026-08-28T09:54:47.7196516Z         },
2026-08-28T09:54:47.7196773Z         "int": {
2026-08-28T09:54:47.7197055Z           "complete": true,
2026-08-28T09:54:47.7197327Z           "evidence": [
2026-08-28T09:54:47.7197651Z             {
2026-08-28T09:54:47.7197989Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7198266Z               "line": 642
2026-08-28T09:54:47.7198522Z             }
2026-08-28T09:54:47.7198786Z           ]
2026-08-28T09:54:47.7199135Z         },
2026-08-28T09:54:47.7199387Z         "unit": {
2026-08-28T09:54:47.7199678Z           "complete": true,
2026-08-28T09:54:47.7199960Z           "evidence": [
2026-08-28T09:54:47.7200222Z             {
2026-08-28T09:54:47.7200561Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7200833Z               "line": 610
2026-08-28T09:54:47.7201092Z             }
2026-08-28T09:54:47.7201351Z           ]
2026-08-28T09:54:47.7201611Z         }
2026-08-28T09:54:47.7201869Z       }
2026-08-28T09:54:47.7202122Z     },
2026-08-28T09:54:47.7202375Z     {
2026-08-28T09:54:47.7202690Z       "id": "REQ-PICKER-REMOTE-WAKE",
2026-08-28T09:54:47.7221166Z       "title": "C-2 (REMOTE-TRUTH triage §C-2 #4 + addendum @3442ce5): a REMOTE suspended picker row offers `Wake now` — waking the endpoint THROUGH its owning node's rest edge (the A-2 daemon resume leg) — instead of a bare `Start now` that silently cold-starts a COLLIDING LOCAL instance of a remote id (node-anchored identity violation, ADR-0003/0023). ROOT (certain): confirm_options collapsed Suspended into the offline action set = [Start,…]; on a REMOTE row `Start` bakes Outcome::Run with NO node → picker dispatch → cmd_endpoint_run creates a fresh LOCAL perch of the remote id (model.rs confirm_terminal / mod.rs dispatch). Remote rows are only Online/Suspended, so remote+offline == remote-suspended. FIX: confirm_options splits the offline arm on is_local — remote → vec![Wake] (a new ConfirmOption::Wake), local → vec![Start] UNCHANGED; confirm_terminal(Wake) → a new Outcome::Wake{id,node} carrying the RAW node hex; dispatch routes crate::cli::cmd_endpoint_wake_remote(id,node) → cmd_rest(id@node, RestEvent::Wake) = the EXISTING WAN rest arm (dispatch_wan_rest → wan_rest), and A-2's resume leg revives the session async (the full loop the operator wanted). `Instantiate locally` stays the separate deliberate-copy verb. ADDENDUM correction (a): EndpointRow.node is the LOSSY DISPLAY string (node_label_display = 'LABEL (prefix…)'), which node_qualifier_matches (full-hex-prefix|exact-label) CANNOT match — a dead Wake; so a NEW EndpointRow.node_key: String carries the raw ResourceRow.node hex (empty for local rows — Wake is remote-only) threaded through from_resource_row + the 4 literal ctors. CO-GATE (b, addendum): ChangeAdapter (was `offline`-gated) is gated `offline && is_local` — write_adapter_change → resolve_perch_path(Infer) → mutate_info rewrites a LOCAL perch record, so offering it on a remote suspended row is the SAME colliding-local-write-for-a-remote-id class (the Start twin); a remote node's adapter is not ours to rewrite from here. Red-first: a remote suspended row → confirm_options has Wake NOT Start NOT ChangeAdapter, and confirm_terminal(Wake) → Outcome::Wake{node==raw hex} (never a local Outcome::Run); a LOCAL offline row is UNCHANGED (Start + ChangeAdapter).",
2026-08-28T09:54:47.7221776Z       "requiredStages": [
2026-08-28T09:54:47.7222115Z         "impl",
2026-08-28T09:54:47.7222376Z         "unit",
2026-08-28T09:54:47.7222641Z         "int"
2026-08-28T09:54:47.7222899Z       ],
2026-08-28T09:54:47.7223185Z       "stages": {
2026-08-28T09:54:47.7223437Z         "doc": {
2026-08-28T09:54:47.7223810Z           "complete": false,
2026-08-28T09:54:47.7224076Z           "evidence": []
2026-08-28T09:54:47.7224338Z         },
2026-08-28T09:54:47.7224600Z         "impl": {
2026-08-28T09:54:47.7224887Z           "complete": true,
2026-08-28T09:54:47.7225157Z           "evidence": [
2026-08-28T09:54:47.7225408Z             {
2026-08-28T09:54:47.7225733Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7226004Z               "line": 7510
2026-08-28T09:54:47.7226280Z             },
2026-08-28T09:54:47.7226543Z             {
2026-08-28T09:54:47.7227011Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7227378Z               "line": 262
2026-08-28T09:54:47.7227626Z             },
2026-08-28T09:54:47.7227876Z             {
2026-08-28T09:54:47.7228229Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7228501Z               "line": 486
2026-08-28T09:54:47.7228760Z             },
2026-08-28T09:54:47.7229103Z             {
2026-08-28T09:54:47.7229464Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7229736Z               "line": 599
2026-08-28T09:54:47.7229994Z             },
2026-08-28T09:54:47.7230246Z             {
2026-08-28T09:54:47.7230597Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7230873Z               "line": 1276
2026-08-28T09:54:47.7231130Z             },
2026-08-28T09:54:47.7231378Z             {
2026-08-28T09:54:47.7231736Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7232012Z               "line": 1299
2026-08-28T09:54:47.7232274Z             },
2026-08-28T09:54:47.7232532Z             {
2026-08-28T09:54:47.7232880Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7233155Z               "line": 1404
2026-08-28T09:54:47.7233406Z             }
2026-08-28T09:54:47.7233663Z           ]
2026-08-28T09:54:47.7233916Z         },
2026-08-28T09:54:47.7234245Z         "int": {
2026-08-28T09:54:47.7234522Z           "complete": true,
2026-08-28T09:54:47.7234803Z           "evidence": [
2026-08-28T09:54:47.7235061Z             {
2026-08-28T09:54:47.7235419Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:47.7235698Z               "line": 1115
2026-08-28T09:54:47.7235954Z             }
2026-08-28T09:54:47.7236210Z           ]
2026-08-28T09:54:47.7236459Z         },
2026-08-28T09:54:47.7236722Z         "unit": {
2026-08-28T09:54:47.7236998Z           "complete": true,
2026-08-28T09:54:47.7237271Z           "evidence": [
2026-08-28T09:54:47.7237586Z             {
2026-08-28T09:54:47.7237938Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7238220Z               "line": 2422
2026-08-28T09:54:47.7238470Z             },
2026-08-28T09:54:47.7238732Z             {
2026-08-28T09:54:47.7239158Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7239434Z               "line": 2444
2026-08-28T09:54:47.7239681Z             },
2026-08-28T09:54:47.7239939Z             {
2026-08-28T09:54:47.7240301Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7240573Z               "line": 2464
2026-08-28T09:54:47.7240830Z             }
2026-08-28T09:54:47.7241090Z           ]
2026-08-28T09:54:47.7241347Z         }
2026-08-28T09:54:47.7241599Z       }
2026-08-28T09:54:47.7241853Z     },
2026-08-28T09:54:47.7242101Z     {
2026-08-28T09:54:47.7242458Z       "id": "REQ-PICKER-RESUME-CONTEXT-PANEL",
2026-08-28T09:54:47.7245889Z       "title": "#6: the 'Resume from history' view keeps the endpoint's 'Confirm selection' top panel and swaps ONLY the bottom panel to 'Resume from a prior session' — the user stays contextually informed about what they're picking (today the resume view replaces the whole screen). crates/spt/src/picker/view.rs (resume screen) + model screen state. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #6.",
2026-08-28T09:54:47.7246187Z       "requiredStages": [
2026-08-28T09:54:47.7246461Z         "impl",
2026-08-28T09:54:47.7246714Z         "unit"
2026-08-28T09:54:47.7247067Z       ],
2026-08-28T09:54:47.7247343Z       "stages": {
2026-08-28T09:54:47.7247601Z         "doc": {
2026-08-28T09:54:47.7247892Z           "complete": false,
2026-08-28T09:54:47.7248235Z           "evidence": []
2026-08-28T09:54:47.7248636Z         },
2026-08-28T09:54:47.7249098Z         "impl": {
2026-08-28T09:54:47.7249541Z           "complete": true,
2026-08-28T09:54:47.7249932Z           "evidence": [
2026-08-28T09:54:47.7250318Z             {
2026-08-28T09:54:47.7250847Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7251394Z               "line": 712
2026-08-28T09:54:47.7251803Z             }
2026-08-28T09:54:47.7252202Z           ]
2026-08-28T09:54:47.7252575Z         },
2026-08-28T09:54:47.7253009Z         "int": {
2026-08-28T09:54:47.7253438Z           "complete": false,
2026-08-28T09:54:47.7253849Z           "evidence": []
2026-08-28T09:54:47.7254238Z         },
2026-08-28T09:54:47.7254656Z         "unit": {
2026-08-28T09:54:47.7255093Z           "complete": true,
2026-08-28T09:54:47.7255543Z           "evidence": [
2026-08-28T09:54:47.7255904Z             {
2026-08-28T09:54:47.7256454Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7256852Z               "line": 1311
2026-08-28T09:54:47.7257288Z             }
2026-08-28T09:54:47.7257689Z           ]
2026-08-28T09:54:47.7258091Z         }
2026-08-28T09:54:47.7258505Z       }
2026-08-28T09:54:47.7258819Z     },
2026-08-28T09:54:47.7259172Z     {
2026-08-28T09:54:47.7259543Z       "id": "REQ-PICKER-SHORTCUT-LABEL-FILENAME",
2026-08-28T09:54:47.7264579Z       "title": "B-4 (F029, operator): the confirm-panel shortcut option label is a static `New/Update spt-<id> shortcut (s)` placeholder — it should name the REAL file it writes: `Set shortcut here --> <current dir>/<shortcut-name>` where <shortcut-name> is the EXACT on-disk filename (incl. extension). The name must be produced by the SAME function that names the file in shortcut creation (picker/shortcut.rs shortcut_filename over the manifest-resolved basename) so label and writer can NEVER drift. Anchor picker/view.rs confirm_option_label. See triage B-4.",
2026-08-28T09:54:47.7265034Z       "requiredStages": [
2026-08-28T09:54:47.7265296Z         "impl",
2026-08-28T09:54:47.7265559Z         "unit"
2026-08-28T09:54:47.7265812Z       ],
2026-08-28T09:54:47.7266074Z       "stages": {
2026-08-28T09:54:47.7266326Z         "doc": {
2026-08-28T09:54:47.7266608Z           "complete": false,
2026-08-28T09:54:47.7266880Z           "evidence": []
2026-08-28T09:54:47.7267207Z         },
2026-08-28T09:54:47.7267472Z         "impl": {
2026-08-28T09:54:47.7267750Z           "complete": true,
2026-08-28T09:54:47.7268026Z           "evidence": [
2026-08-28T09:54:47.7268274Z             {
2026-08-28T09:54:47.7268636Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7268913Z               "line": 537
2026-08-28T09:54:47.7269271Z             }
2026-08-28T09:54:47.7269528Z           ]
2026-08-28T09:54:47.7269789Z         },
2026-08-28T09:54:47.7270051Z         "int": {
2026-08-28T09:54:47.7270333Z           "complete": false,
2026-08-28T09:54:47.7270604Z           "evidence": []
2026-08-28T09:54:47.7270853Z         },
2026-08-28T09:54:47.7271124Z         "unit": {
2026-08-28T09:54:47.7271405Z           "complete": true,
2026-08-28T09:54:47.7271681Z           "evidence": [
2026-08-28T09:54:47.7271934Z             {
2026-08-28T09:54:47.7272282Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7272561Z               "line": 1231
2026-08-28T09:54:47.7272813Z             }
2026-08-28T09:54:47.7273075Z           ]
2026-08-28T09:54:47.7273433Z         }
2026-08-28T09:54:47.7273691Z       }
2026-08-28T09:54:47.7273938Z     },
2026-08-28T09:54:47.7274201Z     {
2026-08-28T09:54:47.7274554Z       "id": "REQ-PICKER-START-PROJECT-CHOICE",
2026-08-28T09:54:47.7279963Z       "title": "#5: after 'Start now' in the endpoint picker, swap the bottom Options panel to a 'Choose project' list: (1) the endpoint's most recent project dir, (2) 'Here: <dir>' — the picker's launch cwd (only if different), (3) all other project-history dirs newest->oldest. Fire the step ONLY when (A) the run cwd mismatches a singular history entry, or (B) history has >1 entry; otherwise start immediately (today's behavior). Depends on REQ-PICKER-PROJECT-HISTORY-TRUTH (needs full DIRS from sessions.log, owlery-internal exclusion applies). Start-now is local-only (no gossip). See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #5.",
2026-08-28T09:54:47.7280359Z       "requiredStages": [
2026-08-28T09:54:47.7280620Z         "impl",
2026-08-28T09:54:47.7280935Z         "unit"
2026-08-28T09:54:47.7281203Z       ],
2026-08-28T09:54:47.7281460Z       "stages": {
2026-08-28T09:54:47.7281722Z         "doc": {
2026-08-28T09:54:47.7282003Z           "complete": false,
2026-08-28T09:54:47.7282280Z           "evidence": []
2026-08-28T09:54:47.7282533Z         },
2026-08-28T09:54:47.7282808Z         "impl": {
2026-08-28T09:54:47.7283088Z           "complete": true,
2026-08-28T09:54:47.7283369Z           "evidence": [
2026-08-28T09:54:47.7283621Z             {
2026-08-28T09:54:47.7283985Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7284260Z               "line": 1546
2026-08-28T09:54:47.7284512Z             },
2026-08-28T09:54:47.7284765Z             {
2026-08-28T09:54:47.7285114Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7285385Z               "line": 1569
2026-08-28T09:54:47.7285648Z             }
2026-08-28T09:54:47.7285919Z           ]
2026-08-28T09:54:47.7286173Z         },
2026-08-28T09:54:47.7286435Z         "int": {
2026-08-28T09:54:47.7286726Z           "complete": false,
2026-08-28T09:54:47.7287003Z           "evidence": []
2026-08-28T09:54:47.7287261Z         },
2026-08-28T09:54:47.7287524Z         "unit": {
2026-08-28T09:54:47.7287810Z           "complete": true,
2026-08-28T09:54:47.7288082Z           "evidence": [
2026-08-28T09:54:47.7288399Z             {
2026-08-28T09:54:47.7288759Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7289137Z               "line": 2527
2026-08-28T09:54:47.7289399Z             },
2026-08-28T09:54:47.7289650Z             {
2026-08-28T09:54:47.7290013Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7290285Z               "line": 2552
2026-08-28T09:54:47.7290548Z             },
2026-08-28T09:54:47.7290800Z             {
2026-08-28T09:54:47.7291157Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:47.7291491Z               "line": 2594
2026-08-28T09:54:47.7291743Z             },
2026-08-28T09:54:47.7292011Z             {
2026-08-28T09:54:47.7292354Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:47.7292626Z               "line": 1260
2026-08-28T09:54:47.7292883Z             }
2026-08-28T09:54:47.7293140Z           ]
2026-08-28T09:54:47.7293392Z         }
2026-08-28T09:54:47.7293649Z       }
2026-08-28T09:54:47.7293900Z     },
2026-08-28T09:54:47.7294147Z     {
2026-08-28T09:54:47.7294462Z       "id": "REQ-PICKER-UX-V013",
2026-08-28T09:54:47.7299111Z       "title": "`spt endpoint run` picker UX (v0.13.0 operator dogfooding): (1) SKIP the first screen — open directly on 'Pick existing'; `n` jumps to 'Create new'. (2) AUTO-ATTACH after both Start-new AND Resume-from-history (both currently don't attach and show no stdout); add an `h` shortcut to run headless (no attach). (3) 'controlled by' shows the node NAME (node_label_display), not the raw hex. (4) Clean up Start-new output — drop the Rust `pid=Some(142748)` leak and the 'harness binds its perch on startup' internals; user-friendly, not a process log. (v0.13.0)",
2026-08-28T09:54:47.7299430Z       "requiredStages": [],
2026-08-28T09:54:47.7299692Z       "stages": {
2026-08-28T09:54:47.7299949Z         "doc": {
2026-08-28T09:54:47.7300240Z           "complete": false,
2026-08-28T09:54:47.7300520Z           "evidence": []
2026-08-28T09:54:47.7300779Z         },
2026-08-28T09:54:47.7301046Z         "impl": {
2026-08-28T09:54:47.7301407Z           "complete": false,
2026-08-28T09:54:47.7301680Z           "evidence": []
2026-08-28T09:54:47.7301937Z         },
2026-08-28T09:54:47.7302199Z         "int": {
2026-08-28T09:54:47.7302489Z           "complete": false,
2026-08-28T09:54:47.7302780Z           "evidence": []
2026-08-28T09:54:47.7303033Z         },
2026-08-28T09:54:47.7303295Z         "unit": {
2026-08-28T09:54:47.7303573Z           "complete": false,
2026-08-28T09:54:47.7303854Z           "evidence": []
2026-08-28T09:54:47.7304114Z         }
2026-08-28T09:54:47.7304369Z       }
2026-08-28T09:54:47.7304679Z     },
2026-08-28T09:54:47.7304927Z     {
2026-08-28T09:54:47.7305252Z       "id": "REQ-PICKER-WINDOW-TITLE",
2026-08-28T09:54:47.7309894Z       "title": "B-5 (F029, operator): `spt endpoint run`'s interactive picker window/tab is untitled — hard to find among many terminals. Set the window/tab title to `SPT Endpoint Picker`. Anchor picker/mod.rs:88 setup_terminal (crossterm SetTitle in the execute! chain). Set-only is acceptable (crossterm can't cheaply read the prior title to restore). Applies ONLY to the interactive picker path — a non-interactive/headless bringup (REQ-HOST-RUN-1) must NOT retitle the operator's terminal. See triage B-5.",
2026-08-28T09:54:47.7310219Z       "requiredStages": [
2026-08-28T09:54:47.7310480Z         "impl"
2026-08-28T09:54:47.7310733Z       ],
2026-08-28T09:54:47.7311000Z       "stages": {
2026-08-28T09:54:47.7311258Z         "doc": {
2026-08-28T09:54:47.7311540Z           "complete": false,
2026-08-28T09:54:47.7311817Z           "evidence": []
2026-08-28T09:54:47.7312088Z         },
2026-08-28T09:54:47.7312343Z         "impl": {
2026-08-28T09:54:47.7312635Z           "complete": true,
2026-08-28T09:54:47.7312916Z           "evidence": [
2026-08-28T09:54:47.7313174Z             {
2026-08-28T09:54:47.7313531Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:47.7313804Z               "line": 103
2026-08-28T09:54:47.7314142Z             }
2026-08-28T09:54:47.7314410Z           ]
2026-08-28T09:54:47.7314670Z         },
2026-08-28T09:54:47.7314934Z         "int": {
2026-08-28T09:54:47.7315225Z           "complete": false,
2026-08-28T09:54:47.7315506Z           "evidence": []
2026-08-28T09:54:47.7315759Z         },
2026-08-28T09:54:47.7316032Z         "unit": {
2026-08-28T09:54:47.7316313Z           "complete": false,
2026-08-28T09:54:47.7316595Z           "evidence": []
2026-08-28T09:54:47.7316846Z         }
2026-08-28T09:54:47.7317104Z       }
2026-08-28T09:54:47.7317352Z     },
2026-08-28T09:54:47.7317669Z     {
2026-08-28T09:54:47.7317983Z       "id": "REQ-PID-ROLE-EVIDENCE",
2026-08-28T09:54:47.7342853Z       "title": "THE RECORDED PID MUST CARRY WHAT IT MEANS. `info.pid` has two incompatible meanings decided by write path, and every reader has been guessing: the `api listen` path records a process that GENUINELY HOLDS the endpoint (its death IS the endpoint's relay death), while the `api bind` path records the announcing CLI, which is EXPECTED TO EXIT within seconds and whose death means NOTHING — the hosting life it announced (a broker PTY session) is not recorded anywhere in the row. LIVE MEASUREMENT (todlando, HFENDULEAM 2026-07-27, the finding that forced this mint): todlando pid 22588 DEAD, doyle pid 45160 DEAD, deployah pid 29176 DEAD — all controllable=true, state=live_agent, status=online, and all three GENUINELY ALIVE AND WORKING (the measurement was taken by one of them, messaging another) — against hertz pid 11216 ALIVE and mobile-gw pid 46152 ALIVE, which are real `api listen` relays. The split is by adapter integration pattern (claude-spt binds and exits; omp-spt/mobile hold a listener), NOT by anything a reader can see in the record. CONSEQUENCE ALREADY PAID: two proposed fixes for the emphasys convergence gap were BOTH falsified pre-build on this fact — oracle-first convergence, and carry-forward scoped to 'earning pid alive' — each would have converged three live agents node-wide. Both were keyed on a pid whose meaning they could not read. FIX: stamp the role at the seam that writes the pid — `relay` on the listen path, `binder` on every bind path — never inferred at read time. Absent ⇒ legacy row ⇒ NO KNOWLEDGE, and every consumer fails toward alive (inheritance stands, convergence never fires); such rows heal at their next re-bind. Consumers re-key on it: relay-death convergence fires only on `relay`, and the controllable carry-forward drops a stamp only when a prior `relay` pid is provably Gone. CLASS: a claim keyed on the wrong thing (kin: `is_perch_alive` reading a status FIELD as hosting topology; the inherited capability stamp routing a liveness proof) — the cure is to make the record SAY the thing rather than have readers infer it. AUDIT RIDER (doyle, required in the doc stage since convergence re-keys on this field): enumerate which row classes reach the convergence branch under the new key — fresh NonAgent/None rows, shell instances, gateway listens — and pin the answer structurally, not just for tonight's node. Gate: doc — the record-shape doc carries the field, the two meanings it ends, the legacy/no-knowledge rule, and the audit-rider enumeration; impl — the field on InfoJson stamped from the entry path at the bind seam, plus both consumer re-keys; unit — the role-stamp table over the three hosting authorities, the carry-forward table incl. the claude-spt-shaped NEGATIVE (binder-role dead pid + Some(true) + listener re-bind ⇒ inheritance STANDS, row never routes to convergence), and the convergence role gate incl. the legacy-absent row; int — the synthetic emphasys template (relay-role + dead pid/parent + valid birth stamp + listener-only re-bind ⇒ derives fresh ⇒ routes to convergence ⇒ oracle Gone ⇒ converged) with a BrokerPty sibling that re-asserts fresh and is untouched.",
2026-08-28T09:54:47.7343410Z       "requiredStages": [
2026-08-28T09:54:47.7343672Z         "doc",
2026-08-28T09:54:47.7343929Z         "impl",
2026-08-28T09:54:47.7344187Z         "unit",
2026-08-28T09:54:47.7344578Z         "int"
2026-08-28T09:54:47.7344830Z       ],
2026-08-28T09:54:47.7345108Z       "stages": {
2026-08-28T09:54:47.7345354Z         "doc": {
2026-08-28T09:54:47.7345636Z           "complete": true,
2026-08-28T09:54:47.7345903Z           "evidence": [
2026-08-28T09:54:47.7346160Z             {
2026-08-28T09:54:47.7346459Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.7346729Z               "line": 251
2026-08-28T09:54:47.7346982Z             }
2026-08-28T09:54:47.7347244Z           ]
2026-08-28T09:54:47.7347492Z         },
2026-08-28T09:54:47.7347750Z         "impl": {
2026-08-28T09:54:47.7348136Z           "complete": true,
2026-08-28T09:54:47.7348417Z           "evidence": [
2026-08-28T09:54:47.7348675Z             {
2026-08-28T09:54:47.7349122Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.7349411Z               "line": 752
2026-08-28T09:54:47.7349664Z             },
2026-08-28T09:54:47.7349926Z             {
2026-08-28T09:54:47.7350279Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.7350565Z               "line": 371
2026-08-28T09:54:47.7350822Z             },
2026-08-28T09:54:47.7351074Z             {
2026-08-28T09:54:47.7351418Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7351688Z               "line": 234
2026-08-28T09:54:47.7351949Z             },
2026-08-28T09:54:47.7352202Z             {
2026-08-28T09:54:47.7352549Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7352822Z               "line": 263
2026-08-28T09:54:47.7353075Z             },
2026-08-28T09:54:47.7353336Z             {
2026-08-28T09:54:47.7353689Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7353965Z               "line": 338
2026-08-28T09:54:47.7354213Z             },
2026-08-28T09:54:47.7354471Z             {
2026-08-28T09:54:47.7354823Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7355099Z               "line": 698
2026-08-28T09:54:47.7355386Z             }
2026-08-28T09:54:47.7355629Z           ]
2026-08-28T09:54:47.7355963Z         },
2026-08-28T09:54:47.7356220Z         "int": {
2026-08-28T09:54:47.7356501Z           "complete": true,
2026-08-28T09:54:47.7356753Z           "evidence": [
2026-08-28T09:54:47.7357024Z             {
2026-08-28T09:54:47.7357475Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:47.7357747Z               "line": 409
2026-08-28T09:54:47.7358000Z             }
2026-08-28T09:54:47.7358244Z           ]
2026-08-28T09:54:47.7358501Z         },
2026-08-28T09:54:47.7358758Z         "unit": {
2026-08-28T09:54:47.7359116Z           "complete": true,
2026-08-28T09:54:47.7359446Z           "evidence": [
2026-08-28T09:54:47.7359701Z             {
2026-08-28T09:54:47.7360060Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7360338Z               "line": 1315
2026-08-28T09:54:47.7360595Z             },
2026-08-28T09:54:47.7360848Z             {
2026-08-28T09:54:47.7361206Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7361483Z               "line": 1344
2026-08-28T09:54:47.7361741Z             },
2026-08-28T09:54:47.7361993Z             {
2026-08-28T09:54:47.7362349Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7362618Z               "line": 1392
2026-08-28T09:54:47.7362899Z             }
2026-08-28T09:54:47.7363167Z           ]
2026-08-28T09:54:47.7363415Z         }
2026-08-28T09:54:47.7363677Z       }
2026-08-28T09:54:47.7363930Z     },
2026-08-28T09:54:47.7364182Z     {
2026-08-28T09:54:47.7364488Z       "id": "REQ-PLATFORM-MUSL",
2026-08-28T09:54:47.7371690Z       "title": "MUSL-TIER W2 (register the musl platform, self-IDENTIFY): add x86_64-unknown-linux-musl to the W1 registry — a current_platform() cfg arm (target_arch=x86_64, target_os=linux, target_env=musl -> the musl triple, NO more 'unknown' fallback), asset name spt-x86_64-linux-musl, triple-map entry. PROVEN (doyle /diagnose 2026-07-08, backlog #14): the current tree builds+runs static musl with ZERO source changes (rustls not openssl; aws-lc-sys+bundled-sqlite clean under musl-gcc; openpty; DNS/HTTPS works statically) — so W2 is registry DATA + cfg + asset map, NO dependency changes. Gate: a musl-built spt self-reports x86_64-unknown-linux-musl (not 'unknown'); registry-membership unit (the cfg arm is cross-target, unit the registry not the arm); build the musl target in-gate (kitsubito toolchain) and assert current_platform.",
2026-08-28T09:54:47.7372080Z       "requiredStages": [
2026-08-28T09:54:47.7372339Z         "impl",
2026-08-28T09:54:47.7372658Z         "unit"
2026-08-28T09:54:47.7372913Z       ],
2026-08-28T09:54:47.7373187Z       "stages": {
2026-08-28T09:54:47.7373445Z         "doc": {
2026-08-28T09:54:47.7378348Z           "complete": false,
2026-08-28T09:54:47.7378662Z           "evidence": []
2026-08-28T09:54:47.7378924Z         },
2026-08-28T09:54:47.7379277Z         "impl": {
2026-08-28T09:54:47.7379563Z           "complete": true,
2026-08-28T09:54:47.7379844Z           "evidence": [
2026-08-28T09:54:47.7380111Z             {
2026-08-28T09:54:47.7380503Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7380769Z               "line": 229
2026-08-28T09:54:47.7381035Z             },
2026-08-28T09:54:47.7381287Z             {
2026-08-28T09:54:47.7381673Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7381950Z               "line": 274
2026-08-28T09:54:47.7382207Z             }
2026-08-28T09:54:47.7382459Z           ]
2026-08-28T09:54:47.7382712Z         },
2026-08-28T09:54:47.7382978Z         "int": {
2026-08-28T09:54:47.7383270Z           "complete": false,
2026-08-28T09:54:47.7383555Z           "evidence": []
2026-08-28T09:54:47.7383805Z         },
2026-08-28T09:54:47.7384072Z         "unit": {
2026-08-28T09:54:47.7384354Z           "complete": true,
2026-08-28T09:54:47.7384630Z           "evidence": [
2026-08-28T09:54:47.7384883Z             {
2026-08-28T09:54:47.7385255Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7385632Z               "line": 765
2026-08-28T09:54:47.7385884Z             },
2026-08-28T09:54:47.7386147Z             {
2026-08-28T09:54:47.7386508Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7386790Z               "line": 780
2026-08-28T09:54:47.7387047Z             }
2026-08-28T09:54:47.7387309Z           ]
2026-08-28T09:54:47.7387561Z         }
2026-08-28T09:54:47.7387820Z       }
2026-08-28T09:54:47.7388072Z     },
2026-08-28T09:54:47.7388326Z     {
2026-08-28T09:54:47.7388643Z       "id": "REQ-PLATFORM-REGISTRY",
2026-08-28T09:54:47.7398370Z       "title": "MUSL-TIER W1 (target-triple centralization, behaviour-NEUTRAL refactor): ONE authoritative platform registry from which current_platform(), KNOWN_TARGET_TRIPLES, the applyhost cross-platform 'other' logic, and the asset-name<->triple map all derive. ROOT: the target triple x86_64-unknown-linux-gnu + the implicit 'exactly 2 platforms' assumption are hardcoded across ~6 sites (release.rs current_platform cfg + KNOWN_TARGET_TRIPLES, applyhost.rs:740-743 win/linux binary if/else, xtask asset map, release.yml), so adding any platform (musl, future arm64) is a scattered edit. FIX: a data-driven registry (candidate: SUPPORTED_PLATFORMS const table of {triple, asset_name}) + generalize applyhost 'other' to 'every registered platform except current_platform()'. gnu+windows behaviour BYTE-IDENTICAL — the existing release/update/apply/propagate suites stay green (that is the gate). DESIGN FORK (doyle rules pre-dispatch): enum vs const-table; applyhost N-platform generalization; current_platform stays cfg->triple but output must be a registry member, loud 'unknown' fallback kept.",
2026-08-28T09:54:47.7398780Z       "requiredStages": [
2026-08-28T09:54:47.7399246Z         "impl",
2026-08-28T09:54:47.7399640Z         "unit"
2026-08-28T09:54:47.7399954Z       ],
2026-08-28T09:54:47.7400222Z       "stages": {
2026-08-28T09:54:47.7400475Z         "doc": {
2026-08-28T09:54:47.7400856Z           "complete": false,
2026-08-28T09:54:47.7401128Z           "evidence": []
2026-08-28T09:54:47.7401386Z         },
2026-08-28T09:54:47.7401647Z         "impl": {
2026-08-28T09:54:47.7401937Z           "complete": true,
2026-08-28T09:54:47.7402207Z           "evidence": [
2026-08-28T09:54:47.7402469Z             {
2026-08-28T09:54:47.7402846Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7403117Z               "line": 210
2026-08-28T09:54:47.7403380Z             },
2026-08-28T09:54:47.7403633Z             {
2026-08-28T09:54:47.7404048Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7404320Z               "line": 219
2026-08-28T09:54:47.7404580Z             },
2026-08-28T09:54:47.7404835Z             {
2026-08-28T09:54:47.7405197Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7405474Z               "line": 241
2026-08-28T09:54:47.7405727Z             },
2026-08-28T09:54:47.7405993Z             {
2026-08-28T09:54:47.7406357Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7406637Z               "line": 259
2026-08-28T09:54:47.7406896Z             },
2026-08-28T09:54:47.7407158Z             {
2026-08-28T09:54:47.7407475Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.7407752Z               "line": 1260
2026-08-28T09:54:47.7408005Z             }
2026-08-28T09:54:47.7408254Z           ]
2026-08-28T09:54:47.7408506Z         },
2026-08-28T09:54:47.7408764Z         "int": {
2026-08-28T09:54:47.7409136Z           "complete": false,
2026-08-28T09:54:47.7409413Z           "evidence": []
2026-08-28T09:54:47.7409677Z         },
2026-08-28T09:54:47.7409942Z         "unit": {
2026-08-28T09:54:47.7410229Z           "complete": true,
2026-08-28T09:54:47.7410510Z           "evidence": [
2026-08-28T09:54:47.7410763Z             {
2026-08-28T09:54:47.7411130Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7411402Z               "line": 750
2026-08-28T09:54:47.7411665Z             },
2026-08-28T09:54:47.7411989Z             {
2026-08-28T09:54:47.7412365Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7412635Z               "line": 760
2026-08-28T09:54:47.7412895Z             },
2026-08-28T09:54:47.7413152Z             {
2026-08-28T09:54:47.7413510Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:47.7413791Z               "line": 765
2026-08-28T09:54:47.7414045Z             }
2026-08-28T09:54:47.7414307Z           ]
2026-08-28T09:54:47.7414560Z         }
2026-08-28T09:54:47.7414818Z       }
2026-08-28T09:54:47.7415069Z     },
2026-08-28T09:54:47.7415376Z     {
2026-08-28T09:54:47.7415705Z       "id": "REQ-POOL-CLAIM-TREE-MATCH",
2026-08-28T09:54:47.7424243Z       "title": "POOL-CLAIM MUST REFUSE BEFORE WRITING WHEN --POOL BELONGS TO A DIFFERENT GIT WORKTREE THAN THE CALLER'S CWD, UNLESS THE CALLER EXPLICITLY OPTS INTO THE SANCTIONED SEQUENTIAL TAKEOVER WITH --foreign-pool. The claim verb harvests owner_tree, branch, and base from cwd; an accidental crossing therefore writes a confidently wrong ownership record and reports success. A deliberate crossing is required by the build guard's own takeover remedy: it remains cwd-authored so the arriving lane becomes the owner, but the flag and diagnostic make that identity source loud. The guard's printed cross-tree pool-claim remedies carry the flag, and an executable test proves the verb admits that exact shape. This validates identity harvest only: pool-claim still writes without adjudicating admission, and every ownership enforcement arm remains in the subsequent build (IR-42). Default-refusal discovery resolves the pool's worktree from its nearest existing ancestor, including before the pool exists. (IR-56)",
2026-08-28T09:54:47.7424552Z       "requiredStages": [
2026-08-28T09:54:47.7424815Z         "impl",
2026-08-28T09:54:47.7425073Z         "unit"
2026-08-28T09:54:47.7425334Z       ],
2026-08-28T09:54:47.7425595Z       "stages": {
2026-08-28T09:54:47.7425912Z         "doc": {
2026-08-28T09:54:47.7426199Z           "complete": false,
2026-08-28T09:54:47.7426470Z           "evidence": []
2026-08-28T09:54:47.7426733Z         },
2026-08-28T09:54:47.7426991Z         "impl": {
2026-08-28T09:54:47.7427272Z           "complete": true,
2026-08-28T09:54:47.7427547Z           "evidence": [
2026-08-28T09:54:47.7427800Z             {
2026-08-28T09:54:47.7428129Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.7428411Z               "line": 2547
2026-08-28T09:54:47.7428664Z             }
2026-08-28T09:54:47.7429055Z           ]
2026-08-28T09:54:47.7429321Z         },
2026-08-28T09:54:47.7429579Z         "int": {
2026-08-28T09:54:47.7429860Z           "complete": false,
2026-08-28T09:54:47.7430141Z           "evidence": []
2026-08-28T09:54:47.7430398Z         },
2026-08-28T09:54:47.7430655Z         "unit": {
2026-08-28T09:54:47.7430940Z           "complete": true,
2026-08-28T09:54:47.7431211Z           "evidence": [
2026-08-28T09:54:47.7431468Z             {
2026-08-28T09:54:47.7431792Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.7432073Z               "line": 2641
2026-08-28T09:54:47.7432330Z             },
2026-08-28T09:54:47.7432584Z             {
2026-08-28T09:54:47.7432951Z               "path": "crates/xtask/tests/pool_claim.rs",
2026-08-28T09:54:47.7433222Z               "line": 31
2026-08-28T09:54:47.7433481Z             }
2026-08-28T09:54:47.7433741Z           ]
2026-08-28T09:54:47.7433991Z         }
2026-08-28T09:54:47.7434249Z       }
2026-08-28T09:54:47.7434498Z     },
2026-08-28T09:54:47.7434755Z     {
2026-08-28T09:54:47.7435227Z       "id": "REQ-POOL-FOREIGN-TREE-REFUSED",
2026-08-28T09:54:47.7454506Z       "title": "A SOURCE TREE MUST NOT SILENTLY BUILD INTO A CARGO TARGET DIRECTORY THAT BELONGS TO ANOTHER SOURCE TREE. Two trees sharing one pool overwrite each other artifacts -- measured, not inferred: two packages of the same name and version built from two DIFFERENT paths resolve to ONE build-script output dir. In the v0.51.0 BAROMETER W1/H1 window that fabricated an E0308 in a gate lane which vanished on re-run, a red belonging to neither tree. THE REFUSAL KEYS ON THE RELATIONSHIP, NEVER ON A PATH: the incident that motivated the filing was reached by CARGO_TARGET_DIR pointed at the primary checkout, a directory no path-shaped rule about .worktrees/ would have covered, and a path rule also leaves the primary checkout target as the one unowned pool every agent can name from memory. THE HARM IS INTERLEAVING, NOT SIMULTANEITY -- cargo already holds an exclusive .cargo-lock for a build duration, so two builds are never literally concurrent; what bit was one lane artifacts being invalidated by another between that lane own steps. So the unit of ownership is the LANE, and a lease keyed on a cargo process would be stale seconds after every claim, making every crossing a takeover and the refusal arm UNREACHABLE -- a gate whose failure signature is silence, refused on that evidence. CLAIM AND ENFORCEMENT ARE SPLIT: the lane claim is written at lane start by the rig and names a long-lived holder (pid plus pid_started_at, because a pid alone is unsound across a reboot and a recycled pid would read as a live lane forever); the build script never claims, only enforces. STALENESS IS PROVEN BY THE PROCESS TABLE WITH THE BIRTH STAMP -- holder absent, or present with a mismatched birth -- and mtime or any derived view never counts; UNKNOWN IS NOT STALE, so an unresolvable holder proceeds with a warning and is neither taken over nor refused. A stale holder is a LOUD TAKEOVER rather than a refusal, because sequential sharing is the cheap correct case and refusing it would demand a pool per lane (30+ worktrees at 7-15 GB measured = 210-450 GB, several times the disk the incident was about). An OWNERLESS pool imprints its first builder and proceeds -- a developer own fresh target is never refused -- while an imprinted pool with NO lane claim refuses a foreign tree and prints the claim command, which is how the discipline gap becomes loud instead of permissive. The escape hatch is an env var and prints EVEN WHEN IT WORKS: a silent override would reproduce the original incident exactly.",
2026-08-28T09:54:47.7455054Z       "requiredStages": [
2026-08-28T09:54:47.7455313Z         "doc",
2026-08-28T09:54:47.7455584Z         "impl",
2026-08-28T09:54:47.7455838Z         "unit"
2026-08-28T09:54:47.7456429Z       ],
2026-08-28T09:54:47.7456695Z       "stages": {
2026-08-28T09:54:47.7456952Z         "doc": {
2026-08-28T09:54:47.7457238Z           "complete": true,
2026-08-28T09:54:47.7457513Z           "evidence": [
2026-08-28T09:54:47.7457851Z             {
2026-08-28T09:54:47.7458185Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.7458451Z               "line": 356
2026-08-28T09:54:47.7458705Z             }
2026-08-28T09:54:47.7459053Z           ]
2026-08-28T09:54:47.7459305Z         },
2026-08-28T09:54:47.7459572Z         "impl": {
2026-08-28T09:54:47.7459863Z           "complete": true,
2026-08-28T09:54:47.7460167Z           "evidence": [
2026-08-28T09:54:47.7460429Z             {
2026-08-28T09:54:47.7460810Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7461087Z               "line": 78
2026-08-28T09:54:47.7461359Z             },
2026-08-28T09:54:47.7461636Z             {
2026-08-28T09:54:47.7462012Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7462289Z               "line": 212
2026-08-28T09:54:47.7462545Z             }
2026-08-28T09:54:47.7462800Z           ]
2026-08-28T09:54:47.7463052Z         },
2026-08-28T09:54:47.7463315Z         "int": {
2026-08-28T09:54:47.7463601Z           "complete": false,
2026-08-28T09:54:47.7463888Z           "evidence": []
2026-08-28T09:54:47.7464146Z         },
2026-08-28T09:54:47.7464407Z         "unit": {
2026-08-28T09:54:47.7464698Z           "complete": true,
2026-08-28T09:54:47.7464970Z           "evidence": [
2026-08-28T09:54:47.7465227Z             {
2026-08-28T09:54:47.7465596Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7465878Z               "line": 741
2026-08-28T09:54:47.7466211Z             },
2026-08-28T09:54:47.7466468Z             {
2026-08-28T09:54:47.7466826Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7467089Z               "line": 753
2026-08-28T09:54:47.7467352Z             },
2026-08-28T09:54:47.7467599Z             {
2026-08-28T09:54:47.7467960Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7468233Z               "line": 798
2026-08-28T09:54:47.7468491Z             },
2026-08-28T09:54:47.7468754Z             {
2026-08-28T09:54:47.7469187Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7469541Z               "line": 850
2026-08-28T09:54:47.7469798Z             },
2026-08-28T09:54:47.7470060Z             {
2026-08-28T09:54:47.7470418Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7470694Z               "line": 917
2026-08-28T09:54:47.7470952Z             },
2026-08-28T09:54:47.7471214Z             {
2026-08-28T09:54:47.7471581Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7471848Z               "line": 942
2026-08-28T09:54:47.7472110Z             },
2026-08-28T09:54:47.7472367Z             {
2026-08-28T09:54:47.7472730Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7473000Z               "line": 967
2026-08-28T09:54:47.7473308Z             }
2026-08-28T09:54:47.7473551Z           ]
2026-08-28T09:54:47.7473795Z         }
2026-08-28T09:54:47.7474058Z       }
2026-08-28T09:54:47.7474304Z     },
2026-08-28T09:54:47.7474567Z     {
2026-08-28T09:54:47.7474891Z       "id": "REQ-POOL-GC-ORPHAN-RECLAIM",
2026-08-28T09:54:47.7493594Z       "title": "BUILD-CACHE POOLS ARE RECLAIMABLE ON EVIDENCE, NOT ON AGE OR NAME. Cargo never GCs a target directory and pools OUTLIVE the lanes that made them: this box carried gate-target-h1 at 17.5 GB with ZERO links pointing at it -- unreachable, unowned, and un-reclaimable by any mechanism that existed, because nothing recorded whose it was. The ownership stamp supplies the missing facts, so a sweep can classify rather than guess: IN USE (a lane holder live by the process-table-plus-birth-stamp predicate) is never touched; OWNED (owner tree still on disk, no live lane) is somebody's WARM CACHE and is reclaimed only when explicitly asked; ORPHANED (owner tree gone, or unstamped with nothing linking to it) is the safe row. WHAT MAKES A DIRECTORY A POOL IS CARGO'S OWN CACHEDIR.TAG SIGNATURE, never its name -- a sweep that decided by the word target could delete a source directory somebody happened to call that, and the point of this leg is a reclaim an operator can run without auditing it first. UNSTAMPED DOES NOT MEAN UNWANTED: an unstamped pool with inbound links is a pre-guard pool still in use, and getting that backwards would reclaim a live lane's cache on the very first sweep, since the pools predating the stamp are exactly the ones most likely to be somebody's. UNKNOWN LIVENESS COUNTS AS IN USE here, the opposite polarity from the guard's proceed-with-warning, because the consequences are asymmetric: an unresolvable holder that blocks a reclaim costs disk, while one that permits it costs a lane its cache. THE INBOUND SWEEP COMPLETES BEFORE ANY VERDICT -- a link found after the verdict is a link that did not save the pool -- and path comparison is normalized, since Windows records a junction target with a verbatim device prefix and arbitrary case and a raw compare would report zero inbound links for a pool half the box points at, orphaning every one of them. DRY RUN IS THE DEFAULT: the failure mode of a wrong reclaim is silent, nobody notices a deleted warm cache until the next build takes twenty minutes. Deletion re-asserts real-directory-not-link at the point of removal, because a reparse point removed as a tree takes its TARGET with it, and reports size and free space so the reclaim is a number rather than a claim.",
2026-08-28T09:54:47.7494040Z       "requiredStages": [
2026-08-28T09:54:47.7494310Z         "impl",
2026-08-28T09:54:47.7494630Z         "unit"
2026-08-28T09:54:47.7494882Z       ],
2026-08-28T09:54:47.7495144Z       "stages": {
2026-08-28T09:54:47.7495406Z         "doc": {
2026-08-28T09:54:47.7495691Z           "complete": false,
2026-08-28T09:54:47.7495973Z           "evidence": []
2026-08-28T09:54:47.7496230Z         },
2026-08-28T09:54:47.7496489Z         "impl": {
2026-08-28T09:54:47.7496776Z           "complete": true,
2026-08-28T09:54:47.7497064Z           "evidence": [
2026-08-28T09:54:47.7497323Z             {
2026-08-28T09:54:47.7497696Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7498020Z               "line": 631
2026-08-28T09:54:47.7498282Z             },
2026-08-28T09:54:47.7498535Z             {
2026-08-28T09:54:47.7498869Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:47.7499231Z               "line": 2713
2026-08-28T09:54:47.7499502Z             }
2026-08-28T09:54:47.7499763Z           ]
2026-08-28T09:54:47.7500015Z         },
2026-08-28T09:54:47.7500292Z         "int": {
2026-08-28T09:54:47.7500577Z           "complete": false,
2026-08-28T09:54:47.7500863Z           "evidence": []
2026-08-28T09:54:47.7501116Z         },
2026-08-28T09:54:47.7501383Z         "unit": {
2026-08-28T09:54:47.7501674Z           "complete": true,
2026-08-28T09:54:47.7501942Z           "evidence": [
2026-08-28T09:54:47.7502205Z             {
2026-08-28T09:54:47.7502565Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7502837Z               "line": 1014
2026-08-28T09:54:47.7503098Z             },
2026-08-28T09:54:47.7503356Z             {
2026-08-28T09:54:47.7503723Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7503995Z               "line": 1029
2026-08-28T09:54:47.7504252Z             },
2026-08-28T09:54:47.7504521Z             {
2026-08-28T09:54:47.7504884Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7505227Z               "line": 1066
2026-08-28T09:54:47.7505490Z             },
2026-08-28T09:54:47.7505748Z             {
2026-08-28T09:54:47.7506119Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7506391Z               "line": 1095
2026-08-28T09:54:47.7506648Z             },
2026-08-28T09:54:47.7506905Z             {
2026-08-28T09:54:47.7507283Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7507566Z               "line": 1130
2026-08-28T09:54:47.7507822Z             }
2026-08-28T09:54:47.7508076Z           ]
2026-08-28T09:54:47.7508385Z         }
2026-08-28T09:54:47.7508648Z       }
2026-08-28T09:54:47.7508895Z     },
2026-08-28T09:54:47.7509234Z     {
2026-08-28T09:54:47.7509583Z       "id": "REQ-POOL-GUARD-NOT-SILENCEABLE",
2026-08-28T09:54:47.7519750Z       "title": "THE POOL GUARD BUILD SCRIPT MUST EMIT NO `rerun-if` DIRECTIVE, AND A TEST MUST ENFORCE THAT RATHER THAN A COMMENT. MEASURED on a two-tree rig sharing one pool with the trees made BYTE-IDENTICAL (diff -r empty), sequence A B A A B: with no directives the script ran FOUR times (A, B, A, B) and the consecutive A A ran it once; with ONE cargo:rerun-if-changed added it ran ONCE and the foreign tree never ran it again at all. A script with no directives is re-run whenever cargo unit fingerprint changes, and that fingerprint carries CARGO_MANIFEST_DIR -- so it fires on exactly the source-tree ALTERNATION the guard exists to catch, fires even when the differing crate is one the script does not live in (the trigger is the tree PATH, not file content), and does not fire when a tree rebuilds itself. Adding a directive does not slow the guard, it SILENCES it, and only on the crossings that matter. A comment forbidding one is a prohibition, not a boundary -- it depends on the next reader -- so the canary reads the checked-in build script and reds if a directive appears. The canary carries its own POSITIVE CONTROL, because an assertion that no line matches is satisfied equally by a detector that matches nothing, including one broken by a later refactor.",
2026-08-28T09:54:47.7520133Z       "requiredStages": [
2026-08-28T09:54:47.7520400Z         "impl",
2026-08-28T09:54:47.7520651Z         "unit"
2026-08-28T09:54:47.7520906Z       ],
2026-08-28T09:54:47.7521164Z       "stages": {
2026-08-28T09:54:47.7521422Z         "doc": {
2026-08-28T09:54:47.7521707Z           "complete": false,
2026-08-28T09:54:47.7521983Z           "evidence": []
2026-08-28T09:54:47.7522236Z         },
2026-08-28T09:54:47.7522499Z         "impl": {
2026-08-28T09:54:47.7522780Z           "complete": true,
2026-08-28T09:54:47.7523062Z           "evidence": [
2026-08-28T09:54:47.7523315Z             {
2026-08-28T09:54:47.7523710Z               "path": "crates/spt-store/build.rs",
2026-08-28T09:54:47.7523986Z               "line": 34
2026-08-28T09:54:47.7524248Z             }
2026-08-28T09:54:47.7524505Z           ]
2026-08-28T09:54:47.7524773Z         },
2026-08-28T09:54:47.7525025Z         "int": {
2026-08-28T09:54:47.7525307Z           "complete": false,
2026-08-28T09:54:47.7525575Z           "evidence": []
2026-08-28T09:54:47.7525829Z         },
2026-08-28T09:54:47.7526085Z         "unit": {
2026-08-28T09:54:47.7526362Z           "complete": true,
2026-08-28T09:54:47.7526628Z           "evidence": [
2026-08-28T09:54:47.7526882Z             {
2026-08-28T09:54:47.7527320Z               "path": "crates/spt-store/tests/pool_guard_canary.rs",
2026-08-28T09:54:47.7527592Z               "line": 51
2026-08-28T09:54:47.7527850Z             },
2026-08-28T09:54:47.7528108Z             {
2026-08-28T09:54:47.7528551Z               "path": "crates/spt-store/tests/pool_guard_canary.rs",
2026-08-28T09:54:47.7528830Z               "line": 73
2026-08-28T09:54:47.7529157Z             },
2026-08-28T09:54:47.7529430Z             {
2026-08-28T09:54:47.7529859Z               "path": "crates/spt-store/tests/pool_guard_canary.rs",
2026-08-28T09:54:47.7530130Z               "line": 90
2026-08-28T09:54:47.7530388Z             }
2026-08-28T09:54:47.7530645Z           ]
2026-08-28T09:54:47.7530965Z         }
2026-08-28T09:54:47.7531221Z       }
2026-08-28T09:54:47.7531476Z     },
2026-08-28T09:54:47.7531724Z     {
2026-08-28T09:54:47.7532053Z       "id": "REQ-POOL-LANE-IDENTITY",
2026-08-28T09:54:47.7546022Z       "title": "A LANE'S STATE IS READ FROM ITS GIT IDENTITY, AND THE HOLDER PROCESS IS ADVISORY. MEASURED, not inferred: a sweep of this box's pool claims found 3 of 3 holder processes dead while one of those three lanes was demonstrably LIVE -- the holder was an agent session that had been cleared, re-forked or re-parented, which is routine and says nothing about whether the lane finished. A claim that decides FINISHED from a dead holder hands the pool to a second tree mid-lane, which is releases#103's original interleaving hazard reached through the guard rather than around it. So the claim records the lane's GIT IDENTITY -- its branch and the base sha that branch carried at claim time -- and the finished question is answered by ancestry: the lane is IN FLIGHT while its tip is not contained in the integration head, and SETTLED once it is merged, once its branch is gone, or once its branch no longer contains the claimed base (a branch name re-pointed onto other work is the branch-level twin of a recycled pid, and must not read as the same lane). THE BASE SHA IS ALSO THE REPO-IDENTITY WITNESS: ancestry is read in the ARRIVING tree, and a branch that is simply absent from a DIFFERENT repository would otherwise read as a finished lane, so a claimed base whose object is unknown here yields UNKNOWN rather than SETTLED. PRECEDENCE IS ASYMMETRIC ON PURPOSE: a provably live holder still refuses (it can only ever ADD a refusal), ancestry alone may declare a lane settled, and a claim carrying no git identity at all falls back to the pre-identity holder predicate and says so in the line it prints. A stamp written before this field existed therefore keeps its old behaviour instead of silently changing polarity.",
2026-08-28T09:54:47.7546404Z       "requiredStages": [
2026-08-28T09:54:47.7546680Z         "doc",
2026-08-28T09:54:47.7546945Z         "impl",
2026-08-28T09:54:47.7547271Z         "unit"
2026-08-28T09:54:47.7547525Z       ],
2026-08-28T09:54:47.7547787Z       "stages": {
2026-08-28T09:54:47.7548050Z         "doc": {
2026-08-28T09:54:47.7548336Z           "complete": true,
2026-08-28T09:54:47.7548608Z           "evidence": [
2026-08-28T09:54:47.7548864Z             {
2026-08-28T09:54:47.7549285Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.7549557Z               "line": 362
2026-08-28T09:54:47.7549807Z             }
2026-08-28T09:54:47.7550068Z           ]
2026-08-28T09:54:47.7550321Z         },
2026-08-28T09:54:47.7550660Z         "impl": {
2026-08-28T09:54:47.7550950Z           "complete": true,
2026-08-28T09:54:47.7551222Z           "evidence": [
2026-08-28T09:54:47.7551485Z             {
2026-08-28T09:54:47.7551866Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7552143Z               "line": 109
2026-08-28T09:54:47.7552402Z             },
2026-08-28T09:54:47.7552658Z             {
2026-08-28T09:54:47.7553030Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7553296Z               "line": 134
2026-08-28T09:54:47.7553555Z             },
2026-08-28T09:54:47.7553813Z             {
2026-08-28T09:54:47.7554179Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7554456Z               "line": 224
2026-08-28T09:54:47.7554705Z             },
2026-08-28T09:54:47.7554962Z             {
2026-08-28T09:54:47.7555337Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7555608Z               "line": 366
2026-08-28T09:54:47.7555871Z             },
2026-08-28T09:54:47.7556133Z             {
2026-08-28T09:54:47.7556500Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7556786Z               "line": 643
2026-08-28T09:54:47.7557048Z             }
2026-08-28T09:54:47.7557293Z           ]
2026-08-28T09:54:47.7557548Z         },
2026-08-28T09:54:47.7557865Z         "int": {
2026-08-28T09:54:47.7558156Z           "complete": false,
2026-08-28T09:54:47.7558433Z           "evidence": []
2026-08-28T09:54:47.7558690Z         },
2026-08-28T09:54:47.7559034Z         "unit": {
2026-08-28T09:54:47.7559320Z           "complete": true,
2026-08-28T09:54:47.7559596Z           "evidence": [
2026-08-28T09:54:47.7559850Z             {
2026-08-28T09:54:47.7560221Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7560501Z               "line": 1235
2026-08-28T09:54:47.7560771Z             },
2026-08-28T09:54:47.7561086Z             {
2026-08-28T09:54:47.7561453Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7561730Z               "line": 1282
2026-08-28T09:54:47.7561991Z             },
2026-08-28T09:54:47.7562249Z             {
2026-08-28T09:54:47.7562606Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7562887Z               "line": 1304
2026-08-28T09:54:47.7563138Z             },
2026-08-28T09:54:47.7563405Z             {
2026-08-28T09:54:47.7563767Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7564049Z               "line": 1326
2026-08-28T09:54:47.7564320Z             },
2026-08-28T09:54:47.7564572Z             {
2026-08-28T09:54:47.7564940Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7565207Z               "line": 1355
2026-08-28T09:54:47.7565464Z             },
2026-08-28T09:54:47.7565716Z             {
2026-08-28T09:54:47.7566082Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7566360Z               "line": 1389
2026-08-28T09:54:47.7566617Z             },
2026-08-28T09:54:47.7566885Z             {
2026-08-28T09:54:47.7567247Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7567529Z               "line": 1440
2026-08-28T09:54:47.7567781Z             },
2026-08-28T09:54:47.7568046Z             {
2026-08-28T09:54:47.7568406Z               "path": "crates/spt-poolguard/src/lib.rs",
2026-08-28T09:54:47.7568683Z               "line": 1459
2026-08-28T09:54:47.7569089Z             }
2026-08-28T09:54:47.7569350Z           ]
2026-08-28T09:54:47.7569612Z         }
2026-08-28T09:54:47.7569866Z       }
2026-08-28T09:54:47.7570123Z     },
2026-08-28T09:54:47.7570372Z     {
2026-08-28T09:54:47.7570739Z       "id": "REQ-POOL-ONE-LIVENESS-PREDICATE",
2026-08-28T09:54:47.7578341Z       "title": "THERE IS EXACTLY ONE PROCESS-IDENTITY PREDICATE IN THIS WORKSPACE, AND THE BUILD-SCRIPT GUARD USES THAT ONE. A cargo build script sees only [build-dependencies], so the pid-plus-birth-stamp predicate could not be reached where it lived in spt-store::proc. The alternative was a second copy -- a second source under exactly the hazard the first exists for (pid reuse; ADR-0047 decision 1 custody pair test; KNOWN-HAZARDS 7.50/7.51), and a liveness predicate that disagrees with itself across two call sites is worse than either copy alone. So the identity core (process_exists, process_started_at, parent_pid_of, process_identity, ProcIdentity, process_table) moved VERBATIM into a leaf crate below spt-store, and spt-store::proc re-exports every item, leaving every call site, doc link and test untouched. The move is behaviour-preserving by construction: nothing was rewritten, only relocated and re-exported.",
2026-08-28T09:54:47.7578716Z       "requiredStages": [
2026-08-28T09:54:47.7579048Z         "impl",
2026-08-28T09:54:47.7579310Z         "unit"
2026-08-28T09:54:47.7579562Z       ],
2026-08-28T09:54:47.7579820Z       "stages": {
2026-08-28T09:54:47.7580078Z         "doc": {
2026-08-28T09:54:47.7580374Z           "complete": false,
2026-08-28T09:54:47.7580646Z           "evidence": []
2026-08-28T09:54:47.7580909Z         },
2026-08-28T09:54:47.7581170Z         "impl": {
2026-08-28T09:54:47.7581450Z           "complete": true,
2026-08-28T09:54:47.7581724Z           "evidence": [
2026-08-28T09:54:47.7581978Z             {
2026-08-28T09:54:47.7582344Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:47.7582669Z               "line": 16
2026-08-28T09:54:47.7582935Z             },
2026-08-28T09:54:47.7583194Z             {
2026-08-28T09:54:47.7583546Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.7583824Z               "line": 14
2026-08-28T09:54:47.7584078Z             }
2026-08-28T09:54:47.7584334Z           ]
2026-08-28T09:54:47.7584582Z         },
2026-08-28T09:54:47.7584845Z         "int": {
2026-08-28T09:54:47.7585131Z           "complete": false,
2026-08-28T09:54:47.7585408Z           "evidence": []
2026-08-28T09:54:47.7585712Z         },
2026-08-28T09:54:47.7585974Z         "unit": {
2026-08-28T09:54:47.7586260Z           "complete": true,
2026-08-28T09:54:47.7586527Z           "evidence": [
2026-08-28T09:54:47.7586794Z             {
2026-08-28T09:54:47.7587260Z               "path": "crates/spt-store/tests/one_liveness_predicate.rs",
2026-08-28T09:54:47.7587527Z               "line": 16
2026-08-28T09:54:47.7587781Z             },
2026-08-28T09:54:47.7588043Z             {
2026-08-28T09:54:47.7588500Z               "path": "crates/spt-store/tests/one_liveness_predicate.rs",
2026-08-28T09:54:47.7588786Z               "line": 56
2026-08-28T09:54:47.7589138Z             }
2026-08-28T09:54:47.7589394Z           ]
2026-08-28T09:54:47.7589651Z         }
2026-08-28T09:54:47.7589899Z       }
2026-08-28T09:54:47.7590151Z     },
2026-08-28T09:54:47.7590399Z     {
2026-08-28T09:54:47.7590681Z       "id": "REQ-PRES-1",
2026-08-28T09:54:47.7594686Z       "title": "Presence resolution: the presence datum (last_active_node, last_active_endpoint, ts) gossiped subnet-wide via the agent-interaction heartbeat (rides registry distribution, visibility-gated) + one first-class most-recently-active resolution API consumed by notif first-fire, update-consent delivery, consent escalation, and shell wake resolution (M5 scope decision 1: resolution only — the PresenceChannel endpoint stays deferred)",
2026-08-28T09:54:47.7594999Z       "requiredStages": [
2026-08-28T09:54:47.7595270Z         "impl",
2026-08-28T09:54:47.7595518Z         "unit",
2026-08-28T09:54:47.7595847Z         "int"
2026-08-28T09:54:47.7596100Z       ],
2026-08-28T09:54:47.7596372Z       "stages": {
2026-08-28T09:54:47.7596631Z         "doc": {
2026-08-28T09:54:47.7596917Z           "complete": true,
2026-08-28T09:54:47.7597193Z           "evidence": [
2026-08-28T09:54:47.7597444Z             {
2026-08-28T09:54:47.7597763Z               "path": "docs/DEFERRED.md",
2026-08-28T09:54:47.7598031Z               "line": 11
2026-08-28T09:54:47.7598293Z             }
2026-08-28T09:54:47.7598556Z           ]
2026-08-28T09:54:47.7598822Z         },
2026-08-28T09:54:47.7599167Z         "impl": {
2026-08-28T09:54:47.7599529Z           "complete": true,
2026-08-28T09:54:47.7599808Z           "evidence": [
2026-08-28T09:54:47.7600063Z             {
2026-08-28T09:54:47.7600435Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.7600702Z               "line": 1437
2026-08-28T09:54:47.7600955Z             },
2026-08-28T09:54:47.7601203Z             {
2026-08-28T09:54:47.7601575Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.7601851Z               "line": 1582
2026-08-28T09:54:47.7602110Z             },
2026-08-28T09:54:47.7602372Z             {
2026-08-28T09:54:47.7602723Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.7603007Z               "line": 269
2026-08-28T09:54:47.7603259Z             },
2026-08-28T09:54:47.7603521Z             {
2026-08-28T09:54:47.7603879Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.7604160Z               "line": 295
2026-08-28T09:54:47.7604427Z             },
2026-08-28T09:54:47.7604677Z             {
2026-08-28T09:54:47.7605056Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7605430Z               "line": 28
2026-08-28T09:54:47.7605716Z             },
2026-08-28T09:54:47.7605965Z             {
2026-08-28T09:54:47.7606337Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7606680Z               "line": 105
2026-08-28T09:54:47.7606942Z             },
2026-08-28T09:54:47.7607210Z             {
2026-08-28T09:54:47.7607576Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7607845Z               "line": 161
2026-08-28T09:54:47.7608100Z             },
2026-08-28T09:54:47.7608357Z             {
2026-08-28T09:54:47.7608719Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7609087Z               "line": 233
2026-08-28T09:54:47.7609343Z             },
2026-08-28T09:54:47.7609658Z             {
2026-08-28T09:54:47.7610061Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.7610334Z               "line": 559
2026-08-28T09:54:47.7610594Z             },
2026-08-28T09:54:47.7610848Z             {
2026-08-28T09:54:47.7611219Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.7611486Z               "line": 379
2026-08-28T09:54:47.7611749Z             },
2026-08-28T09:54:47.7612002Z             {
2026-08-28T09:54:47.7612388Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.7612660Z               "line": 437
2026-08-28T09:54:47.7612913Z             },
2026-08-28T09:54:47.7613183Z             {
2026-08-28T09:54:47.7613548Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:47.7613829Z               "line": 463
2026-08-28T09:54:47.7614081Z             },
2026-08-28T09:54:47.7614345Z             {
2026-08-28T09:54:47.7614721Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.7614996Z               "line": 100
2026-08-28T09:54:47.7615260Z             }
2026-08-28T09:54:47.7615513Z           ]
2026-08-28T09:54:47.7615758Z         },
2026-08-28T09:54:47.7616014Z         "int": {
2026-08-28T09:54:47.7616305Z           "complete": true,
2026-08-28T09:54:47.7616573Z           "evidence": [
2026-08-28T09:54:47.7616830Z             {
2026-08-28T09:54:47.7617206Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.7617555Z               "line": 771
2026-08-28T09:54:47.7617822Z             },
2026-08-28T09:54:47.7618076Z             {
2026-08-28T09:54:47.7618447Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.7618717Z               "line": 1193
2026-08-28T09:54:47.7619061Z             },
2026-08-28T09:54:47.7619318Z             {
2026-08-28T09:54:47.7619695Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.7619967Z               "line": 2198
2026-08-28T09:54:47.7620223Z             }
2026-08-28T09:54:47.7620486Z           ]
2026-08-28T09:54:47.7620800Z         },
2026-08-28T09:54:47.7621065Z         "unit": {
2026-08-28T09:54:47.7621346Z           "complete": true,
2026-08-28T09:54:47.7621623Z           "evidence": [
2026-08-28T09:54:47.7621870Z             {
2026-08-28T09:54:47.7622233Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:47.7622509Z               "line": 1145
2026-08-28T09:54:47.7622766Z             },
2026-08-28T09:54:47.7623034Z             {
2026-08-28T09:54:47.7623401Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7623676Z               "line": 297
2026-08-28T09:54:47.7623932Z             },
2026-08-28T09:54:47.7624190Z             {
2026-08-28T09:54:47.7624561Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7624838Z               "line": 328
2026-08-28T09:54:47.7625110Z             },
2026-08-28T09:54:47.7625362Z             {
2026-08-28T09:54:47.7625735Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7626006Z               "line": 364
2026-08-28T09:54:47.7626262Z             },
2026-08-28T09:54:47.7626522Z             {
2026-08-28T09:54:47.7626888Z               "path": "crates/spt-daemon/src/presence.rs",
2026-08-28T09:54:47.7627118Z               "line": 395
2026-08-28T09:54:47.7627405Z             },
2026-08-28T09:54:47.7627667Z             {
2026-08-28T09:54:47.7628110Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.7628373Z               "line": 1859
2026-08-28T09:54:47.7628621Z             },
2026-08-28T09:54:47.7628878Z             {
2026-08-28T09:54:47.7629325Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:47.7629602Z               "line": 1855
2026-08-28T09:54:47.7629859Z             }
2026-08-28T09:54:47.7630111Z           ]
2026-08-28T09:54:47.7630374Z         }
2026-08-28T09:54:47.7630626Z       }
2026-08-28T09:54:47.7630880Z     },
2026-08-28T09:54:47.7631191Z     {
2026-08-28T09:54:47.7631550Z       "id": "REQ-PRESENCE-CONTROL-REAP-ON-EXIT",
2026-08-28T09:54:47.7639553Z       "title": "B3 (F028, hall-b diagnosis + deferred #11 seed; BROADENED perri F-b CONFIRMED): dead-pid ONLINE decay window + sticky CONTROLLED stamp. Repro: /exit -> all endpoint processes dead -> `endpoint list` stays ■ ONLINE for a decay window before OFFLINE. Sticky CONTROLLED: perri confirmed controlled=true + attached_node SET while alive=false/OFFLINE, persisting >20min AND ACROSS A DAEMON RESTART (hall-b) — worse than the SIGKILL>=5min original (CAVEAT still: may reflect claude's --remote-control channel not the PTY attach — DISAMBIGUATE first). This is the deferred #11; RCA belongs to this wave. FIX: reap must clear presence AND control stamps promptly across FOUR paths — (i) clean exit, (ii) serve conn-drop, (iii) session-died-without-exit (crash/bounce), (iv) a BOOT-TIME sweep so a restarted daemon does NOT resurrect control stamps for endpoints it can see are dead. Int tests per edge. Closes A2(b). See triage B3 (broadened).",
2026-08-28T09:54:47.7639895Z       "requiredStages": [
2026-08-28T09:54:47.7640162Z         "impl",
2026-08-28T09:54:47.7640419Z         "unit",
2026-08-28T09:54:47.7640676Z         "int"
2026-08-28T09:54:47.7640939Z       ],
2026-08-28T09:54:47.7641191Z       "stages": {
2026-08-28T09:54:47.7641450Z         "doc": {
2026-08-28T09:54:47.7641731Z           "complete": false,
2026-08-28T09:54:47.7642025Z           "evidence": []
2026-08-28T09:54:47.7642375Z         },
2026-08-28T09:54:47.7642642Z         "impl": {
2026-08-28T09:54:47.7642933Z           "complete": true,
2026-08-28T09:54:47.7643209Z           "evidence": [
2026-08-28T09:54:47.7643468Z             {
2026-08-28T09:54:47.7643848Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.7644125Z               "line": 817
2026-08-28T09:54:47.7644378Z             }
2026-08-28T09:54:47.7644679Z           ]
2026-08-28T09:54:47.7644935Z         },
2026-08-28T09:54:47.7645348Z         "int": {
2026-08-28T09:54:47.7645634Z           "complete": true,
2026-08-28T09:54:47.7645972Z           "evidence": [
2026-08-28T09:54:47.7646221Z             {
2026-08-28T09:54:47.7646687Z               "path": "crates/spt-daemon/tests/control_stamp_lifetime.rs",
2026-08-28T09:54:47.7646959Z               "line": 323
2026-08-28T09:54:47.7647217Z             },
2026-08-28T09:54:47.7647477Z             {
2026-08-28T09:54:47.7647934Z               "path": "crates/spt-daemon/tests/control_stamp_lifetime.rs",
2026-08-28T09:54:47.7648215Z               "line": 420
2026-08-28T09:54:47.7648473Z             },
2026-08-28T09:54:47.7648720Z             {
2026-08-28T09:54:47.7649292Z               "path": "crates/spt-daemon/tests/control_stamp_lifetime.rs",
2026-08-28T09:54:47.7649568Z               "line": 437
2026-08-28T09:54:47.7649826Z             }
2026-08-28T09:54:47.7650080Z           ]
2026-08-28T09:54:47.7650422Z         },
2026-08-28T09:54:47.7650808Z         "unit": {
2026-08-28T09:54:47.7651194Z           "complete": true,
2026-08-28T09:54:47.7651475Z           "evidence": [
2026-08-28T09:54:47.7651724Z             {
2026-08-28T09:54:47.7652104Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.7652377Z               "line": 1562
2026-08-28T09:54:47.7652637Z             },
2026-08-28T09:54:47.7652887Z             {
2026-08-28T09:54:47.7653260Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.7653628Z               "line": 1685
2026-08-28T09:54:47.7653885Z             }
2026-08-28T09:54:47.7654142Z           ]
2026-08-28T09:54:47.7654390Z         }
2026-08-28T09:54:47.7654647Z       }
2026-08-28T09:54:47.7654901Z     },
2026-08-28T09:54:47.7655159Z     {
2026-08-28T09:54:47.7655485Z       "id": "REQ-PRESENCE-LIVENESS-TRUTH",
2026-08-28T09:54:47.7669941Z       "title": "A node's gossiped per-endpoint registry Status reflects real liveness, so a remote viewer never paints a DEAD endpoint as ONLINE. ROOT (confirmed + gated vs CONTEXT.md): registryhost.rs:397-405 advertises a NOT-alive perch as Status::Dormant (the `else` of is_perch_alive), re-stamped every gossip round (never ages to Offline). Design intent GATED vs resting.rs + CONTEXT.md: active/dormant is the MULTI-INSTANCE routing differentiator (active = the bare-id routing target; dormant = a WARM non-target sibling — 'driving ling@laptop makes ling@desktop dormant', resting.rs:97; transitions active→dormant on AttentionShift/Detach). suspended = COLD (session closed, resumable-on-wake) while its NODE is UP. offline = NODE DOWN — NEVER self-gossiped (RestState has no Offline; a live node only ever gossips active/dormant/suspended), remote-inferred via epoch-lease eviction. So labeling a NOT-running perch Dormant is the DEFECT (dormant requires warm/running). PRIMARY FIX (registryhost `else`, not-bound-alive): live-but-UNBOUND (has a live broker session; is_perch_alive is bound-gated) → Active/Dormant (still warm); else (cold, no live session, but its node is up because this very daemon is gossiping) → SUSPENDED — NOT Dormant, NOT Offline (the node is UP; Offline is never self-gossiped). This alone removes the false-ONLINE. dormant keeps gossiping (routing/MRA needs it) but RENDERS as its online flavor (no distinct glyph; the dormant→suspended auto-suspend timer disambiguates recency). The DISPLAY of these states (incl Suspended=gray-filled) is REQ-SUBNET-DISPLAY-PARITY. Design: docs/design/subnet-presence-display.md §A. (next milestone)",
2026-08-28T09:54:47.7670379Z       "requiredStages": [
2026-08-28T09:54:47.7670703Z         "impl",
2026-08-28T09:54:47.7670965Z         "unit",
2026-08-28T09:54:47.7671219Z         "int"
2026-08-28T09:54:47.7671474Z       ],
2026-08-28T09:54:47.7671741Z       "stages": {
2026-08-28T09:54:47.7672004Z         "doc": {
2026-08-28T09:54:47.7672295Z           "complete": false,
2026-08-28T09:54:47.7672562Z           "evidence": []
2026-08-28T09:54:47.7672815Z         },
2026-08-28T09:54:47.7673073Z         "impl": {
2026-08-28T09:54:47.7673358Z           "complete": true,
2026-08-28T09:54:47.7673643Z           "evidence": [
2026-08-28T09:54:47.7673965Z             {
2026-08-28T09:54:47.7674361Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.7674637Z               "line": 542
2026-08-28T09:54:47.7674895Z             },
2026-08-28T09:54:47.7680052Z             {
2026-08-28T09:54:47.7680501Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.7680793Z               "line": 998
2026-08-28T09:54:47.7681054Z             }
2026-08-28T09:54:47.7681311Z           ]
2026-08-28T09:54:47.7681563Z         },
2026-08-28T09:54:47.7681826Z         "int": {
2026-08-28T09:54:47.7682112Z           "complete": true,
2026-08-28T09:54:47.7682383Z           "evidence": [
2026-08-28T09:54:47.7682640Z             {
2026-08-28T09:54:47.7682993Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7683264Z               "line": 753
2026-08-28T09:54:47.7683518Z             }
2026-08-28T09:54:47.7683780Z           ]
2026-08-28T09:54:47.7684033Z         },
2026-08-28T09:54:47.7684299Z         "unit": {
2026-08-28T09:54:47.7684577Z           "complete": true,
2026-08-28T09:54:47.7684858Z           "evidence": [
2026-08-28T09:54:47.7685112Z             {
2026-08-28T09:54:47.7685507Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.7685784Z               "line": 2210
2026-08-28T09:54:47.7686032Z             }
2026-08-28T09:54:47.7686385Z           ]
2026-08-28T09:54:47.7686638Z         }
2026-08-28T09:54:47.7686896Z       }
2026-08-28T09:54:47.7687147Z     },
2026-08-28T09:54:47.7687397Z     {
2026-08-28T09:54:47.7687764Z       "id": "REQ-PROJECT-INDEX-INVALIDATION",
2026-08-28T09:54:47.7696136Z       "title": "PROJECT-INDEX W2 (ADR-0037): event-driven index invalidation, debounced + coalesced: new session/cwd -> refresh that endpoint + the shared cwd cache; context-store mutation -> ONE debounced global membership refresh keyed on BRANCH-TIP FINGERPRINTS (no authoritative context-commit path exists — a writer-maintained generation counter is REJECTED because nothing maintains it); bind/start, rename, fork, purge -> affected endpoint rows; low-frequency periodic reconcile as the backstop; cwd identity refresh ONLY on path/repo-identity/.git-config change (ordinary commits do NOT alter project identity); multiple invalidations coalesce into one refresh. Gate: impl — the event set + debounce/coalesce; unit — each event class maps to its refresh scope + coalescing proof + ordinary-commit no-op; int — session/context/rename/fork/purge invalidation against a live daemon; doc — rides the ADR + triage doc. Kin REQ-PROJECT-INDEX-WRITER.",
2026-08-28T09:54:47.7696535Z       "requiredStages": [
2026-08-28T09:54:47.7696798Z         "doc",
2026-08-28T09:54:47.7697051Z         "impl",
2026-08-28T09:54:47.7697317Z         "unit",
2026-08-28T09:54:47.7697574Z         "int"
2026-08-28T09:54:47.7697830Z       ],
2026-08-28T09:54:47.7698101Z       "stages": {
2026-08-28T09:54:47.7698363Z         "doc": {
2026-08-28T09:54:47.7698673Z           "complete": true,
2026-08-28T09:54:47.7699045Z           "evidence": [
2026-08-28T09:54:47.7699302Z             {
2026-08-28T09:54:47.7699598Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.7699879Z               "line": 688
2026-08-28T09:54:47.7700131Z             },
2026-08-28T09:54:47.7700387Z             {
2026-08-28T09:54:47.7700754Z               "path": "docs/PROJECT-INDEX-TRIAGE.md",
2026-08-28T09:54:47.7701034Z               "line": 46
2026-08-28T09:54:47.7701373Z             },
2026-08-28T09:54:47.7701626Z             {
2026-08-28T09:54:47.7701932Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.7702204Z               "line": 230
2026-08-28T09:54:47.7702475Z             },
2026-08-28T09:54:47.7702727Z             {
2026-08-28T09:54:47.7703169Z               "path": "docs/adr/0037-materialized-project-index.md",
2026-08-28T09:54:47.7703441Z               "line": 37
2026-08-28T09:54:47.7703698Z             }
2026-08-28T09:54:47.7703962Z           ]
2026-08-28T09:54:47.7704219Z         },
2026-08-28T09:54:47.7704482Z         "impl": {
2026-08-28T09:54:47.7704816Z           "complete": true,
2026-08-28T09:54:47.7705092Z           "evidence": [
2026-08-28T09:54:47.7705347Z             {
2026-08-28T09:54:47.7705731Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7706003Z               "line": 288
2026-08-28T09:54:47.7706256Z             },
2026-08-28T09:54:47.7706514Z             {
2026-08-28T09:54:47.7706890Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7707167Z               "line": 415
2026-08-28T09:54:47.7707405Z             },
2026-08-28T09:54:47.7707659Z             {
2026-08-28T09:54:47.7708035Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7708315Z               "line": 628
2026-08-28T09:54:47.7708570Z             },
2026-08-28T09:54:47.7708918Z             {
2026-08-28T09:54:47.7709591Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7709968Z               "line": 675
2026-08-28T09:54:47.7710263Z             },
2026-08-28T09:54:47.7710583Z             {
2026-08-28T09:54:47.7711117Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.7711524Z               "line": 481
2026-08-28T09:54:47.7711900Z             },
2026-08-28T09:54:47.7712347Z             {
2026-08-28T09:54:47.7712769Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.7713145Z               "line": 140
2026-08-28T09:54:47.7713403Z             },
2026-08-28T09:54:47.7713658Z             {
2026-08-28T09:54:47.7714050Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.7714325Z               "line": 153
2026-08-28T09:54:47.7714587Z             },
2026-08-28T09:54:47.7714846Z             {
2026-08-28T09:54:47.7715231Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.7715498Z               "line": 237
2026-08-28T09:54:47.7715756Z             },
2026-08-28T09:54:47.7716078Z             {
2026-08-28T09:54:47.7716468Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.7716750Z               "line": 381
2026-08-28T09:54:47.7717012Z             },
2026-08-28T09:54:47.7717284Z             {
2026-08-28T09:54:47.7717669Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.7717952Z               "line": 523
2026-08-28T09:54:47.7718209Z             },
2026-08-28T09:54:47.7718461Z             {
2026-08-28T09:54:47.7718851Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:47.7719231Z               "line": 583
2026-08-28T09:54:47.7719498Z             },
2026-08-28T09:54:47.7719759Z             {
2026-08-28T09:54:47.7720137Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7720408Z               "line": 19
2026-08-28T09:54:47.7720670Z             },
2026-08-28T09:54:47.7720927Z             {
2026-08-28T09:54:47.7721298Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7721568Z               "line": 85
2026-08-28T09:54:47.7721822Z             },
2026-08-28T09:54:47.7722079Z             {
2026-08-28T09:54:47.7722455Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7722732Z               "line": 103
2026-08-28T09:54:47.7722989Z             },
2026-08-28T09:54:47.7723251Z             {
2026-08-28T09:54:47.7723624Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7723973Z               "line": 143
2026-08-28T09:54:47.7724232Z             },
2026-08-28T09:54:47.7724494Z             {
2026-08-28T09:54:47.7724866Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.7725124Z               "line": 200
2026-08-28T09:54:47.7725381Z             },
2026-08-28T09:54:47.7725635Z             {
2026-08-28T09:54:47.7725983Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.7726256Z               "line": 802
2026-08-28T09:54:47.7726520Z             },
2026-08-28T09:54:47.7726775Z             {
2026-08-28T09:54:47.7727157Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7727438Z               "line": 24131
2026-08-28T09:54:47.7727690Z             }
2026-08-28T09:54:47.7727954Z           ]
2026-08-28T09:54:47.7728207Z         },
2026-08-28T09:54:47.7728469Z         "int": {
2026-08-28T09:54:47.7728756Z           "complete": true,
2026-08-28T09:54:47.7729108Z           "evidence": [
2026-08-28T09:54:47.7729373Z             {
2026-08-28T09:54:47.7729781Z               "path": "crates/spt/tests/projindex_writer_e2e.rs",
2026-08-28T09:54:47.7730058Z               "line": 20
2026-08-28T09:54:47.7730314Z             },
2026-08-28T09:54:47.7730572Z             {
2026-08-28T09:54:47.7730973Z               "path": "crates/spt/tests/projindex_writer_e2e.rs",
2026-08-28T09:54:47.7731245Z               "line": 270
2026-08-28T09:54:47.7731492Z             }
2026-08-28T09:54:47.7731755Z           ]
2026-08-28T09:54:47.7732007Z         },
2026-08-28T09:54:47.7732276Z         "unit": {
2026-08-28T09:54:47.7732577Z           "complete": true,
2026-08-28T09:54:47.7732852Z           "evidence": [
2026-08-28T09:54:47.7733110Z             {
2026-08-28T09:54:47.7733492Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7733768Z               "line": 919
2026-08-28T09:54:47.7734026Z             },
2026-08-28T09:54:47.7734289Z             {
2026-08-28T09:54:47.7734735Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7735012Z               "line": 992
2026-08-28T09:54:47.7735275Z             },
2026-08-28T09:54:47.7735528Z             {
2026-08-28T09:54:47.7735914Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7736181Z               "line": 1053
2026-08-28T09:54:47.7736434Z             },
2026-08-28T09:54:47.7736685Z             {
2026-08-28T09:54:47.7737071Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7737431Z               "line": 1074
2026-08-28T09:54:47.7737683Z             },
2026-08-28T09:54:47.7737940Z             {
2026-08-28T09:54:47.7738303Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7738575Z               "line": 165
2026-08-28T09:54:47.7738823Z             },
2026-08-28T09:54:47.7739156Z             {
2026-08-28T09:54:47.7739524Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7739800Z               "line": 189
2026-08-28T09:54:47.7740061Z             },
2026-08-28T09:54:47.7740317Z             {
2026-08-28T09:54:47.7740680Z               "path": "crates/spt-store/src/projinval.rs",
2026-08-28T09:54:47.7740947Z               "line": 213
2026-08-28T09:54:47.7741199Z             }
2026-08-28T09:54:47.7741452Z           ]
2026-08-28T09:54:47.7741709Z         }
2026-08-28T09:54:47.7741958Z       }
2026-08-28T09:54:47.7742211Z     },
2026-08-28T09:54:47.7742466Z     {
2026-08-28T09:54:47.7742817Z       "id": "REQ-PROJECT-INDEX-READER-CUTOVER",
2026-08-28T09:54:47.7752637Z       "title": "PROJECT-INDEX W3 (ADR-0037): endpoint list, the picker, and endpoint-info consume the materialized index — NO git work in any user-facing read path (the O(PxB+C) fanout at cli.rs ~2954 / picker/data.rs ~456-518 dies). BEHAVIORAL PARITY is binding: precedence session-cwd -> origin-cwd -> context-recency and rendered project IDs/display names unchanged (parity suite vs the old derivation on a fixture); bare/partial run shares the indexed projection; fully-qualified --adapter+--id direct run stays picker-free; the direct-run 25s broker-session gate stays separately tested/observable. Degradation legs (git unavailable, branch malformed/locked, cwd deleted) keep fast reads. Manual latency acceptance on the 13-perch/7-branch fixture (~30s -> sub-second) + hertz field-verify on HFENDULEAM — NOT a CI wall-clock gate. Gate: impl — reader cutover; unit — parity + degradation; int — list/picker against a daemon-maintained index incl. counters proving zero reader git spawns; doc — reference regen + CONTEXT avoid-list. Kin REQ-WHOAMI-IDENTITY-ONLY, REQ-PROJECT-INDEX-STORE/WRITER/INVALIDATION.",
2026-08-28T09:54:47.7753122Z       "requiredStages": [
2026-08-28T09:54:47.7753377Z         "doc",
2026-08-28T09:54:47.7753634Z         "impl",
2026-08-28T09:54:47.7753892Z         "unit",
2026-08-28T09:54:47.7754150Z         "int"
2026-08-28T09:54:47.7754408Z       ],
2026-08-28T09:54:47.7754675Z       "stages": {
2026-08-28T09:54:47.7754941Z         "doc": {
2026-08-28T09:54:47.7755227Z           "complete": true,
2026-08-28T09:54:47.7755499Z           "evidence": [
2026-08-28T09:54:47.7755761Z             {
2026-08-28T09:54:47.7756067Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.7756347Z               "line": 686
2026-08-28T09:54:47.7756610Z             },
2026-08-28T09:54:47.7756871Z             {
2026-08-28T09:54:47.7757162Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.7757443Z               "line": 689
2026-08-28T09:54:47.7757696Z             },
2026-08-28T09:54:47.7757964Z             {
2026-08-28T09:54:47.7758262Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.7758542Z               "line": 203
2026-08-28T09:54:47.7758794Z             }
2026-08-28T09:54:47.7759133Z           ]
2026-08-28T09:54:47.7759381Z         },
2026-08-28T09:54:47.7759643Z         "impl": {
2026-08-28T09:54:47.7759929Z           "complete": true,
2026-08-28T09:54:47.7760202Z           "evidence": [
2026-08-28T09:54:47.7760521Z             {
2026-08-28T09:54:47.7760906Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7761186Z               "line": 446
2026-08-28T09:54:47.7761438Z             },
2026-08-28T09:54:47.7761695Z             {
2026-08-28T09:54:47.7762082Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7762363Z               "line": 478
2026-08-28T09:54:47.7762615Z             },
2026-08-28T09:54:47.7762868Z             {
2026-08-28T09:54:47.7763244Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7763568Z               "line": 63
2026-08-28T09:54:47.7763837Z             },
2026-08-28T09:54:47.7764096Z             {
2026-08-28T09:54:47.7764471Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7764749Z               "line": 109
2026-08-28T09:54:47.7765006Z             },
2026-08-28T09:54:47.7765264Z             {
2026-08-28T09:54:47.7765631Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7765908Z               "line": 118
2026-08-28T09:54:47.7766160Z             },
2026-08-28T09:54:47.7766416Z             {
2026-08-28T09:54:47.7766783Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7767059Z               "line": 148
2026-08-28T09:54:47.7767318Z             },
2026-08-28T09:54:47.7767575Z             {
2026-08-28T09:54:47.7767946Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7768223Z               "line": 157
2026-08-28T09:54:47.7768482Z             },
2026-08-28T09:54:47.7768737Z             {
2026-08-28T09:54:47.7769193Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.7769474Z               "line": 1202
2026-08-28T09:54:47.7769722Z             },
2026-08-28T09:54:47.7769979Z             {
2026-08-28T09:54:47.7770289Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7770566Z               "line": 6487
2026-08-28T09:54:47.7770818Z             },
2026-08-28T09:54:47.7771086Z             {
2026-08-28T09:54:47.7771476Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7771751Z               "line": 6633
2026-08-28T09:54:47.7772012Z             },
2026-08-28T09:54:47.7772260Z             {
2026-08-28T09:54:47.7772599Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7772870Z               "line": 214
2026-08-28T09:54:47.7773128Z             },
2026-08-28T09:54:47.7773381Z             {
2026-08-28T09:54:47.7773723Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7774001Z               "line": 247
2026-08-28T09:54:47.7774256Z             },
2026-08-28T09:54:47.7774569Z             {
2026-08-28T09:54:47.7774918Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7775190Z               "line": 426
2026-08-28T09:54:47.7775442Z             },
2026-08-28T09:54:47.7775694Z             {
2026-08-28T09:54:47.7776032Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7776305Z               "line": 463
2026-08-28T09:54:47.7776567Z             },
2026-08-28T09:54:47.7776826Z             {
2026-08-28T09:54:47.7777167Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7777434Z               "line": 477
2026-08-28T09:54:47.7777691Z             }
2026-08-28T09:54:47.7777943Z           ]
2026-08-28T09:54:47.7778202Z         },
2026-08-28T09:54:47.7778459Z         "int": {
2026-08-28T09:54:47.7778751Z           "complete": true,
2026-08-28T09:54:47.7779099Z           "evidence": [
2026-08-28T09:54:47.7779364Z             {
2026-08-28T09:54:47.7779749Z               "path": "crates/spt/tests/dummy_harness_e2e.rs",
2026-08-28T09:54:47.7780020Z               "line": 342
2026-08-28T09:54:47.7780277Z             },
2026-08-28T09:54:47.7780530Z             {
2026-08-28T09:54:47.7780936Z               "path": "crates/spt/tests/projindex_reader_e2e.rs",
2026-08-28T09:54:47.7781202Z               "line": 19
2026-08-28T09:54:47.7781522Z             }
2026-08-28T09:54:47.7781774Z           ]
2026-08-28T09:54:47.7782036Z         },
2026-08-28T09:54:47.7782306Z         "unit": {
2026-08-28T09:54:47.7782597Z           "complete": true,
2026-08-28T09:54:47.7782878Z           "evidence": [
2026-08-28T09:54:47.7783130Z             {
2026-08-28T09:54:47.7783522Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7783793Z               "line": 1137
2026-08-28T09:54:47.7784059Z             },
2026-08-28T09:54:47.7784312Z             {
2026-08-28T09:54:47.7784688Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7785019Z               "line": 438
2026-08-28T09:54:47.7785273Z             },
2026-08-28T09:54:47.7785535Z             {
2026-08-28T09:54:47.7785888Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7786159Z               "line": 1083
2026-08-28T09:54:47.7786413Z             },
2026-08-28T09:54:47.7786660Z             {
2026-08-28T09:54:47.7787024Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7787295Z               "line": 1188
2026-08-28T09:54:47.7787560Z             },
2026-08-28T09:54:47.7787813Z             {
2026-08-28T09:54:47.7788165Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:47.7788438Z               "line": 1241
2026-08-28T09:54:47.7788696Z             }
2026-08-28T09:54:47.7789034Z           ]
2026-08-28T09:54:47.7789306Z         }
2026-08-28T09:54:47.7789559Z       }
2026-08-28T09:54:47.7789819Z     },
2026-08-28T09:54:47.7790065Z     {
2026-08-28T09:54:47.7790398Z       "id": "REQ-PROJECT-INDEX-STORE",
2026-08-28T09:54:47.7797025Z       "title": "PROJECT-INDEX W1 (ADR-0037, RCA .claude/reports/2026-07-10-hertz-session/03): spt-store owns the VERSIONED materialized project-index format + read path. Reader contract: read one compact versioned index, join with the local perch roster, return immediately; stale/missing renders last-known-good or '-'; NEVER fall back to synchronous git enrichment; daemon-offline readers consume the last persisted snapshot; truncated/schema-mismatched index degrades to fast reads + last-known-good, never an error stall. Gate: impl — format + store read path; unit — version/schema-mismatch/truncation degradation legs + join semantics; doc — CONTEXT.md project-index entry + STORAGE.md section. Kin REQ-PROJECT-INDEX-WRITER (the producer), ADR-0037.",
2026-08-28T09:54:47.7797410Z       "requiredStages": [
2026-08-28T09:54:47.7797668Z         "doc",
2026-08-28T09:54:47.7797931Z         "impl",
2026-08-28T09:54:47.7798191Z         "unit"
2026-08-28T09:54:47.7798453Z       ],
2026-08-28T09:54:47.7798716Z       "stages": {
2026-08-28T09:54:47.7799117Z         "doc": {
2026-08-28T09:54:47.7799402Z           "complete": true,
2026-08-28T09:54:47.7799670Z           "evidence": [
2026-08-28T09:54:47.7799928Z             {
2026-08-28T09:54:47.7800237Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.7800503Z               "line": 686
2026-08-28T09:54:47.7800764Z             },
2026-08-28T09:54:47.7801030Z             {
2026-08-28T09:54:47.7801340Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.7801607Z               "line": 189
2026-08-28T09:54:47.7801860Z             }
2026-08-28T09:54:47.7802114Z           ]
2026-08-28T09:54:47.7802366Z         },
2026-08-28T09:54:47.7802628Z         "impl": {
2026-08-28T09:54:47.7802909Z           "complete": true,
2026-08-28T09:54:47.7803184Z           "evidence": [
2026-08-28T09:54:47.7803436Z             {
2026-08-28T09:54:47.7803816Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7804089Z               "line": 30
2026-08-28T09:54:47.7804347Z             },
2026-08-28T09:54:47.7804604Z             {
2026-08-28T09:54:47.7804976Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7805248Z               "line": 241
2026-08-28T09:54:47.7805500Z             },
2026-08-28T09:54:47.7805761Z             {
2026-08-28T09:54:47.7806139Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7806473Z               "line": 283
2026-08-28T09:54:47.7806740Z             },
2026-08-28T09:54:47.7806994Z             {
2026-08-28T09:54:47.7807365Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7807633Z               "line": 313
2026-08-28T09:54:47.7807885Z             }
2026-08-28T09:54:47.7808134Z           ]
2026-08-28T09:54:47.7808411Z         },
2026-08-28T09:54:47.7808670Z         "int": {
2026-08-28T09:54:47.7809028Z           "complete": false,
2026-08-28T09:54:47.7809314Z           "evidence": []
2026-08-28T09:54:47.7809629Z         },
2026-08-28T09:54:47.7809892Z         "unit": {
2026-08-28T09:54:47.7810178Z           "complete": true,
2026-08-28T09:54:47.7810450Z           "evidence": [
2026-08-28T09:54:47.7810704Z             {
2026-08-28T09:54:47.7811082Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7811352Z               "line": 380
2026-08-28T09:54:47.7811609Z             },
2026-08-28T09:54:47.7811862Z             {
2026-08-28T09:54:47.7812229Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7812505Z               "line": 495
2026-08-28T09:54:47.7812759Z             },
2026-08-28T09:54:47.7813021Z             {
2026-08-28T09:54:47.7813388Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7813665Z               "line": 506
2026-08-28T09:54:47.7813921Z             },
2026-08-28T09:54:47.7814176Z             {
2026-08-28T09:54:47.7814544Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7814815Z               "line": 523
2026-08-28T09:54:47.7815072Z             },
2026-08-28T09:54:47.7815326Z             {
2026-08-28T09:54:47.7815692Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7816017Z               "line": 548
2026-08-28T09:54:47.7816273Z             }
2026-08-28T09:54:47.7816535Z           ]
2026-08-28T09:54:47.7816781Z         }
2026-08-28T09:54:47.7817038Z       }
2026-08-28T09:54:47.7817291Z     },
2026-08-28T09:54:47.7817620Z     {
2026-08-28T09:54:47.7817930Z       "id": "REQ-PROJECT-INDEX-WRITER",
2026-08-28T09:54:47.7828738Z       "title": "PROJECT-INDEX W2 (ADR-0037): the daemon is the SOLE single-flight project-index writer: load persisted index at startup; ready WITHOUT warm (cold start = daemon ready + CLI fast before background completes); background reconcile with BATCHED complexity O(P+B+F+C) — enumerate branches ONCE, <=1 tree scan per changed branch, ONE derivation per distinct normalized cwd (in-process BranchStore traversal or fixed plumbing calls; backgrounding the existing 100+ process loop is REJECTED); atomic replace; last-known-good preserved on any failure; warm start with unchanged generation performs NO scan. Observability surface: generated time, source generation, pending refresh, last duration/error, endpoint/project/cwd counts, cache hits/misses, stale reads, repair count — index presence alone is not health. Gate: impl — writer + observability; unit — single-flight, atomic-replace, last-known-good, no-scan-on-unchanged-generation; int — cold+warm start legs against a real store; COMPLEXITY COUNTERS are the CI gate (wall-clock = manual acceptance ONLY, shared-runner flake class); doc — daemon docs writer-duty section. Kin REQ-PROJECT-INDEX-STORE, REQ-PROJECT-INDEX-INVALIDATION.",
2026-08-28T09:54:47.7829269Z       "requiredStages": [
2026-08-28T09:54:47.7829536Z         "doc",
2026-08-28T09:54:47.7829801Z         "impl",
2026-08-28T09:54:47.7830058Z         "unit",
2026-08-28T09:54:47.7830311Z         "int"
2026-08-28T09:54:47.7830583Z       ],
2026-08-28T09:54:47.7830845Z       "stages": {
2026-08-28T09:54:47.7831116Z         "doc": {
2026-08-28T09:54:47.7831403Z           "complete": true,
2026-08-28T09:54:47.7831679Z           "evidence": [
2026-08-28T09:54:47.7831936Z             {
2026-08-28T09:54:47.7832230Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.7832506Z               "line": 688
2026-08-28T09:54:47.7832753Z             },
2026-08-28T09:54:47.7833093Z             {
2026-08-28T09:54:47.7833413Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:47.7833693Z               "line": 215
2026-08-28T09:54:47.7833955Z             }
2026-08-28T09:54:47.7834212Z           ]
2026-08-28T09:54:47.7834475Z         },
2026-08-28T09:54:47.7834743Z         "impl": {
2026-08-28T09:54:47.7835027Z           "complete": true,
2026-08-28T09:54:47.7835301Z           "evidence": [
2026-08-28T09:54:47.7835553Z             {
2026-08-28T09:54:47.7835931Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:47.7836269Z               "line": 321
2026-08-28T09:54:47.7836637Z             },
2026-08-28T09:54:47.7836909Z             {
2026-08-28T09:54:47.7837305Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7837575Z               "line": 27
2026-08-28T09:54:47.7837830Z             },
2026-08-28T09:54:47.7838078Z             {
2026-08-28T09:54:47.7838449Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7838726Z               "line": 237
2026-08-28T09:54:47.7839093Z             },
2026-08-28T09:54:47.7839361Z             {
2026-08-28T09:54:47.7839742Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7840014Z               "line": 279
2026-08-28T09:54:47.7840275Z             },
2026-08-28T09:54:47.7840533Z             {
2026-08-28T09:54:47.7840910Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7841181Z               "line": 627
2026-08-28T09:54:47.7841435Z             },
2026-08-28T09:54:47.7841691Z             {
2026-08-28T09:54:47.7842074Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.7842340Z               "line": 284
2026-08-28T09:54:47.7842601Z             },
2026-08-28T09:54:47.7842856Z             {
2026-08-28T09:54:47.7843228Z               "path": "crates/spt-store/src/projderive.rs",
2026-08-28T09:54:47.7843495Z               "line": 12
2026-08-28T09:54:47.7843753Z             },
2026-08-28T09:54:47.7844006Z             {
2026-08-28T09:54:47.7844463Z               "path": "crates/spt-store/src/projderive.rs",
2026-08-28T09:54:47.7844787Z               "line": 89
2026-08-28T09:54:47.7845035Z             },
2026-08-28T09:54:47.7845294Z             {
2026-08-28T09:54:47.7845662Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7845933Z               "line": 185
2026-08-28T09:54:47.7846186Z             },
2026-08-28T09:54:47.7846447Z             {
2026-08-28T09:54:47.7846771Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7847054Z               "line": 8189
2026-08-28T09:54:47.7847560Z             },
2026-08-28T09:54:47.7847940Z             {
2026-08-28T09:54:47.7848253Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7848520Z               "line": 8469
2026-08-28T09:54:47.7848777Z             },
2026-08-28T09:54:47.7849115Z             {
2026-08-28T09:54:47.7849425Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7849726Z               "line": 8752
2026-08-28T09:54:47.7849973Z             }
2026-08-28T09:54:47.7850231Z           ]
2026-08-28T09:54:47.7850479Z         },
2026-08-28T09:54:47.7850742Z         "int": {
2026-08-28T09:54:47.7851026Z           "complete": true,
2026-08-28T09:54:47.7851302Z           "evidence": [
2026-08-28T09:54:47.7851555Z             {
2026-08-28T09:54:47.7851961Z               "path": "crates/spt/tests/projindex_writer_e2e.rs",
2026-08-28T09:54:47.7852237Z               "line": 19
2026-08-28T09:54:47.7852489Z             },
2026-08-28T09:54:47.7852742Z             {
2026-08-28T09:54:47.7853128Z               "path": "crates/spt/tests/projindex_writer_e2e.rs",
2026-08-28T09:54:47.7853402Z               "line": 167
2026-08-28T09:54:47.7853655Z             },
2026-08-28T09:54:47.7853912Z             {
2026-08-28T09:54:47.7854313Z               "path": "crates/spt/tests/projindex_writer_e2e.rs",
2026-08-28T09:54:47.7854585Z               "line": 237
2026-08-28T09:54:47.7854914Z             }
2026-08-28T09:54:47.7855172Z           ]
2026-08-28T09:54:47.7855428Z         },
2026-08-28T09:54:47.7855686Z         "unit": {
2026-08-28T09:54:47.7855971Z           "complete": true,
2026-08-28T09:54:47.7856241Z           "evidence": [
2026-08-28T09:54:47.7856498Z             {
2026-08-28T09:54:47.7856885Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7857161Z               "line": 787
2026-08-28T09:54:47.7857424Z             },
2026-08-28T09:54:47.7857685Z             {
2026-08-28T09:54:47.7858068Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7858402Z               "line": 856
2026-08-28T09:54:47.7858666Z             },
2026-08-28T09:54:47.7858921Z             {
2026-08-28T09:54:47.7859385Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7859657Z               "line": 885
2026-08-28T09:54:47.7859913Z             },
2026-08-28T09:54:47.7860166Z             {
2026-08-28T09:54:47.7860552Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7860829Z               "line": 972
2026-08-28T09:54:47.7861086Z             },
2026-08-28T09:54:47.7861340Z             {
2026-08-28T09:54:47.7861706Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7861968Z               "line": 1079
2026-08-28T09:54:47.7862230Z             },
2026-08-28T09:54:47.7862487Z             {
2026-08-28T09:54:47.7862869Z               "path": "crates/spt-daemon/src/projwriter.rs",
2026-08-28T09:54:47.7863141Z               "line": 1272
2026-08-28T09:54:47.7863402Z             },
2026-08-28T09:54:47.7863664Z             {
2026-08-28T09:54:47.7864048Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.7864319Z               "line": 948
2026-08-28T09:54:47.7864583Z             },
2026-08-28T09:54:47.7864840Z             {
2026-08-28T09:54:47.7865211Z               "path": "crates/spt-store/src/projderive.rs",
2026-08-28T09:54:47.7865489Z               "line": 171
2026-08-28T09:54:47.7865808Z             },
2026-08-28T09:54:47.7866066Z             {
2026-08-28T09:54:47.7866443Z               "path": "crates/spt-store/src/projderive.rs",
2026-08-28T09:54:47.7866717Z               "line": 209
2026-08-28T09:54:47.7866972Z             },
2026-08-28T09:54:47.7867229Z             {
2026-08-28T09:54:47.7867611Z               "path": "crates/spt-store/src/projderive.rs",
2026-08-28T09:54:47.7867878Z               "line": 240
2026-08-28T09:54:47.7868136Z             },
2026-08-28T09:54:47.7868384Z             {
2026-08-28T09:54:47.7868760Z               "path": "crates/spt-store/src/projindex.rs",
2026-08-28T09:54:47.7869173Z               "line": 404
2026-08-28T09:54:47.7869434Z             },
2026-08-28T09:54:47.7869688Z             {
2026-08-28T09:54:47.7870007Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.7870278Z               "line": 37733
2026-08-28T09:54:47.7870532Z             }
2026-08-28T09:54:47.7870793Z           ]
2026-08-28T09:54:47.7871041Z         }
2026-08-28T09:54:47.7871298Z       }
2026-08-28T09:54:47.7871552Z     },
2026-08-28T09:54:47.7871805Z     {
2026-08-28T09:54:47.7872147Z       "id": "REQ-PSYCHE-ACCOUNT-REFUSAL-EXIT",
2026-08-28T09:54:47.7891332Z       "title": "RESERVED EXIT 96 — account/credential refusal from a psyche_resume turn: the inner tool refused for account-level reasons (spend/usage cap, expired/revoked credential, org quota) — session healthy, code healthy, retry correct-but-pointless until a HUMAN acts. Core discriminates on the EXIT CODE ALONE (text-blind, the exit-95 layering exactly: adapters own text matching because their inner tool's wording is theirs to track; core's contract survives any rewording). SEMANTICS ruled 2026-07-26: (1) OWN PACING, fully separate from the C3(b) strike budget — an account refusal fails FAST (refused before a billed turn), so ten near-instant cycles could exhaust the defect budget in seconds and kill the psyche host as a thrashing component while nothing thrashes; the strike budget is a DEFECT budget and an outage must not be able to spend it (fold-with-higher-threshold REFUSED at ruling: it keeps the bug in a quieter form). Slow capped exponential ~60s doubling to ~15m cap, held INDEFINITELY (no give-up: a cap clears on human action or a calendar boundary — unpredictable but CERTAIN — and a permanently-given-up psyche is invisible), reset on first success, no state to unwind. (2) DISTINCT SURFACE: never the defect-shaped PSYCHE_TURN_FAIL prefix — renders as its own class (adapter-side PSYCHE_TURN_REFUSED; core-side an additive class discriminator beside psyche_host_error, never a fold into it), NAMES the actor and action (a human, the inner tool's account — not the endpoint/adapter/session), carries the inner tool's own words via the dual-stream tail (REQ-PSYCHE-TURN-STREAM-EVIDENCE), and states HOW LONG it has been refused. (3) NEVER reseeds — custody is fine; a reseed would destroy a healthy transcript for nothing. (4) Never counted as a crashloop defect. Adapter contract half: claude-spt docs/design/RESERVED-EXIT-ACCOUNT-REFUSAL.md (appendix of observed CC strings is informative-not-contract, populated ONLY from observed bytes — the invented-string chain of 2026-07-26 is the anti-pattern it refuses). Gate at activation: unit — exit 96 classifies refused (no strike increment, no reseed, own backoff schedule engaged); 95/generic/None unchanged; surface renders the distinct label + duration.",
2026-08-28T09:54:47.7892010Z       "requiredStages": [
2026-08-28T09:54:47.7892277Z         "doc"
2026-08-28T09:54:47.7892543Z       ],
2026-08-28T09:54:47.7892805Z       "stages": {
2026-08-28T09:54:47.7893076Z         "doc": {
2026-08-28T09:54:47.7893349Z           "complete": true,
2026-08-28T09:54:47.7893625Z           "evidence": [
2026-08-28T09:54:47.7893882Z             {
2026-08-28T09:54:47.7894311Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:47.7894592Z               "line": 187
2026-08-28T09:54:47.7894856Z             }
2026-08-28T09:54:47.7895121Z           ]
2026-08-28T09:54:47.7895459Z         },
2026-08-28T09:54:47.7895732Z         "impl": {
2026-08-28T09:54:47.7896014Z           "complete": false,
2026-08-28T09:54:47.7896301Z           "evidence": []
2026-08-28T09:54:47.7896559Z         },
2026-08-28T09:54:47.7896821Z         "int": {
2026-08-28T09:54:47.7897103Z           "complete": false,
2026-08-28T09:54:47.7897379Z           "evidence": []
2026-08-28T09:54:47.7897636Z         },
2026-08-28T09:54:47.7897902Z         "unit": {
2026-08-28T09:54:47.7898188Z           "complete": false,
2026-08-28T09:54:47.7898463Z           "evidence": []
2026-08-28T09:54:47.7898787Z         }
2026-08-28T09:54:47.7899177Z       }
2026-08-28T09:54:47.7899430Z     },
2026-08-28T09:54:47.7899683Z     {
2026-08-28T09:54:47.7900051Z       "id": "REQ-PSYCHE-CONTEXT-FILE-INDIRECTION",
2026-08-28T09:54:47.7912046Z       "title": "W4 (F030; doyle Q2 ruling + perri file-always freeze, 2026-07-04): the composed psyche mind ({psyche_context}) rides the SHIM argv today — a real ~20KB doyle psyche-download exceeds the win32 CreateProcess lpCommandLine ~32k cap → the shim spawn BRICKS. FIX (file-always, replaces {psyche_context} outright — no size-branch, no argv cliff, one path): core writes the mind to a file in the psyche's NESTED perch dir BEFORE each turn spawn and fills a single {psyche_context_file} = that PATH (argv-cap-immune). The soft fresh/continue discriminator moves from KEY-presence to FILE-CONTENT: FreshWithPreload writes the composed mind NON-EMPTY (the <fresh-psyche/> never-empty guarantee carries to the file content); ContinueExisting writes it TRULY 0-BYTE (perri BINDING PIN 1 — NO sentinel/placeholder EVER, else her non-empty=fresh discriminator misfires a spurious --session-id adopt). Core owns the file lifecycle: write-before-spawn each turn, overwrite in place, persists between turns in the nested perch (debuggability); never deleted per turn. perri shim delta: --psyche-context-file <path> arg, read-file prefix, TRIM-based emptiness (her tolerance, NOT core's license — core writes exactly 0 bytes on continue, PIN 2), read-failure = generic fail NEVER 95, never writes/deletes the file. Red-first: a ~40KB mind → the old {psyche_context}-on-argv path BRICKS the win32 shim spawn; the file path succeeds (shim reads the full mind from file).",
2026-08-28T09:54:47.7912510Z       "requiredStages": [
2026-08-28T09:54:47.7912777Z         "doc",
2026-08-28T09:54:47.7913034Z         "impl",
2026-08-28T09:54:47.7913300Z         "unit",
2026-08-28T09:54:47.7913553Z         "int"
2026-08-28T09:54:47.7913868Z       ],
2026-08-28T09:54:47.7914127Z       "stages": {
2026-08-28T09:54:47.7914396Z         "doc": {
2026-08-28T09:54:47.7914683Z           "complete": true,
2026-08-28T09:54:47.7914959Z           "evidence": [
2026-08-28T09:54:47.7915221Z             {
2026-08-28T09:54:47.7915535Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.7915813Z               "line": 134
2026-08-28T09:54:47.7916061Z             }
2026-08-28T09:54:47.7916334Z           ]
2026-08-28T09:54:47.7916584Z         },
2026-08-28T09:54:47.7916853Z         "impl": {
2026-08-28T09:54:47.7917134Z           "complete": true,
2026-08-28T09:54:47.7917406Z           "evidence": [
2026-08-28T09:54:47.7917674Z             {
2026-08-28T09:54:47.7918050Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7918327Z               "line": 94
2026-08-28T09:54:47.7918585Z             },
2026-08-28T09:54:47.7918848Z             {
2026-08-28T09:54:47.7919351Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7919639Z               "line": 331
2026-08-28T09:54:47.7919898Z             }
2026-08-28T09:54:47.7920160Z           ]
2026-08-28T09:54:47.7920422Z         },
2026-08-28T09:54:47.7920669Z         "int": {
2026-08-28T09:54:47.7920955Z           "complete": true,
2026-08-28T09:54:47.7921227Z           "evidence": [
2026-08-28T09:54:47.7921486Z             {
2026-08-28T09:54:47.7921965Z               "path": "crates/spt-daemon/tests/psyche_context_file_e2e.rs",
2026-08-28T09:54:47.7922311Z               "line": 28
2026-08-28T09:54:47.7922569Z             },
2026-08-28T09:54:47.7922827Z             {
2026-08-28T09:54:47.7923293Z               "path": "crates/spt-daemon/tests/psyche_context_file_e2e.rs",
2026-08-28T09:54:47.7923565Z               "line": 120
2026-08-28T09:54:47.7923823Z             },
2026-08-28T09:54:47.7924071Z             {
2026-08-28T09:54:47.7924543Z               "path": "crates/spt-daemon/tests/psyche_context_file_e2e.rs",
2026-08-28T09:54:47.7924808Z               "line": 192
2026-08-28T09:54:47.7925067Z             }
2026-08-28T09:54:47.7925324Z           ]
2026-08-28T09:54:47.7925649Z         },
2026-08-28T09:54:47.7925911Z         "unit": {
2026-08-28T09:54:47.7926192Z           "complete": true,
2026-08-28T09:54:47.7926468Z           "evidence": [
2026-08-28T09:54:47.7926716Z             {
2026-08-28T09:54:47.7927096Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7927390Z               "line": 2743
2026-08-28T09:54:47.7927643Z             },
2026-08-28T09:54:47.7927905Z             {
2026-08-28T09:54:47.7928291Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7928568Z               "line": 2847
2026-08-28T09:54:47.7928821Z             }
2026-08-28T09:54:47.7929169Z           ]
2026-08-28T09:54:47.7929417Z         }
2026-08-28T09:54:47.7929674Z       }
2026-08-28T09:54:47.7929926Z     },
2026-08-28T09:54:47.7930190Z     {
2026-08-28T09:54:47.7930576Z       "id": "REQ-PSYCHE-CRASHLOOP-BACKOFF-SHUTDOWN",
2026-08-28T09:54:47.7935473Z       "title": "C3 (F028, perri F-h): psyche wrapper crash-loop has no backoff, and `endpoint shutdown` misses a wedged wrapper. A probe psyche crash-looped ~3 boots/sec for ~30min (CC died instantly on the untrusted owlery cwd; ledger hit ordinal 5358) — SILENTLY; and `spt endpoint shutdown` did NOT tear the looping wrapper down (docs say shutdown tears the Psyche with the perch; manual kill was required). FIX: (i) bounded backoff + loud give-up on a psyche boot loop (the psyche_host_error surface already exists), (ii) shutdown must cover a wedged/looping wrapper. See triage C3.",
2026-08-28T09:54:47.7935861Z       "requiredStages": [],
2026-08-28T09:54:47.7936128Z       "stages": {
2026-08-28T09:54:47.7936394Z         "doc": {
2026-08-28T09:54:47.7936684Z           "complete": false,
2026-08-28T09:54:47.7936966Z           "evidence": []
2026-08-28T09:54:47.7937224Z         },
2026-08-28T09:54:47.7937491Z         "impl": {
2026-08-28T09:54:47.7937776Z           "complete": true,
2026-08-28T09:54:47.7938108Z           "evidence": [
2026-08-28T09:54:47.7938365Z             {
2026-08-28T09:54:47.7938742Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:47.7939148Z               "line": 491
2026-08-28T09:54:47.7939442Z             },
2026-08-28T09:54:47.7939682Z             {
2026-08-28T09:54:47.7940020Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.7940292Z               "line": 390
2026-08-28T09:54:47.7940547Z             },
2026-08-28T09:54:47.7940860Z             {
2026-08-28T09:54:47.7941281Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.7945802Z               "line": 429
2026-08-28T09:54:47.7946091Z             }
2026-08-28T09:54:47.7946353Z           ]
2026-08-28T09:54:47.7946610Z         },
2026-08-28T09:54:47.7946878Z         "int": {
2026-08-28T09:54:47.7947183Z           "complete": false,
2026-08-28T09:54:47.7947455Z           "evidence": []
2026-08-28T09:54:47.7947722Z         },
2026-08-28T09:54:47.7947990Z         "unit": {
2026-08-28T09:54:47.7948283Z           "complete": true,
2026-08-28T09:54:47.7948553Z           "evidence": [
2026-08-28T09:54:47.7948810Z             {
2026-08-28T09:54:47.7949288Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.7949584Z               "line": 672
2026-08-28T09:54:47.7949841Z             },
2026-08-28T09:54:47.7950098Z             {
2026-08-28T09:54:47.7950445Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.7950809Z               "line": 873
2026-08-28T09:54:47.7951070Z             },
2026-08-28T09:54:47.7951316Z             {
2026-08-28T09:54:47.7951715Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:47.7951992Z               "line": 918
2026-08-28T09:54:47.7952245Z             }
2026-08-28T09:54:47.7952503Z           ]
2026-08-28T09:54:47.7952751Z         }
2026-08-28T09:54:47.7953008Z       }
2026-08-28T09:54:47.7953260Z     },
2026-08-28T09:54:47.7953514Z     {
2026-08-28T09:54:47.7953845Z       "id": "REQ-PSYCHE-EPHEMERAL-DRIVER",
2026-08-28T09:54:47.7963335Z       "title": "W1 (F030, design §3): each psyche-relevant event runs exactly ONE bounded per-event turn through the existing driver stack (psyche_turn_and_relay for outbound-intent events / resume_psyche for session-custody transitions / run_psyche_turn for pure merges) — no resident psyche process exists between events. host_one (livehost.rs:518) STOPS spawning spawn_psyche_owned; the pulse loop stays as the daemon-side scheduler (thread + stop-flag + drop-dir watch correct) but a fire now invokes one bounded turn, daemon-driving every substitution key from daemon-known context (child never self-resolves home/subnet/perch — direction-(a) multi-subnet churn impossible by construction). Turn failures consume a bounded failure budget (C3(b) shape): N consecutive failures → psyche_host_error stamp + cooldown, reset on success; no respawn storm (nothing resident to respawn). Red-first: fire an event on a hosted live endpoint → assert one turn ran (SIDE-EFFECT PROOF FILE — transcript-jsonl asserts are structurally blind, 2026-07-04 rig lesson) and no {id}-psyche process survives the turn.",
2026-08-28T09:54:47.7963759Z       "requiredStages": [
2026-08-28T09:54:47.7964022Z         "doc",
2026-08-28T09:54:47.7964263Z         "impl",
2026-08-28T09:54:47.7964528Z         "unit",
2026-08-28T09:54:47.7964780Z         "int"
2026-08-28T09:54:47.7965038Z       ],
2026-08-28T09:54:47.7965452Z       "stages": {
2026-08-28T09:54:47.7965820Z         "doc": {
2026-08-28T09:54:47.7966158Z           "complete": true,
2026-08-28T09:54:47.7966435Z           "evidence": [
2026-08-28T09:54:47.7966707Z             {
2026-08-28T09:54:47.7967016Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.7967298Z               "line": 245
2026-08-28T09:54:47.7967550Z             },
2026-08-28T09:54:47.7967808Z             {
2026-08-28T09:54:47.7968122Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.7968408Z               "line": 128
2026-08-28T09:54:47.7968743Z             },
2026-08-28T09:54:47.7969106Z             {
2026-08-28T09:54:47.7969668Z               "path": "docs/adr/0025-live-daemon-coordinated-adapter-update.md",
2026-08-28T09:54:47.7969940Z               "line": 69
2026-08-28T09:54:47.7970198Z             }
2026-08-28T09:54:47.7970451Z           ]
2026-08-28T09:54:47.7970714Z         },
2026-08-28T09:54:47.7970975Z         "impl": {
2026-08-28T09:54:47.7971270Z           "complete": true,
2026-08-28T09:54:47.7971533Z           "evidence": [
2026-08-28T09:54:47.7971795Z             {
2026-08-28T09:54:47.7972180Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7972455Z               "line": 127
2026-08-28T09:54:47.7972712Z             },
2026-08-28T09:54:47.7972965Z             {
2026-08-28T09:54:47.7973342Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7973609Z               "line": 1004
2026-08-28T09:54:47.7973871Z             },
2026-08-28T09:54:47.7974123Z             {
2026-08-28T09:54:47.7974496Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7974775Z               "line": 1082
2026-08-28T09:54:47.7975026Z             },
2026-08-28T09:54:47.7975285Z             {
2026-08-28T09:54:47.7975656Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7975932Z               "line": 1391
2026-08-28T09:54:47.7976186Z             },
2026-08-28T09:54:47.7976443Z             {
2026-08-28T09:54:47.7976820Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7977163Z               "line": 1404
2026-08-28T09:54:47.7977421Z             },
2026-08-28T09:54:47.7977680Z             {
2026-08-28T09:54:47.7978053Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7978324Z               "line": 1487
2026-08-28T09:54:47.7978586Z             },
2026-08-28T09:54:47.7978835Z             {
2026-08-28T09:54:47.7979303Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7979584Z               "line": 1583
2026-08-28T09:54:47.7979835Z             },
2026-08-28T09:54:47.7980157Z             {
2026-08-28T09:54:47.7980529Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7980800Z               "line": 1697
2026-08-28T09:54:47.7981054Z             },
2026-08-28T09:54:47.7981307Z             {
2026-08-28T09:54:47.7981673Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.7981960Z               "line": 648
2026-08-28T09:54:47.7982223Z             },
2026-08-28T09:54:47.7982480Z             {
2026-08-28T09:54:47.7982845Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:47.7983109Z               "line": 206
2026-08-28T09:54:47.7983367Z             }
2026-08-28T09:54:47.7983616Z           ]
2026-08-28T09:54:47.7984035Z         },
2026-08-28T09:54:47.7984345Z         "int": {
2026-08-28T09:54:47.7984616Z           "complete": true,
2026-08-28T09:54:47.7984884Z           "evidence": [
2026-08-28T09:54:47.7985138Z             {
2026-08-28T09:54:47.7985652Z               "path": "crates/spt-daemon/tests/psyche_event_turn_e2e.rs",
2026-08-28T09:54:47.7985920Z               "line": 22
2026-08-28T09:54:47.7986178Z             },
2026-08-28T09:54:47.7986426Z             {
2026-08-28T09:54:47.7986874Z               "path": "crates/spt-daemon/tests/psyche_event_turn_e2e.rs",
2026-08-28T09:54:47.7987140Z               "line": 80
2026-08-28T09:54:47.7987498Z             },
2026-08-28T09:54:47.7987765Z             {
2026-08-28T09:54:47.7988217Z               "path": "crates/spt-daemon/tests/psyche_event_turn_e2e.rs",
2026-08-28T09:54:47.7988522Z               "line": 144
2026-08-28T09:54:47.7988771Z             }
2026-08-28T09:54:47.7989104Z           ]
2026-08-28T09:54:47.7989366Z         },
2026-08-28T09:54:47.7989639Z         "unit": {
2026-08-28T09:54:47.7989930Z           "complete": true,
2026-08-28T09:54:47.7990202Z           "evidence": [
2026-08-28T09:54:47.7990457Z             {
2026-08-28T09:54:47.7990962Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7991237Z               "line": 2334
2026-08-28T09:54:47.7991495Z             },
2026-08-28T09:54:47.7991751Z             {
2026-08-28T09:54:47.7992124Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.7992415Z               "line": 2646
2026-08-28T09:54:47.7992672Z             }
2026-08-28T09:54:47.7992920Z           ]
2026-08-28T09:54:47.7993173Z         }
2026-08-28T09:54:47.7993429Z       }
2026-08-28T09:54:47.7993684Z     },
2026-08-28T09:54:47.7993932Z     {
2026-08-28T09:54:47.7994343Z       "id": "REQ-PSYCHE-FAULT-SLOTS-SURVIVE-RESTART",
2026-08-28T09:54:47.8023595Z       "title": "A PSYCHE FAULT STAMP REMEMBERS WHICH LATCH SLOT PRODUCED IT, SO A DAEMON RESTART CANNOT CLEAR A FAULT IT NEVER SAW. ROOT (releases#115): the three fault latches -- latch_turn, latch_ingest, latch_timeout -- live in memory behind a Mutex and are never seeded from disk, while the `psyche_host_error` stamp they compose to OUTLIVES the process on disk. After a bounce the stamp stands with nothing standing behind it, so the first `note_success` of ANY kind recomposes an empty latch set to None and clears a fault whose kind this process never learned. THE PER-KIND SEPARATION BAROMETER W1 BUILT IS THEREFORE UNDONE BY A RESTART: one working ingest erases a standing turn defect it says nothing about, which is precisely the vouching REQ-PSYCHE-HARD-BUDGET-PER-KIND exists to forbid -- the defect does not lose information at the margin, it re-opens a closed hazard. FIX: the stamp carries a SLOT-KEYED sibling map written by the SAME seam that writes the reason, so the sentence and the latches that produced it can never disagree on disk, and the pulse loop seeds its latches from that map at startup BEFORE any tick can report a success. THE KEY IS A LATCH SLOT, NOT A KIND, and the distinction is load-bearing rather than nominal: there are THREE slots against TWO kinds, because the timeout latch is shared cross-kind by the ruled BAROMETER W1 semantics and belongs to no kind at all -- a kind-keyed reading would be re-read later as a per-kind register and gain a fourth key the day a fourth kind appears. THE VOCABULARY IS CLOSED to those three slots, and an unrecognized key is IGNORED AND ANNOUNCED rather than seeded: an unknown slot can only come from a newer binary owning a latch this one has no code to clear, so seeding it would strand a fault that no success could ever recompose away, while dropping it silently would make a rollback that loses a standing fault look identical to a recovery. A PRE-#115 STAMP CARRIES NO SLOTS AND SEEDS NOTHING, deliberately: its kind is genuinely unrecoverable, and the honest behaviour for an unknown-kind fault is the one that shipped, where any success clears it (REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS) -- inventing a kind for it would be worse than forgetting one. `reason` stays BYTE-IDENTICAL, and the map is serde-default plus skip-when-empty so a stamp with no standing latches serializes byte-identically to the pre-#115 shape; N-1 holds in BOTH directions, the old-binary/new-record leg proven by a MEASURED absence of any live deny_unknown_fields attribute repo-wide (zero, on this struct and on InfoJson alike) rather than by assuming serde's default. Gate: impl -- the slot-keyed map on the stamp, written by the single existing writer alongside the reason it composed to, the closed three-slot vocabulary with ignore-and-log on an unknown key, and the pulse-loop seed running before the first tick; unit -- a stamp whose slots record a standing INGEST fault SURVIVES a fresh process reporting a TURN success (the row the shipped code cannot pass, since an unseeded set recomposes to None and clears it), a seeded latch IS still cleared by a success of ITS OWN slot (asserted alongside, since the survival row alone passes an implementation that has simply stopped clearing anything), a pre-#115 SLOTLESS stamp is still cleared by any success (the N-1 behaviour-preservation row), and an UNKNOWN slot key seeds NO latch while a known key beside it in the same map DOES seed (the pair asserted together, since over an unknown key alone a seed-nothing implementation and a correct one agree).",
2026-08-28T09:54:47.8024153Z       "requiredStages": [
2026-08-28T09:54:47.8024410Z         "impl",
2026-08-28T09:54:47.8024667Z         "unit"
2026-08-28T09:54:47.8024920Z       ],
2026-08-28T09:54:47.8025185Z       "stages": {
2026-08-28T09:54:47.8025441Z         "doc": {
2026-08-28T09:54:47.8025728Z           "complete": false,
2026-08-28T09:54:47.8026008Z           "evidence": []
2026-08-28T09:54:47.8026265Z         },
2026-08-28T09:54:47.8026524Z         "impl": {
2026-08-28T09:54:47.8026805Z           "complete": true,
2026-08-28T09:54:47.8027083Z           "evidence": [
2026-08-28T09:54:47.8027335Z             {
2026-08-28T09:54:47.8027729Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8028003Z               "line": 257
2026-08-28T09:54:47.8028261Z             },
2026-08-28T09:54:47.8028518Z             {
2026-08-28T09:54:47.8028880Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8029268Z               "line": 283
2026-08-28T09:54:47.8029534Z             },
2026-08-28T09:54:47.8029791Z             {
2026-08-28T09:54:47.8030169Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8030443Z               "line": 1088
2026-08-28T09:54:47.8030706Z             },
2026-08-28T09:54:47.8030964Z             {
2026-08-28T09:54:47.8031345Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8031688Z               "line": 1344
2026-08-28T09:54:47.8031950Z             },
2026-08-28T09:54:47.8032203Z             {
2026-08-28T09:54:47.8032584Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8032855Z               "line": 1365
2026-08-28T09:54:47.8033116Z             },
2026-08-28T09:54:47.8033377Z             {
2026-08-28T09:54:47.8033711Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.8033987Z               "line": 760
2026-08-28T09:54:47.8034241Z             }
2026-08-28T09:54:47.8034555Z           ]
2026-08-28T09:54:47.8034803Z         },
2026-08-28T09:54:47.8035061Z         "int": {
2026-08-28T09:54:47.8035344Z           "complete": false,
2026-08-28T09:54:47.8035622Z           "evidence": []
2026-08-28T09:54:47.8035891Z         },
2026-08-28T09:54:47.8036150Z         "unit": {
2026-08-28T09:54:47.8036441Z           "complete": true,
2026-08-28T09:54:47.8036708Z           "evidence": [
2026-08-28T09:54:47.8036965Z             {
2026-08-28T09:54:47.8037337Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8037609Z               "line": 3298
2026-08-28T09:54:47.8037862Z             },
2026-08-28T09:54:47.8038136Z             {
2026-08-28T09:54:47.8038506Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8038773Z               "line": 3387
2026-08-28T09:54:47.8039140Z             },
2026-08-28T09:54:47.8039392Z             {
2026-08-28T09:54:47.8039765Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.8040041Z               "line": 1720
2026-08-28T09:54:47.8040294Z             }
2026-08-28T09:54:47.8040543Z           ]
2026-08-28T09:54:47.8040801Z         }
2026-08-28T09:54:47.8041061Z       }
2026-08-28T09:54:47.8041313Z     },
2026-08-28T09:54:47.8041566Z     {
2026-08-28T09:54:47.8041919Z       "id": "REQ-PSYCHE-HARD-BUDGET-PER-KIND",
2026-08-28T09:54:47.8063889Z       "title": "INGEST JOINS BOTH SIDES OF THE PSYCHE HEALTH STAMP, AND HARD FAILURES ARE COUNTED PER KIND SO ONE WORKING SUBSYSTEM CANNOT VOUCH FOR A BROKEN ONE. FILED ROOT (releases#97): clearing is keyed to psyche TURNS while the health question in the field was drop INGEST, so an endpoint printed FAILED with a stale stamp while ingest demonstrably worked. THE FAILING SIDE IS WORSE THAN FILED, found at recon: the ingest leg is `ingest_drops(...)?` inside `pulse_tick` and the loop swallows the error (`Err(_) => { /* a transient tick error must not kill the loop */ }`), so a hard ingest failure today produces NO strike, NO stamp and NO stderr line, and additionally SKIPS that tick's psyche turn and commune-sync entirely. FIX, RULED: capture-and-continue -- the ingest outcome is classified and fed to the budget BEFORE the turn runs, and the tick then proceeds to the turn and echo. The behaviour change is deliberate: a turn over possibly-stale context, plus a struck budget, plus the expectation surfacing, beats a silently dead psyche forever. AN INGEST SUCCESS IS AT LEAST ONE DROP ACTUALLY INGESTED -- an empty sweep is neither success nor failure, because nothing ran and nothing was proven healthy, the same reasoning the role-absent skip already carries. THAT DEFINITION IS LOAD-BEARING, NOT PEDANTRY: were an empty sweep a success, the stamp would clear on nearly every tick, no budget could ever reach its latch, and the change would read as a fix while disabling the stamp it repairs. COUNTERS ARE PER KIND (turn, ingest), three consecutive each, and a success resets ONLY its own kind -- ingest working does not disprove a turn defect, nor the reverse. The stamp remains the single existing `psyche_host_error` field, current-state, and its reason names the kind and the class. Gate: impl -- the ingest error captured rather than propagated, classified, recorded before the turn, the tick continuing to turn and echo, per-kind consecutive hard counters with own-kind-only reset, and the reason text naming kind and class; unit -- three consecutive ingest hard failures stamp with an ingest-hard reason WHILE turns are succeeding on the same fixture (the row the shipped code cannot pass and a shared-counter implementation also fails, since the turn successes would reset it), an ingest success clears the ingest counter and leaves a standing turn counter untouched, an EMPTY sweep neither clears nor strikes either counter (asserted against a fixture with a non-zero counter standing, since over a zeroed counter a clearing implementation and a correct one agree), and a hard ingest failure still lets the SAME tick run its turn (the capture-and-continue row, which the pre-fix `?` fails by construction).",
2026-08-28T09:54:47.8064421Z       "requiredStages": [
2026-08-28T09:54:47.8064681Z         "impl",
2026-08-28T09:54:47.8064948Z         "unit"
2026-08-28T09:54:47.8065196Z       ],
2026-08-28T09:54:47.8065464Z       "stages": {
2026-08-28T09:54:47.8065712Z         "doc": {
2026-08-28T09:54:47.8065983Z           "complete": false,
2026-08-28T09:54:47.8066274Z           "evidence": []
2026-08-28T09:54:47.8066521Z         },
2026-08-28T09:54:47.8066798Z         "impl": {
2026-08-28T09:54:47.8067095Z           "complete": true,
2026-08-28T09:54:47.8067360Z           "evidence": [
2026-08-28T09:54:47.8067605Z             {
2026-08-28T09:54:47.8067998Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8068273Z               "line": 917
2026-08-28T09:54:47.8068535Z             },
2026-08-28T09:54:47.8068788Z             {
2026-08-28T09:54:47.8069252Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8069533Z               "line": 978
2026-08-28T09:54:47.8069783Z             },
2026-08-28T09:54:47.8070044Z             {
2026-08-28T09:54:47.8070420Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8070697Z               "line": 1311
2026-08-28T09:54:47.8070950Z             },
2026-08-28T09:54:47.8071208Z             {
2026-08-28T09:54:47.8071641Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8071917Z               "line": 1705
2026-08-28T09:54:47.8072181Z             },
2026-08-28T09:54:47.8072438Z             {
2026-08-28T09:54:47.8072843Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8073143Z               "line": 1743
2026-08-28T09:54:47.8073424Z             }
2026-08-28T09:54:47.8073704Z           ]
2026-08-28T09:54:47.8073986Z         },
2026-08-28T09:54:47.8074272Z         "int": {
2026-08-28T09:54:47.8074577Z           "complete": false,
2026-08-28T09:54:47.8074948Z           "evidence": []
2026-08-28T09:54:47.8075237Z         },
2026-08-28T09:54:47.8075527Z         "unit": {
2026-08-28T09:54:47.8075832Z           "complete": true,
2026-08-28T09:54:47.8076133Z           "evidence": [
2026-08-28T09:54:47.8076414Z             {
2026-08-28T09:54:47.8076814Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8077120Z               "line": 2449
2026-08-28T09:54:47.8077405Z             },
2026-08-28T09:54:47.8077687Z             {
2026-08-28T09:54:47.8078085Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8078380Z               "line": 2487
2026-08-28T09:54:47.8078662Z             }
2026-08-28T09:54:47.8079033Z           ]
2026-08-28T09:54:47.8079310Z         }
2026-08-28T09:54:47.8079596Z       }
2026-08-28T09:54:47.8079878Z     },
2026-08-28T09:54:47.8080151Z     {
2026-08-28T09:54:47.8080524Z       "id": "REQ-PSYCHE-INGEST-FAILURE-LOUD",
2026-08-28T09:54:47.8109302Z       "title": "A COMMUNE THAT CAN NEVER INGEST IS LOUD WHERE IT IS NOTICED, AND NEVER LETS A RESUME SERVE THE STALE TIER AS IF IT WERE FRESH. MECHANISM (field-settled, and NOT the one this requirement was minted describing -- see the amendment note): a commune written from a cwd other than the endpoint's REGISTERED one silently never enters the tier. The ingest resolves the manifest's drop dir against the endpoint's recorded cwd; a drop written from a worktree, or any non-registered dir, lands somewhere nothing watches. NOTHING FAILS -- so no error is stamped, no strike accrues, and the surfacing that does exist is structurally incapable of firing. The durable tier keeps the PREVIOUS commune and the next resume is rebuilt from it, confidently and wrong. THE SEAM IS AN ANCHOR DISAGREEMENT INSIDE ONE BRIEF: the ingest anchors the drop dir to the endpoint's registered cwd, while the CLI brief composer joined the raw manifest dir against nothing, binding it to whatever cwd the CALLER ran in -- so the durable tiers came from the endpoint and the pending-drop lookup came from the caller, and the two could name different directories without either being wrong on its own terms. TWO INVARIANTS, AND THE SECOND IS THE ONE THAT BITES: (1) a drop that can never ingest is surfaced at the instant a resume is composed over it -- the one moment the degraded party is listening -- and NAMES ITS ABSOLUTE PATH, because the recovery is reading the file and that is only actionable if the party is told where it is; (2) a resume composed over such a drop does not present its durable tiers as current -- the staleness is carried WITH the context rather than inferred by an agent lucky enough to have a nonce discipline. A LOST INGEST IS NOT A LOST FILE: the drop survives on disk and the wake leg fires correctly, so the recovery exists and is cheap. That is the field mitigation already proven to work, and naming the unspooled file is the actionable half of being loud. PAIR, NOT SEQUENCE (acceptance condition): before the anchor was corrected a worktree session found its own misplaced drop BY ACCIDENT, because the composer's lookup was wrong in the same direction the drop was; correcting the anchor without a deliberate misplacement arm in the SAME change would delete that accidental recovery and silently re-open the hole. SCOPE IS SPT-CORE-SIDE -- the daemon AND the CLI brief composer; the harness ADAPTER is untouched. That distinction is the whole of the scope line and is not to be re-litigated: `resolve_filedrops` is spt-core's own code at the seam the adapter calls, and leaving the CLI brief wrong fails invariant 2 at the exact surface an operator reads. Gate: impl -- one shared drop-dir resolver both composers route through, the misplacement arm paired with it, the compose-instant surfacing carrying the unspooled drop's absolute path, the resume refusing to present a never-ingested drop's tiers as fresh, and the registered drop dir surfaced on the endpoint's own info (the only fact that makes a surviving drop classifiable as misplaced-versus-failed by anyone but its owner); unit -- a misplaced drop emits its surfacing ONCE and names the file while a CONSUMED drop emits none (the pair asserted together, since the misplaced row alone passes an implementation that shouts on every compose), a resume over a misplaced drop is marked stale while the SAME resume over a registered drop is not (the discriminator, since both otherwise return the same shaped context and an implementation that marks nothing, or everything, satisfies either row alone), and -- the acceptance row -- a misplaced drop is still FOUND after the anchor is correct, since the anchor fix alone would make it invisible and read as a clean pass.",
2026-08-28T09:54:47.8109909Z       "requiredStages": [
2026-08-28T09:54:47.8110175Z         "impl",
2026-08-28T09:54:47.8110432Z         "unit",
2026-08-28T09:54:47.8110695Z         "int"
2026-08-28T09:54:47.8110948Z       ],
2026-08-28T09:54:47.8111201Z       "stages": {
2026-08-28T09:54:47.8111463Z         "doc": {
2026-08-28T09:54:47.8111739Z           "complete": false,
2026-08-28T09:54:47.8112024Z           "evidence": []
2026-08-28T09:54:47.8112285Z         },
2026-08-28T09:54:47.8112542Z         "impl": {
2026-08-28T09:54:47.8112829Z           "complete": true,
2026-08-28T09:54:47.8113100Z           "evidence": [
2026-08-28T09:54:47.8113357Z             {
2026-08-28T09:54:47.8113773Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8114049Z               "line": 369
2026-08-28T09:54:47.8114306Z             },
2026-08-28T09:54:47.8114606Z             {
2026-08-28T09:54:47.8114957Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.8115225Z               "line": 54
2026-08-28T09:54:47.8115488Z             },
2026-08-28T09:54:47.8115740Z             {
2026-08-28T09:54:47.8116102Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8116370Z               "line": 49
2026-08-28T09:54:47.8116638Z             },
2026-08-28T09:54:47.8116899Z             {
2026-08-28T09:54:47.8117250Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8117568Z               "line": 161
2026-08-28T09:54:47.8117820Z             },
2026-08-28T09:54:47.8118078Z             {
2026-08-28T09:54:47.8118421Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8118702Z               "line": 235
2026-08-28T09:54:47.8119041Z             },
2026-08-28T09:54:47.8119299Z             {
2026-08-28T09:54:47.8119656Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8119928Z               "line": 250
2026-08-28T09:54:47.8120184Z             },
2026-08-28T09:54:47.8120435Z             {
2026-08-28T09:54:47.8120803Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.8121069Z               "line": 786
2026-08-28T09:54:47.8121326Z             },
2026-08-28T09:54:47.8121575Z             {
2026-08-28T09:54:47.8121951Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.8122242Z               "line": 867
2026-08-28T09:54:47.8122514Z             },
2026-08-28T09:54:47.8122765Z             {
2026-08-28T09:54:47.8123079Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8123355Z               "line": 6219
2026-08-28T09:54:47.8123607Z             },
2026-08-28T09:54:47.8123864Z             {
2026-08-28T09:54:47.8124175Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8124452Z               "line": 6234
2026-08-28T09:54:47.8124775Z             }
2026-08-28T09:54:47.8125033Z           ]
2026-08-28T09:54:47.8125287Z         },
2026-08-28T09:54:47.8125547Z         "int": {
2026-08-28T09:54:47.8125814Z           "complete": true,
2026-08-28T09:54:47.8126095Z           "evidence": [
2026-08-28T09:54:47.8126368Z             {
2026-08-28T09:54:47.8126748Z               "path": "crates/spt/tests/commune_two_cwd_e2e.rs",
2026-08-28T09:54:47.8127025Z               "line": 212
2026-08-28T09:54:47.8127278Z             },
2026-08-28T09:54:47.8127537Z             {
2026-08-28T09:54:47.8127975Z               "path": "crates/spt/tests/commune_two_cwd_e2e.rs",
2026-08-28T09:54:47.8128257Z               "line": 240
2026-08-28T09:54:47.8128524Z             },
2026-08-28T09:54:47.8128777Z             {
2026-08-28T09:54:47.8129267Z               "path": "crates/spt/tests/commune_two_cwd_e2e.rs",
2026-08-28T09:54:47.8129539Z               "line": 257
2026-08-28T09:54:47.8129793Z             },
2026-08-28T09:54:47.8130046Z             {
2026-08-28T09:54:47.8130427Z               "path": "crates/spt/tests/commune_two_cwd_e2e.rs",
2026-08-28T09:54:47.8130697Z               "line": 293
2026-08-28T09:54:47.8130951Z             }
2026-08-28T09:54:47.8131209Z           ]
2026-08-28T09:54:47.8131463Z         },
2026-08-28T09:54:47.8131725Z         "unit": {
2026-08-28T09:54:47.8132002Z           "complete": true,
2026-08-28T09:54:47.8132269Z           "evidence": [
2026-08-28T09:54:47.8132521Z             {
2026-08-28T09:54:47.8132879Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8133159Z               "line": 549
2026-08-28T09:54:47.8133414Z             },
2026-08-28T09:54:47.8133667Z             {
2026-08-28T09:54:47.8134015Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8134287Z               "line": 591
2026-08-28T09:54:47.8134545Z             },
2026-08-28T09:54:47.8134802Z             {
2026-08-28T09:54:47.8135170Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.8135455Z               "line": 1813
2026-08-28T09:54:47.8135785Z             }
2026-08-28T09:54:47.8136040Z           ]
2026-08-28T09:54:47.8136293Z         }
2026-08-28T09:54:47.8136555Z       }
2026-08-28T09:54:47.8136814Z     },
2026-08-28T09:54:47.8137056Z     {
2026-08-28T09:54:47.8137424Z       "id": "REQ-PSYCHE-INGEST-FAULT-BRIEF-WARN",
2026-08-28T09:54:47.8151252Z       "title": "A RESUME BRIEF COMPOSED WHILE AN INGEST FAULT STANDS SAYS SO, IN THE BRIEF (releases#221 leg 2): a terminal ingest failure already LATCHES per-kind (`PsycheBudgets.latch_ingest`, hard budget 3) and already stamps `psyche_host_error`, so the fact is PULLABLE from `endpoint list` -- but it is PUSHED NOWHERE, and the agent whose durable tier just failed to take its commune is precisely the agent about to be rebuilt from the PREVIOUS one, confidently and wrong. The brief gains ONE WARNING LINE beside the existing staleness sentence and in the same voice (the REQ-PSYCHE-INGEST-FAILURE-LOUD invariant-2 family in `resume.rs`) -- reading it IS the recovery, so it names what is degraded and what the reader should distrust. THE TRIGGER IS ANY STANDING INGEST LATCH AT BRIEF-COMPOSE TIME, not only the terminal strike (doyle ruling 5): the latch IS the standing-fault vocabulary, and a brief composed under a standing fault is exactly the degraded read the ticket is about. NO DURABLE MESSAGE IN V1 -- the brief reaches the agent at the ONE moment the fact is actionable, while a message would also reach it mid-work where it can do nothing. A clean latch set adds NOTHING to the brief: the healthy brief's bytes are unchanged, so the warning's presence is the signal and its absence is not a claim of health by omission. Gate: impl -- the latch read at compose + the warning line; unit -- a brief composed with a standing ingest latch carries the line and names the fault, the SAME brief with no standing latch is byte-identical to the pre-change shape (the vacuity guard: a line that always renders proves nothing), and a standing TURN latch alone does NOT emit the ingest warning (the per-kind separation BAROMETER W1 built must not be undone by the reader).",
2026-08-28T09:54:47.8151722Z       "requiredStages": [
2026-08-28T09:54:47.8151982Z         "impl",
2026-08-28T09:54:47.8152245Z         "unit"
2026-08-28T09:54:47.8152503Z       ],
2026-08-28T09:54:47.8152774Z       "stages": {
2026-08-28T09:54:47.8153035Z         "doc": {
2026-08-28T09:54:47.8153408Z           "complete": false,
2026-08-28T09:54:47.8153851Z           "evidence": []
2026-08-28T09:54:47.8154246Z         },
2026-08-28T09:54:47.8154529Z         "impl": {
2026-08-28T09:54:47.8154906Z           "complete": true,
2026-08-28T09:54:47.8155187Z           "evidence": [
2026-08-28T09:54:47.8155441Z             {
2026-08-28T09:54:47.8155803Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8156079Z               "line": 86
2026-08-28T09:54:47.8156333Z             },
2026-08-28T09:54:47.8156600Z             {
2026-08-28T09:54:47.8156958Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.8157241Z               "line": 901
2026-08-28T09:54:47.8157494Z             }
2026-08-28T09:54:47.8157747Z           ]
2026-08-28T09:54:47.8158000Z         },
2026-08-28T09:54:47.8158258Z         "int": {
2026-08-28T09:54:47.8158545Z           "complete": false,
2026-08-28T09:54:47.8158816Z           "evidence": []
2026-08-28T09:54:47.8159203Z         },
2026-08-28T09:54:47.8159462Z         "unit": {
2026-08-28T09:54:47.8159765Z           "complete": true,
2026-08-28T09:54:47.8160037Z           "evidence": [
2026-08-28T09:54:47.8160295Z             {
2026-08-28T09:54:47.8160648Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8160925Z               "line": 475
2026-08-28T09:54:47.8161182Z             },
2026-08-28T09:54:47.8161430Z             {
2026-08-28T09:54:47.8161788Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8162060Z               "line": 518
2026-08-28T09:54:47.8162320Z             }
2026-08-28T09:54:47.8162575Z           ]
2026-08-28T09:54:47.8162899Z         }
2026-08-28T09:54:47.8163139Z       }
2026-08-28T09:54:47.8163397Z     },
2026-08-28T09:54:47.8163654Z     {
2026-08-28T09:54:47.8163997Z       "id": "REQ-PSYCHE-INGEST-INTENT-MARKER",
2026-08-28T09:54:47.8182264Z       "title": "A COMMUNE THAT WAS EXPECTED AND NEVER ARRIVED IS DETECTABLE POSITIVELY, PER ATTEMPT, RATHER THAN INFERRED FROM AN ABSENCE. ROOT (releases#96, split out of the #90 recon): the summarizer spawn killed at its bound dies BEFORE writing the drop file, so it produces no file and no ingest -- and every presence-based check is structurally blind to it, because there is nothing on disk to find and nothing failed loudly enough to stamp. AN ABSENCE CANNOT BE OBSERVED; AN EXPECTATION CAN. THE DISCRIMINATOR IS A WRITE-AHEAD INGEST-INTENT MARKER: the lifecycle persists an expected-ingest record (timestamp + trigger) BEFORE launching the summarizer spawn, a completed ingest CONSUMES it, and a marker still standing past the spawn budget with no corresponding drop positively identifies the killed-at-bound case for that attempt -- no staleness threshold to tune and no guessing. THE ORDERING IS THE PROPERTY, not an implementation detail: a marker written after the spawn returns cannot survive the case it exists to detect, exactly as an intention recorded only after an answer arrives cannot survive an answer that never comes. SURFACING rides where the degraded party is already listening -- at resume/compose, beside the un-ingested-drop warning, saying that a commune was expected and never ingested and that the reader may be resuming stale. The marker is therefore written by the daemon lifecycle and read by the CLI compose path, so its storage must serve both. A killed-at-bound attempt counts on the SOFT timeout budget, never the hard one. Gate: impl -- the marker persisted before the spawn with its timestamp and trigger, consumed on ingest completion, the orphan classified past the budget, the resume/compose surfacing, and the storage readable from the CLI compose seam; unit -- a spawn killed at its bound leaves a standing marker with no drop and classifies as the expected-never-ingested case, a completed ingest leaves NO marker (the pair asserted together, since the orphan row alone passes an implementation that never consumes and would then report every healthy commune as orphaned), a marker whose drop IS present is not classified orphaned, and the write-ahead ORDERING is asserted directly by observing the marker from a spawn that never returns -- a post-spawn write passes every other row and fails this one.",
2026-08-28T09:54:47.8182755Z       "requiredStages": [
2026-08-28T09:54:47.8183022Z         "doc",
2026-08-28T09:54:47.8183284Z         "impl",
2026-08-28T09:54:47.8183526Z         "unit"
2026-08-28T09:54:47.8183781Z       ],
2026-08-28T09:54:47.8184057Z       "stages": {
2026-08-28T09:54:47.8184325Z         "doc": {
2026-08-28T09:54:47.8184607Z           "complete": true,
2026-08-28T09:54:47.8184888Z           "evidence": [
2026-08-28T09:54:47.8185141Z             {
2026-08-28T09:54:47.8185598Z               "path": "docs-site/src/harness-contract/echo-commune.md",
2026-08-28T09:54:47.8185870Z               "line": 54
2026-08-28T09:54:47.8186122Z             }
2026-08-28T09:54:47.8186387Z           ]
2026-08-28T09:54:47.8186639Z         },
2026-08-28T09:54:47.8186901Z         "impl": {
2026-08-28T09:54:47.8187179Z           "complete": true,
2026-08-28T09:54:47.8187450Z           "evidence": [
2026-08-28T09:54:47.8187704Z             {
2026-08-28T09:54:47.8188084Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8188357Z               "line": 983
2026-08-28T09:54:47.8188614Z             },
2026-08-28T09:54:47.8188874Z             {
2026-08-28T09:54:47.8189342Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8189615Z               "line": 1266
2026-08-28T09:54:47.8189871Z             },
2026-08-28T09:54:47.8190123Z             {
2026-08-28T09:54:47.8190481Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8190845Z               "line": 117
2026-08-28T09:54:47.8191100Z             },
2026-08-28T09:54:47.8191360Z             {
2026-08-28T09:54:47.8191727Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.8191989Z               "line": 872
2026-08-28T09:54:47.8192247Z             }
2026-08-28T09:54:47.8192496Z           ]
2026-08-28T09:54:47.8192753Z         },
2026-08-28T09:54:47.8193005Z         "int": {
2026-08-28T09:54:47.8193287Z           "complete": false,
2026-08-28T09:54:47.8193567Z           "evidence": []
2026-08-28T09:54:47.8193826Z         },
2026-08-28T09:54:47.8194147Z         "unit": {
2026-08-28T09:54:47.8194423Z           "complete": true,
2026-08-28T09:54:47.8194700Z           "evidence": [
2026-08-28T09:54:47.8194956Z             {
2026-08-28T09:54:47.8195339Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8195620Z               "line": 2193
2026-08-28T09:54:47.8195872Z             },
2026-08-28T09:54:47.8196120Z             {
2026-08-28T09:54:47.8196505Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8196780Z               "line": 2246
2026-08-28T09:54:47.8197019Z             },
2026-08-28T09:54:47.8197295Z             {
2026-08-28T09:54:47.8197634Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:47.8197906Z               "line": 638
2026-08-28T09:54:47.8198153Z             },
2026-08-28T09:54:47.8198415Z             {
2026-08-28T09:54:47.8198797Z               "path": "crates/spt-store/src/commune_intent.rs",
2026-08-28T09:54:47.8199156Z               "line": 110
2026-08-28T09:54:47.8199420Z             },
2026-08-28T09:54:47.8199673Z             {
2026-08-28T09:54:47.8200059Z               "path": "crates/spt-store/src/commune_intent.rs",
2026-08-28T09:54:47.8200321Z               "line": 134
2026-08-28T09:54:47.8200579Z             },
2026-08-28T09:54:47.8200828Z             {
2026-08-28T09:54:47.8201280Z               "path": "crates/spt-store/src/commune_intent.rs",
2026-08-28T09:54:47.8201560Z               "line": 173
2026-08-28T09:54:47.8201813Z             },
2026-08-28T09:54:47.8202073Z             {
2026-08-28T09:54:47.8202455Z               "path": "crates/spt-store/src/commune_intent.rs",
2026-08-28T09:54:47.8202722Z               "line": 199
2026-08-28T09:54:47.8202974Z             }
2026-08-28T09:54:47.8203226Z           ]
2026-08-28T09:54:47.8203475Z         }
2026-08-28T09:54:47.8203747Z       }
2026-08-28T09:54:47.8204015Z     },
2026-08-28T09:54:47.8204258Z     {
2026-08-28T09:54:47.8204647Z       "id": "REQ-PSYCHE-INGEST-SERIALIZED",
2026-08-28T09:54:47.8232298Z       "title": "EVERY WRITE INTO A SHARED CONTEXT-STORE WORKTREE IS SERIALIZED BY AN EXCLUSIVE ADVISORY LOCK ON THAT WORKTREE, AND A LOSER WAITS RATHER THAN FAILING (releases#221): concurrent per-agent project-tier ingests commit into ONE shared `p-<project_id>` worktree and race git's `index.lock` and the branch's HEAD ref -- 6 PSYCHE_INGEST_FAIL across 3 agents measured on HFENDULEAM 2026-08-25, `fatal: Unable to create '.../worktrees/<name>/index.lock': File exists` and `cannot lock ref 'HEAD': is at X but expected Y`. THE LOCK LIVES AT THE LEAF GIT OPS OF `BranchStore` -- `commit_in_worktree`, `fast_forward_worktree`, `merge_commit_in_worktree` -- NOT at the ingest call site (doyle ruling 2): the ingest path is one of SIX writers of the same worktree (spt-live reconcile, syncmerge fast-forward + merge, contextstore conflict/rename/monic arms), several of them in OTHER PROCESSES, so a narrow guard leaves the identical collision reachable through a rarer door. It is an EXCLUSIVE FILE LOCK ON A STABLE NEVER-RENAMED SENTINEL keyed by the WORKTREE PATH (the `worker_seq` precedent: fs2, RAII-released on handle drop or process death, so a crashed holder strands no file and there is no stale-lock class to sweep) -- NEVER git's own `index.lock`, which stays exactly what `sweep_stale_index_locks` treats it as. THE LOCK IS NON-REENTRANT AND ACQUIRED ONLY AT THE LEAF, so a caller walking many worktrees (the rename loop) acquires them ONE AT A TIME and never nests -- the no-lock-ordering claim is an ASSERTION IN A UNIT, not a comment (doyle ruling 2 rider). ACQUISITION BLOCKS WITH A BOUND (doyle ruling 3): default 10s (two pulse periods; the guarded op is sub-second, so contention is milliseconds), overridable ONLY by a test-scoped `SPT_TEST_*` env var that never enters the operator vocabulary. A pulse tick MAY block -- it blocks only that endpoint's own driver thread, and failing fast is the very defect. ON TIMEOUT the acquire returns an ERROR carrying THE SENTINEL PATH AND THE ELAPSED WAIT BESIDE THE BOUND (at-budget vs under-budget is the only discriminator between a deadlock and a slow box), and that error rides the EXISTING capture-and-continue seam: PSYCHE_INGEST_FAIL is printed, a hard-ingest strike accrues, and THE DROP FILE IS PRESERVED -- nothing is consumed, so nothing is lost, and the F-032 preserve-pending arm (REQ-HAZARD-COMMUNE-INGEST-BLACKHOLE) is untouched beneath it. THE LOCK IS THE ONLY MECHANISM: no retry belt over git's own lock errors (doyle ruling 4) -- a second handler would make a broken lock invisible, and an index.lock failure observed WHILE the sentinel is held is a FINDING to file, never a transient to swallow. Sibling surface: REQ-PSYCHE-INGEST-FAILURE-LOUD (the misplaced-drop half of the same observability seam). Gate: impl -- the sentinel path fn + bounded exclusive acquire + its wiring at the three leaf ops; unit -- an acquire held by one handle makes a second measure elapsed >= the hold and THEN succeed (the lock is load-bearing, proven by elapsed not by a rate), the timeout error names the sentinel path AND the elapsed AND the bound, the bound is env-overridable in test scope only, a multi-worktree caller's acquisitions are sequential and never nested (the lock-ordering assertion), and a timed-out ingest DELETES NO DROP. int -- TWO PROCESSES committing concurrently into one shared worktree: zero failures, every slice PRESENT by existence read, per-arm durations reported, plus a DETERMINISTIC arm where process A holds the sentinel for a known T and process B's acquire measures elapsed >= T then succeeds.",
2026-08-28T09:54:47.8232828Z       "requiredStages": [
2026-08-28T09:54:47.8233095Z         "impl",
2026-08-28T09:54:47.8233355Z         "unit",
2026-08-28T09:54:47.8233610Z         "int"
2026-08-28T09:54:47.8233873Z       ],
2026-08-28T09:54:47.8234136Z       "stages": {
2026-08-28T09:54:47.8234398Z         "doc": {
2026-08-28T09:54:47.8234679Z           "complete": false,
2026-08-28T09:54:47.8235008Z           "evidence": []
2026-08-28T09:54:47.8235250Z         },
2026-08-28T09:54:47.8235537Z         "impl": {
2026-08-28T09:54:47.8235827Z           "complete": true,
2026-08-28T09:54:47.8236099Z           "evidence": [
2026-08-28T09:54:47.8236360Z             {
2026-08-28T09:54:47.8236745Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.8237021Z               "line": 191
2026-08-28T09:54:47.8237274Z             },
2026-08-28T09:54:47.8237531Z             {
2026-08-28T09:54:47.8237914Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.8238185Z               "line": 527
2026-08-28T09:54:47.8238447Z             },
2026-08-28T09:54:47.8238699Z             {
2026-08-28T09:54:47.8239164Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.8239435Z               "line": 542
2026-08-28T09:54:47.8239687Z             },
2026-08-28T09:54:47.8239936Z             {
2026-08-28T09:54:47.8240326Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:47.8240609Z               "line": 579
2026-08-28T09:54:47.8240861Z             },
2026-08-28T09:54:47.8241115Z             {
2026-08-28T09:54:47.8241468Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8241742Z               "line": 23
2026-08-28T09:54:47.8241994Z             },
2026-08-28T09:54:47.8242247Z             {
2026-08-28T09:54:47.8242600Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8242952Z               "line": 50
2026-08-28T09:54:47.8243215Z             },
2026-08-28T09:54:47.8243472Z             {
2026-08-28T09:54:47.8243825Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8244086Z               "line": 68
2026-08-28T09:54:47.8244342Z             },
2026-08-28T09:54:47.8244594Z             {
2026-08-28T09:54:47.8244986Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8245254Z               "line": 123
2026-08-28T09:54:47.8245525Z             },
2026-08-28T09:54:47.8245782Z             {
2026-08-28T09:54:47.8246134Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8246464Z               "line": 131
2026-08-28T09:54:47.8246716Z             }
2026-08-28T09:54:47.8246972Z           ]
2026-08-28T09:54:47.8247224Z         },
2026-08-28T09:54:47.8247486Z         "int": {
2026-08-28T09:54:47.8247767Z           "complete": true,
2026-08-28T09:54:47.8248043Z           "evidence": [
2026-08-28T09:54:47.8248311Z             {
2026-08-28T09:54:47.8248760Z               "path": "crates/spt-store/tests/wtlock_two_process_int.rs",
2026-08-28T09:54:47.8249122Z               "line": 102
2026-08-28T09:54:47.8249377Z             },
2026-08-28T09:54:47.8249632Z             {
2026-08-28T09:54:47.8250077Z               "path": "crates/spt-store/tests/wtlock_two_process_int.rs",
2026-08-28T09:54:47.8250353Z               "line": 170
2026-08-28T09:54:47.8250605Z             }
2026-08-28T09:54:47.8250859Z           ]
2026-08-28T09:54:47.8251116Z         },
2026-08-28T09:54:47.8251370Z         "unit": {
2026-08-28T09:54:47.8251656Z           "complete": true,
2026-08-28T09:54:47.8251932Z           "evidence": [
2026-08-28T09:54:47.8252183Z             {
2026-08-28T09:54:47.8252536Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:47.8252812Z               "line": 687
2026-08-28T09:54:47.8253075Z             },
2026-08-28T09:54:47.8253328Z             {
2026-08-28T09:54:47.8253738Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8254004Z               "line": 186
2026-08-28T09:54:47.8254263Z             },
2026-08-28T09:54:47.8254513Z             {
2026-08-28T09:54:47.8254874Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8255136Z               "line": 212
2026-08-28T09:54:47.8255398Z             },
2026-08-28T09:54:47.8255665Z             {
2026-08-28T09:54:47.8256013Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8256280Z               "line": 235
2026-08-28T09:54:47.8256590Z             },
2026-08-28T09:54:47.8256853Z             {
2026-08-28T09:54:47.8257210Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8257480Z               "line": 257
2026-08-28T09:54:47.8257731Z             },
2026-08-28T09:54:47.8257983Z             {
2026-08-28T09:54:47.8258337Z               "path": "crates/spt-store/src/wtlock.rs",
2026-08-28T09:54:47.8258632Z               "line": 271
2026-08-28T09:54:47.8258895Z             }
2026-08-28T09:54:47.8259233Z           ]
2026-08-28T09:54:47.8259514Z         }
2026-08-28T09:54:47.8259768Z       }
2026-08-28T09:54:47.8260019Z     },
2026-08-28T09:54:47.8260264Z     {
2026-08-28T09:54:47.8260647Z       "id": "REQ-PSYCHE-INVOCATION-BUDGET-PER-ROLE",
2026-08-28T09:54:47.8277869Z       "title": "EVERY BOUNDED ADAPTER INVOCATION TAKES ITS KILL BOUND FROM THE ROLE THAT DECLARES IT, WITH A SANE DEFAULT AND A HARD CEILING. FIELD ROOT (releases#27, two independent confirmations the night of 2026-07-29): the echo-commune summarizer ran against a flat 30s bound while the legitimate turn measured 23s and 35s wall on the same node with the same input -- the honest duration STRADDLES the bound, so kills were a load-of-the-moment lottery, and three agents were struck in one night. A LOTTERY IS NOT A FAULT SIGNAL. THE KNOB IS GENERAL, NOT ECHO-SPECIFIC: any role that is an LLM turn declares its own budget on the manifest role, because the adapter is the only party that knows what its own model costs. Numbers ruled: 90s when undeclared, and core CLAMPS a declared value to a 300s ceiling -- an adapter may not buy an unbounded spawn by declaring one. NO ROLE-NAME SPECIAL-CASING: the resolution keys on the declared FIELD, never on which role it is, matching the manifest contract's existing discipline for the recursion-guard field. THREE BOUNDS COLLAPSE INTO THIS ONE, verified by sweep rather than assumed: `LIVE_BOUNDED_TIMEOUT` governs BOTH the summarizer spawn and the history fetch, and `event_turn_timeout_for` separately governs the psyche_resume per-event turn on a pulse-derived value with a 30s floor. Ruled consequences, deliberate and not side effects: the history fetch moves 30s -> 90s undeclared, and the pulse-derived turn bound is REPLACED by the role budget (measured before replacing: default pulse 5s yields 30s today, under the new default, so nothing fielded is shortened). Gate: impl -- the budget field on the manifest session role, one resolution seam applied at EVERY bounded spawn site, the 300s clamp, and the pulse-derived turn bound retired in favour of it; unit -- undeclared resolves 90s, a declared value under the ceiling resolves verbatim, a declared value over it resolves 300s, and -- the no-special-casing row, since every other row passes an implementation that hardcodes the echo role -- a role the resolver was never taught by name resolves its declared budget identically.",
2026-08-28T09:54:47.8278316Z       "requiredStages": [
2026-08-28T09:54:47.8278577Z         "doc",
2026-08-28T09:54:47.8278833Z         "impl",
2026-08-28T09:54:47.8279171Z         "unit"
2026-08-28T09:54:47.8279428Z       ],
2026-08-28T09:54:47.8279690Z       "stages": {
2026-08-28T09:54:47.8279943Z         "doc": {
2026-08-28T09:54:47.8280225Z           "complete": true,
2026-08-28T09:54:47.8280498Z           "evidence": [
2026-08-28T09:54:47.8280750Z             {
2026-08-28T09:54:47.8281167Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:47.8281618Z               "line": 229
2026-08-28T09:54:47.8281881Z             }
2026-08-28T09:54:47.8282134Z           ]
2026-08-28T09:54:47.8282387Z         },
2026-08-28T09:54:47.8282648Z         "impl": {
2026-08-28T09:54:47.8282929Z           "complete": true,
2026-08-28T09:54:47.8283207Z           "evidence": [
2026-08-28T09:54:47.8283454Z             {
2026-08-28T09:54:47.8283826Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8284098Z               "line": 1137
2026-08-28T09:54:47.8284355Z             },
2026-08-28T09:54:47.8284684Z             {
2026-08-28T09:54:47.8285065Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8285333Z               "line": 1256
2026-08-28T09:54:47.8285595Z             },
2026-08-28T09:54:47.8285857Z             {
2026-08-28T09:54:47.8286251Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8286545Z               "line": 1392
2026-08-28T09:54:47.8286797Z             },
2026-08-28T09:54:47.8287054Z             {
2026-08-28T09:54:47.8287436Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.8287717Z               "line": 432
2026-08-28T09:54:47.8287976Z             }
2026-08-28T09:54:47.8288228Z           ]
2026-08-28T09:54:47.8288482Z         },
2026-08-28T09:54:47.8288739Z         "int": {
2026-08-28T09:54:47.8289109Z           "complete": false,
2026-08-28T09:54:47.8289383Z           "evidence": []
2026-08-28T09:54:47.8289640Z         },
2026-08-28T09:54:47.8289893Z         "unit": {
2026-08-28T09:54:47.8290175Z           "complete": true,
2026-08-28T09:54:47.8290447Z           "evidence": [
2026-08-28T09:54:47.8290715Z             {
2026-08-28T09:54:47.8291095Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8291363Z               "line": 2285
2026-08-28T09:54:47.8291623Z             },
2026-08-28T09:54:47.8291873Z             {
2026-08-28T09:54:47.8292245Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.8292517Z               "line": 2607
2026-08-28T09:54:47.8292841Z             },
2026-08-28T09:54:47.8293104Z             {
2026-08-28T09:54:47.8293476Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:47.8293752Z               "line": 2652
2026-08-28T09:54:47.8294009Z             }
2026-08-28T09:54:47.8294268Z           ]
2026-08-28T09:54:47.8294523Z         }
2026-08-28T09:54:47.8294785Z       }
2026-08-28T09:54:47.8295038Z     },
2026-08-28T09:54:47.8295292Z     {
2026-08-28T09:54:47.8295649Z       "id": "REQ-PSYCHE-LEGACY-RESIDENT-SWEEP",
2026-08-28T09:54:47.8312488Z       "title": "W5 (F030; doyle+perri 2026-07-04): a dirty daemon upgrade from <=v0.24.0 strands a RESIDENT psyche wrapper the OLD daemon spawned — and F-030 W4's nested-`ready` resolution fix CONVERTED that wrapper's accidental self-reap into a permanent HANG. The pre-W3 wrapper's only spt IPC is `spt ready <parent>-psyche --once` (BLOCKING, no internal timeout); pre-W4 that hit READY_FAIL on a multi-subnet home → the wrapper exit-4'd (accidental reap). Post-W4 the nested id resolves cleanly → the wrapper REGISTERS then BLOCKS FOREVER on its first post-upgrade poll: no exit, no psyche_host_error, no CPU (KH 2.6 invisible-loop class, one level up). Post-W3 core has no residency machinery to reap it. FIX: a ONE-SHOT legacy-resident sweep at BRAIN START (never per-reconcile/periodic — burying residency-era machinery, not resurrecting it). GUARD = adapter-AGNOSTIC (glue-model): resurrect the retired reap_orphan_psyches LOGIC — for each self-perch live-agent id derive `<id>-psyche` and kill iff (a) exe basename == the adapter's MANIFEST-declared psyche program (normalize_basename, never a hardcoded adapter name) AND (b) cmdline contains the id marker `<id>-psyche` AND (c) pid alive; any unreadable signal → DECLINE + loud log (fail-safe-decline, positive-match-only; infra never-kill inside the sweep). FRATRICIDE is closed by TIMING (perri-confirmed from the owning side): the ephemeral shim is daemon-spawned per-event, bounded, exits at turn end — at brain start BEFORE the first reconcile/pulse no current shim is resident, so any `<id>-psyche` psyche-program process alive then is unambiguously stranded-legacy. RESIDUE (doyle PIN 3): the hung wrapper REGISTERED a `<parent>-psyche` ready perch before blocking; killing the pid alone leaves a phantom ready-record with a dead pid (the REMOTE-TRUTH presence-lie class) — the sweep MUST also clear that stale registration or prove the existing stale-perch cleanup reaps it. No field window pre-W6 (nothing releases). (F-030 W5)",
2026-08-28T09:54:47.8313027Z       "requiredStages": [
2026-08-28T09:54:47.8313298Z         "impl",
2026-08-28T09:54:47.8313553Z         "unit",
2026-08-28T09:54:47.8313810Z         "int"
2026-08-28T09:54:47.8314063Z       ],
2026-08-28T09:54:47.8314328Z       "stages": {
2026-08-28T09:54:47.8314586Z         "doc": {
2026-08-28T09:54:47.8314863Z           "complete": false,
2026-08-28T09:54:47.8315148Z           "evidence": []
2026-08-28T09:54:47.8315412Z         },
2026-08-28T09:54:47.8315687Z         "impl": {
2026-08-28T09:54:47.8315968Z           "complete": true,
2026-08-28T09:54:47.8316234Z           "evidence": [
2026-08-28T09:54:47.8316497Z             {
2026-08-28T09:54:47.8320737Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8321054Z               "line": 1020
2026-08-28T09:54:47.8321315Z             },
2026-08-28T09:54:47.8321579Z             {
2026-08-28T09:54:47.8321993Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8322279Z               "line": 1038
2026-08-28T09:54:47.8322527Z             },
2026-08-28T09:54:47.8322795Z             {
2026-08-28T09:54:47.8323171Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8323450Z               "line": 1071
2026-08-28T09:54:47.8323702Z             },
2026-08-28T09:54:47.8323959Z             {
2026-08-28T09:54:47.8324332Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8324609Z               "line": 1089
2026-08-28T09:54:47.8324971Z             },
2026-08-28T09:54:47.8325223Z             {
2026-08-28T09:54:47.8325591Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8325863Z               "line": 1158
2026-08-28T09:54:47.8326123Z             },
2026-08-28T09:54:47.8326371Z             {
2026-08-28T09:54:47.8326747Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8327015Z               "line": 1239
2026-08-28T09:54:47.8327315Z             }
2026-08-28T09:54:47.8327573Z           ]
2026-08-28T09:54:47.8327826Z         },
2026-08-28T09:54:47.8328203Z         "int": {
2026-08-28T09:54:47.8328478Z           "complete": true,
2026-08-28T09:54:47.8328756Z           "evidence": [
2026-08-28T09:54:47.8329100Z             {
2026-08-28T09:54:47.8329595Z               "path": "crates/spt-daemon/tests/legacy_resident_sweep_e2e.rs",
2026-08-28T09:54:47.8329863Z               "line": 30
2026-08-28T09:54:47.8330130Z             }
2026-08-28T09:54:47.8330398Z           ]
2026-08-28T09:54:47.8330650Z         },
2026-08-28T09:54:47.8330917Z         "unit": {
2026-08-28T09:54:47.8331188Z           "complete": true,
2026-08-28T09:54:47.8331476Z           "evidence": [
2026-08-28T09:54:47.8331729Z             {
2026-08-28T09:54:47.8332106Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8332377Z               "line": 2346
2026-08-28T09:54:47.8332640Z             },
2026-08-28T09:54:47.8332897Z             {
2026-08-28T09:54:47.8333275Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:47.8333561Z               "line": 2409
2026-08-28T09:54:47.8333820Z             }
2026-08-28T09:54:47.8334081Z           ]
2026-08-28T09:54:47.8334330Z         }
2026-08-28T09:54:47.8334597Z       }
2026-08-28T09:54:47.8334844Z     },
2026-08-28T09:54:47.8335100Z     {
2026-08-28T09:54:47.8335440Z       "id": "REQ-PSYCHE-NESTED-RESOLUTION",
2026-08-28T09:54:47.8343557Z       "title": "W4 (F030, design §3; F-017 sibling, general not psyche-only): nested {parent}/{nested} ids resolve under the PARENT's home — subnet-less resolution for nested perches (the home-ASSIGNMENT seam, not perch-path which is already subnet-less) — so child-side verbs acting on nested perches need no --subnet the child cannot know. ROOT: home::assign_home returns Ambiguous on a multi-subnet node w/o --subnet; a nested id must instead derive home from its parent perch. Additionally expose a SINGLE {subnet} base_keys fill WHEN KNOWN (own_subnet = home-subnet label, 'local' when unhomed; absent → LOUD missing-key fail, the {node} precedent). NO {home} key (doyle W4 Q1: the endpoint home subnet is ONE concept per CONTEXT.md:640, and 'home:' is already the subnet-name qualifier position CONTEXT.md:652 — a {home} template key invites meaning-drift). Red-first = evidence #3's exact repro: 2-subnet home, nested-id verb, must succeed (was: `spt ready <id> --once` → exit 1 READY_FAIL … pass --subnet).",
2026-08-28T09:54:47.8344010Z       "requiredStages": [
2026-08-28T09:54:47.8344281Z         "doc",
2026-08-28T09:54:47.8344584Z         "impl",
2026-08-28T09:54:47.8344827Z         "unit",
2026-08-28T09:54:47.8345128Z         "int"
2026-08-28T09:54:47.8345380Z       ],
2026-08-28T09:54:47.8345637Z       "stages": {
2026-08-28T09:54:47.8345885Z         "doc": {
2026-08-28T09:54:47.8346205Z           "complete": true,
2026-08-28T09:54:47.8346477Z           "evidence": [
2026-08-28T09:54:47.8346740Z             {
2026-08-28T09:54:47.8347045Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.8347334Z               "line": 137
2026-08-28T09:54:47.8347586Z             }
2026-08-28T09:54:47.8347853Z           ]
2026-08-28T09:54:47.8348107Z         },
2026-08-28T09:54:47.8348360Z         "impl": {
2026-08-28T09:54:47.8348636Z           "complete": true,
2026-08-28T09:54:47.8348898Z           "evidence": [
2026-08-28T09:54:47.8349261Z             {
2026-08-28T09:54:47.8349638Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.8349955Z               "line": 91
2026-08-28T09:54:47.8350287Z             },
2026-08-28T09:54:47.8350588Z             {
2026-08-28T09:54:47.8350959Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.8351222Z               "line": 101
2026-08-28T09:54:47.8351480Z             },
2026-08-28T09:54:47.8351731Z             {
2026-08-28T09:54:47.8352080Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.8352346Z               "line": 122
2026-08-28T09:54:47.8352596Z             },
2026-08-28T09:54:47.8352859Z             {
2026-08-28T09:54:47.8353207Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:47.8353541Z               "line": 572
2026-08-28T09:54:47.8353794Z             }
2026-08-28T09:54:47.8354056Z           ]
2026-08-28T09:54:47.8354308Z         },
2026-08-28T09:54:47.8354570Z         "int": {
2026-08-28T09:54:47.8354856Z           "complete": true,
2026-08-28T09:54:47.8355121Z           "evidence": [
2026-08-28T09:54:47.8355373Z             {
2026-08-28T09:54:47.8355798Z               "path": "crates/spt/tests/nested_resolution_e2e.rs",
2026-08-28T09:54:47.8356074Z               "line": 22
2026-08-28T09:54:47.8356327Z             },
2026-08-28T09:54:47.8356594Z             {
2026-08-28T09:54:47.8356999Z               "path": "crates/spt/tests/nested_resolution_e2e.rs",
2026-08-28T09:54:47.8357267Z               "line": 65
2026-08-28T09:54:47.8357524Z             }
2026-08-28T09:54:47.8357770Z           ]
2026-08-28T09:54:47.8358033Z         },
2026-08-28T09:54:47.8358291Z         "unit": {
2026-08-28T09:54:47.8358581Z           "complete": true,
2026-08-28T09:54:47.8358853Z           "evidence": [
2026-08-28T09:54:47.8359187Z             {
2026-08-28T09:54:47.8359597Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8359865Z               "line": 2807
2026-08-28T09:54:47.8360125Z             },
2026-08-28T09:54:47.8360379Z             {
2026-08-28T09:54:47.8360723Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.8361066Z               "line": 536
2026-08-28T09:54:47.8361333Z             },
2026-08-28T09:54:47.8361601Z             {
2026-08-28T09:54:47.8361958Z               "path": "crates/spt-store/src/home.rs",
2026-08-28T09:54:47.8362249Z               "line": 571
2026-08-28T09:54:47.8362515Z             }
2026-08-28T09:54:47.8362775Z           ]
2026-08-28T09:54:47.8363030Z         }
2026-08-28T09:54:47.8363284Z       }
2026-08-28T09:54:47.8363542Z     },
2026-08-28T09:54:47.8363787Z     {
2026-08-28T09:54:47.8364125Z       "id": "REQ-PSYCHE-OUTCOME-CLASSIFIED",
2026-08-28T09:54:47.8377714Z       "title": "A PSYCHE OPERATION'S OUTCOME IS CLASSIFIED AT ITS SOURCE AND CARRIED AS A TYPE, NEVER RECOVERED BY READING ITS PROSE. The soft-timeout budget and the hard-failure budget can only differ if the two are told apart, and today they cannot be: `RuntimeError::Timeout { command, after }` exists at the source (spt-runtime runtime.rs) and `EchoError::Runtime` wraps it, but `fire_echo` ends `.map_err(|e| e.to_string())?` and `note_turn_outcome` takes `&Result<(), String>` -- so by the time the budget sees an outcome the fact is prose. RECOVERING IT BY MATCHING THE MESSAGE IS FORBIDDEN, and not as a matter of taste: this codebase already ruled that class out for the sibling discriminator, where the reserved exit code 95 is the SOLE session-not-found signal and the comment at its site states that the human-readable stderr line is never parsed. A harness whose summarizer prints the words `timed out` inside an ordinary non-zero failure must not thereby buy the softer budget. THE CLASSIFICATION IS THREE-VALUED (Ok / Timeout / Hard) and both legs -- the per-event turn and the commune-sync echo -- produce it, so the budget owner never re-derives what the spawn already knew. Gate: impl -- a classified outcome type produced at the runtime boundary from `RuntimeError::Timeout` and threaded unflattened through `fire_echo` and the turn leg into `note_turn_outcome`, which consumes the type and never the string; unit -- a HARD failure whose stderr text CONTAINS `timed out` still classifies Hard (the anti-parse row: a message-matching implementation passes every other row and fails this one), a real bound kill classifies Timeout, and a clean run classifies Ok.",
2026-08-28T09:54:47.8378096Z       "requiredStages": [
2026-08-28T09:54:47.8378349Z         "impl",
2026-08-28T09:54:47.8378610Z         "unit"
2026-08-28T09:54:47.8378867Z       ],
2026-08-28T09:54:47.8379200Z       "stages": {
2026-08-28T09:54:47.8379463Z         "doc": {
2026-08-28T09:54:47.8379778Z           "complete": false,
2026-08-28T09:54:47.8380068Z           "evidence": []
2026-08-28T09:54:47.8380421Z         },
2026-08-28T09:54:47.8380717Z         "impl": {
2026-08-28T09:54:47.8381013Z           "complete": true,
2026-08-28T09:54:47.8381283Z           "evidence": [
2026-08-28T09:54:47.8381533Z             {
2026-08-28T09:54:47.8381915Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8382196Z               "line": 506
2026-08-28T09:54:47.8382453Z             },
2026-08-28T09:54:47.8382711Z             {
2026-08-28T09:54:47.8383083Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8383355Z               "line": 520
2026-08-28T09:54:47.8383608Z             },
2026-08-28T09:54:47.8383861Z             {
2026-08-28T09:54:47.8384240Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8384511Z               "line": 531
2026-08-28T09:54:47.8384773Z             },
2026-08-28T09:54:47.8385025Z             {
2026-08-28T09:54:47.8385407Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8385688Z               "line": 1018
2026-08-28T09:54:47.8385941Z             },
2026-08-28T09:54:47.8386198Z             {
2026-08-28T09:54:47.8386531Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:47.8386807Z               "line": 66
2026-08-28T09:54:47.8387068Z             },
2026-08-28T09:54:47.8387411Z             {
2026-08-28T09:54:47.8387759Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:47.8388041Z               "line": 62
2026-08-28T09:54:47.8388303Z             },
2026-08-28T09:54:47.8388555Z             {
2026-08-28T09:54:47.8388933Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.8389324Z               "line": 233
2026-08-28T09:54:47.8389623Z             }
2026-08-28T09:54:47.8389880Z           ]
2026-08-28T09:54:47.8390137Z         },
2026-08-28T09:54:47.8390394Z         "int": {
2026-08-28T09:54:47.8390681Z           "complete": false,
2026-08-28T09:54:47.8391024Z           "evidence": []
2026-08-28T09:54:47.8391277Z         },
2026-08-28T09:54:47.8391536Z         "unit": {
2026-08-28T09:54:47.8391814Z           "complete": true,
2026-08-28T09:54:47.8392088Z           "evidence": [
2026-08-28T09:54:47.8392341Z             {
2026-08-28T09:54:47.8392717Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8392995Z               "line": 2528
2026-08-28T09:54:47.8393248Z             },
2026-08-28T09:54:47.8393514Z             {
2026-08-28T09:54:47.8393881Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8394158Z               "line": 2600
2026-08-28T09:54:47.8394412Z             }
2026-08-28T09:54:47.8394667Z           ]
2026-08-28T09:54:47.8394922Z         }
2026-08-28T09:54:47.8395209Z       }
2026-08-28T09:54:47.8395447Z     },
2026-08-28T09:54:47.8395710Z     {
2026-08-28T09:54:47.8396044Z       "id": "REQ-PSYCHE-ROLE-OPTIONAL-SKIP",
2026-08-28T09:54:47.8399688Z       "title": "W1 (LIFECYCLE-TRUTH): a manifest with NO [session.echo_commune] role SKIPS commune-sync (debug-level note, no strike) instead of hard-failing the turn. ROOT (perri filing, recovered): missing role -> commune-sync hard-fails -> 3-strike stamps the host ('manifest declares no [session.echo_commune] role') while the published contract presents the role as an optional template. FIX: missing OPTIONAL role = skip, not a turn failure.",
2026-08-28T09:54:47.8399982Z       "requiredStages": [
2026-08-28T09:54:47.8400311Z         "impl",
2026-08-28T09:54:47.8400569Z         "unit"
2026-08-28T09:54:47.8400827Z       ],
2026-08-28T09:54:47.8401084Z       "stages": {
2026-08-28T09:54:47.8401346Z         "doc": {
2026-08-28T09:54:47.8401622Z           "complete": false,
2026-08-28T09:54:47.8401898Z           "evidence": []
2026-08-28T09:54:47.8402147Z         },
2026-08-28T09:54:47.8402413Z         "impl": {
2026-08-28T09:54:47.8402687Z           "complete": true,
2026-08-28T09:54:47.8402963Z           "evidence": [
2026-08-28T09:54:47.8403226Z             {
2026-08-28T09:54:47.8403602Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8403941Z               "line": 484
2026-08-28T09:54:47.8404194Z             },
2026-08-28T09:54:47.8404456Z             {
2026-08-28T09:54:47.8404881Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8405290Z               "line": 1226
2026-08-28T09:54:47.8405731Z             }
2026-08-28T09:54:47.8406032Z           ]
2026-08-28T09:54:47.8406289Z         },
2026-08-28T09:54:47.8406542Z         "int": {
2026-08-28T09:54:47.8406832Z           "complete": false,
2026-08-28T09:54:47.8407104Z           "evidence": []
2026-08-28T09:54:47.8407361Z         },
2026-08-28T09:54:47.8407619Z         "unit": {
2026-08-28T09:54:47.8407903Z           "complete": true,
2026-08-28T09:54:47.8408169Z           "evidence": [
2026-08-28T09:54:47.8408430Z             {
2026-08-28T09:54:47.8408808Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8409175Z               "line": 3492
2026-08-28T09:54:47.8409462Z             }
2026-08-28T09:54:47.8409724Z           ]
2026-08-28T09:54:47.8409985Z         }
2026-08-28T09:54:47.8410233Z       }
2026-08-28T09:54:47.8410491Z     },
2026-08-28T09:54:47.8410733Z     {
2026-08-28T09:54:47.8411053Z       "id": "REQ-PSYCHE-SID-CUSTODY",
2026-08-28T09:54:47.8419330Z       "title": "W2 (F030, design §3): the psyche mints and keeps its OWN session id, stored in the nested {id}-psyche perch record — {session_id} in psyche role templates becomes the psyche's sid, never the parent's (today's fill at livehost.rs:518 is the PARENT's — the custody bug). Parent boundary (/clear, /compact) does NOT rotate the psyche sid (the psyche's conversational thread survives parent resets — its job). resume_psyche validates the custody key before spawn (resume.rs:183). Reseed path: psyche session lost/invalid → ResumeMode::FreshWithPreload (download_psyche_context composes role/live/project into {psyche_context}, resume.rs:100) + LOUD PSYCHE_RESEED:{id} marker (custody-loss loop visible; W1 budget bounds it). If the parent sid is still needed by a template it gets its OWN explicit key {parent_session_id} — never aliased. Red-first: parent `api boundary clear` → nested perch sid UNCHANGED (today it is the parent's — guard-revert reproduces).",
2026-08-28T09:54:47.8419826Z       "requiredStages": [
2026-08-28T09:54:47.8420093Z         "doc",
2026-08-28T09:54:47.8420356Z         "impl",
2026-08-28T09:54:47.8420623Z         "unit",
2026-08-28T09:54:47.8420895Z         "int"
2026-08-28T09:54:47.8421155Z       ],
2026-08-28T09:54:47.8421422Z       "stages": {
2026-08-28T09:54:47.8421684Z         "doc": {
2026-08-28T09:54:47.8421966Z           "complete": true,
2026-08-28T09:54:47.8422238Z           "evidence": [
2026-08-28T09:54:47.8422490Z             {
2026-08-28T09:54:47.8422906Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:47.8423178Z               "line": 188
2026-08-28T09:54:47.8423437Z             },
2026-08-28T09:54:47.8423693Z             {
2026-08-28T09:54:47.8424003Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.8424275Z               "line": 131
2026-08-28T09:54:47.8424524Z             },
2026-08-28T09:54:47.8424781Z             {
2026-08-28T09:54:47.8425081Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:47.8425347Z               "line": 140
2026-08-28T09:54:47.8425591Z             }
2026-08-28T09:54:47.8425834Z           ]
2026-08-28T09:54:47.8426163Z         },
2026-08-28T09:54:47.8426419Z         "impl": {
2026-08-28T09:54:47.8426703Z           "complete": true,
2026-08-28T09:54:47.8426970Z           "evidence": [
2026-08-28T09:54:47.8427227Z             {
2026-08-28T09:54:47.8427599Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8427866Z               "line": 315
2026-08-28T09:54:47.8428128Z             },
2026-08-28T09:54:47.8428377Z             {
2026-08-28T09:54:47.8428748Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8429117Z               "line": 330
2026-08-28T09:54:47.8429465Z             },
2026-08-28T09:54:47.8429723Z             {
2026-08-28T09:54:47.8430104Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8430376Z               "line": 1488
2026-08-28T09:54:47.8430634Z             },
2026-08-28T09:54:47.8430892Z             {
2026-08-28T09:54:47.8431263Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8431555Z               "line": 1534
2026-08-28T09:54:47.8431830Z             },
2026-08-28T09:54:47.8432082Z             {
2026-08-28T09:54:47.8432445Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8432726Z               "line": 1608
2026-08-28T09:54:47.8432983Z             },
2026-08-28T09:54:47.8433241Z             {
2026-08-28T09:54:47.8433613Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8433880Z               "line": 1631
2026-08-28T09:54:47.8434141Z             },
2026-08-28T09:54:47.8434392Z             {
2026-08-28T09:54:47.8434764Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8435036Z               "line": 1667
2026-08-28T09:54:47.8435297Z             },
2026-08-28T09:54:47.8435545Z             {
2026-08-28T09:54:47.8435941Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8436281Z               "line": 26
2026-08-28T09:54:47.8436532Z             },
2026-08-28T09:54:47.8436798Z             {
2026-08-28T09:54:47.8437182Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8437449Z               "line": 56
2026-08-28T09:54:47.8437703Z             },
2026-08-28T09:54:47.8437960Z             {
2026-08-28T09:54:47.8438345Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8438609Z               "line": 65
2026-08-28T09:54:47.8438871Z             },
2026-08-28T09:54:47.8439215Z             {
2026-08-28T09:54:47.8439673Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8439945Z               "line": 83
2026-08-28T09:54:47.8440212Z             },
2026-08-28T09:54:47.8440470Z             {
2026-08-28T09:54:47.8440860Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8441138Z               "line": 124
2026-08-28T09:54:47.8441385Z             }
2026-08-28T09:54:47.8441642Z           ]
2026-08-28T09:54:47.8441894Z         },
2026-08-28T09:54:47.8442157Z         "int": {
2026-08-28T09:54:47.8442448Z           "complete": true,
2026-08-28T09:54:47.8442724Z           "evidence": [
2026-08-28T09:54:47.8442971Z             {
2026-08-28T09:54:47.8443382Z               "path": "crates/spt/tests/psyche_sid_custody_e2e.rs",
2026-08-28T09:54:47.8443644Z               "line": 28
2026-08-28T09:54:47.8443910Z             },
2026-08-28T09:54:47.8444163Z             {
2026-08-28T09:54:47.8444572Z               "path": "crates/spt/tests/psyche_sid_custody_e2e.rs",
2026-08-28T09:54:47.8444837Z               "line": 234
2026-08-28T09:54:47.8445161Z             }
2026-08-28T09:54:47.8445419Z           ]
2026-08-28T09:54:47.8445672Z         },
2026-08-28T09:54:47.8445939Z         "unit": {
2026-08-28T09:54:47.8446226Z           "complete": true,
2026-08-28T09:54:47.8446501Z           "evidence": [
2026-08-28T09:54:47.8446754Z             {
2026-08-28T09:54:47.8447131Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8447468Z               "line": 2743
2026-08-28T09:54:47.8447723Z             },
2026-08-28T09:54:47.8447981Z             {
2026-08-28T09:54:47.8448352Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8448625Z               "line": 2912
2026-08-28T09:54:47.8448878Z             },
2026-08-28T09:54:47.8449220Z             {
2026-08-28T09:54:47.8449592Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8449869Z               "line": 2941
2026-08-28T09:54:47.8450140Z             },
2026-08-28T09:54:47.8450405Z             {
2026-08-28T09:54:47.8450848Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8451115Z               "line": 137
2026-08-28T09:54:47.8451378Z             },
2026-08-28T09:54:47.8451630Z             {
2026-08-28T09:54:47.8452027Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8452294Z               "line": 158
2026-08-28T09:54:47.8452555Z             },
2026-08-28T09:54:47.8452821Z             {
2026-08-28T09:54:47.8453207Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8453474Z               "line": 179
2026-08-28T09:54:47.8453732Z             },
2026-08-28T09:54:47.8453989Z             {
2026-08-28T09:54:47.8454380Z               "path": "crates/spt-store/src/psyche_custody.rs",
2026-08-28T09:54:47.8454647Z               "line": 200
2026-08-28T09:54:47.8454897Z             }
2026-08-28T09:54:47.8455166Z           ]
2026-08-28T09:54:47.8455440Z         }
2026-08-28T09:54:47.8455693Z       }
2026-08-28T09:54:47.8455951Z     },
2026-08-28T09:54:47.8456204Z     {
2026-08-28T09:54:47.8456547Z       "id": "REQ-PSYCHE-SOFT-TIMEOUT-BUDGET",
2026-08-28T09:54:47.8469421Z       "title": "A TIMEOUT KILL IS A LOAD SIGNAL, NOT A DEFECT, AND SPENDS A SEPARATE AND FAR MORE FORGIVING BUDGET. A slow-but-healthy host must never latch FAILED: three consecutive bound kills during a CI load window are exactly what the field produced, and under the shipped single 3-strike budget they stamped healthy psyches. THE COUNTER IS ONE, SHARED ACROSS KINDS, and latches only after TEN consecutive timeout kills. ANY SUCCESS OF ANY KIND CLEARS IT, including a success of a different kind than the one timing out -- a timeout is evidence about the machine's load at an instant, and any completed spawn is evidence that the window passed, so cross-kind clearing is the semantics rather than a convenience. THAT CROSS-KIND CLEAR IS WHAT DISSOLVES THE ORIGINAL LATCHED-STAMP FIELD CASE, whose latches were timeout-driven. A timeout NEVER touches a hard-failure counter, in either direction: it does not strike one and it does not reset one. Gate: impl -- the shared consecutive-timeout counter, its ten-deep latch, its clear on any success of any kind, and its isolation from the hard counters; unit -- nine consecutive timeouts leave the stamp clean and the tenth stamps (the boundary asserted from both sides, since a row at one depth alone passes an off-by-one), a success of a DIFFERENT kind clears the timeout counter (the ruled cross-kind semantics, which a per-kind implementation fails while passing every same-kind row), and a run of timeouts leaves an existing hard counter at its prior value rather than resetting it.",
2026-08-28T09:54:47.8469908Z       "requiredStages": [
2026-08-28T09:54:47.8470164Z         "impl",
2026-08-28T09:54:47.8470432Z         "unit",
2026-08-28T09:54:47.8470674Z         "int"
2026-08-28T09:54:47.8470933Z       ],
2026-08-28T09:54:47.8471189Z       "stages": {
2026-08-28T09:54:47.8471453Z         "doc": {
2026-08-28T09:54:47.8471734Z           "complete": false,
2026-08-28T09:54:47.8472011Z           "evidence": []
2026-08-28T09:54:47.8472264Z         },
2026-08-28T09:54:47.8472522Z         "impl": {
2026-08-28T09:54:47.8472804Z           "complete": true,
2026-08-28T09:54:47.8473070Z           "evidence": [
2026-08-28T09:54:47.8473327Z             {
2026-08-28T09:54:47.8473710Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8474056Z               "line": 1704
2026-08-28T09:54:47.8474313Z             },
2026-08-28T09:54:47.8474575Z             {
2026-08-28T09:54:47.8474952Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8475233Z               "line": 1722
2026-08-28T09:54:47.8475491Z             }
2026-08-28T09:54:47.8475758Z           ]
2026-08-28T09:54:47.8476012Z         },
2026-08-28T09:54:47.8476257Z         "int": {
2026-08-28T09:54:47.8476671Z           "complete": true,
2026-08-28T09:54:47.8476976Z           "evidence": [
2026-08-28T09:54:47.8477238Z             {
2026-08-28T09:54:47.8477930Z               "path": "crates/spt-daemon/tests/psyche_real_bound_kill_soft_budget_e2e.rs",
2026-08-28T09:54:47.8478197Z               "line": 87
2026-08-28T09:54:47.8478453Z             },
2026-08-28T09:54:47.8478706Z             {
2026-08-28T09:54:47.8479389Z               "path": "crates/spt-daemon/tests/psyche_real_bound_kill_soft_budget_e2e.rs",
2026-08-28T09:54:47.8479699Z               "line": 177
2026-08-28T09:54:47.8479957Z             }
2026-08-28T09:54:47.8480219Z           ]
2026-08-28T09:54:47.8480468Z         },
2026-08-28T09:54:47.8480729Z         "unit": {
2026-08-28T09:54:47.8481006Z           "complete": true,
2026-08-28T09:54:47.8481272Z           "evidence": [
2026-08-28T09:54:47.8481535Z             {
2026-08-28T09:54:47.8481914Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8482177Z               "line": 2363
2026-08-28T09:54:47.8482453Z             },
2026-08-28T09:54:47.8482724Z             {
2026-08-28T09:54:47.8483101Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8483383Z               "line": 2406
2026-08-28T09:54:47.8483645Z             }
2026-08-28T09:54:47.8483906Z           ]
2026-08-28T09:54:47.8484159Z         }
2026-08-28T09:54:47.8484417Z       }
2026-08-28T09:54:47.8484664Z     },
2026-08-28T09:54:47.8484921Z     {
2026-08-28T09:54:47.8485327Z       "id": "REQ-PSYCHE-SPAWN-ENV-PARITY",
2026-08-28T09:54:47.8495501Z       "title": "P-2 (WORKER-TRUTH triage addendum, perri-filed field finding 2026-07-06): the per-event psyche_resume spawn threads the perch record's CAPTURED read_env stamps into the spawn ENVIRONMENT — the F-027 Half-B env-parity contract (BINDING, design-frozen: read_env captured at creation + stamped on the record + threaded IDENTICALLY to every session spawn; the spawn never reads its own process env for a stamped var) extended to the psyche role the design predates. Field driver: flynn (claude-spt:ccs) — the ccs wrapper relocates the account root via CLAUDE_CONFIG_DIR at PARENT launch and the perch record correctly captured it, but the daemon spawns psyche_resume with bare env → default ~/.claude root → headless 'Not logged in' exit-1 → strike loop; psyche + parent land in DIFFERENT account roots (auth AND root-scoped continuity both break). Core stays harness-agnostic (threads whatever [env] direction=read captured — knows nothing of CLAUDE_CONFIG_DIR). Scope note: this is the URGENT psyche leg of F-027 Half B; the full pre_spawn seam + endpoint-session env threading stays design-parked (F-027-ENDPOINT-SPAWN-FAIL-DESIGN.md) unless operator pulls it forward.",
2026-08-28T09:54:47.8495901Z       "requiredStages": [
2026-08-28T09:54:47.8496159Z         "impl",
2026-08-28T09:54:47.8496411Z         "unit",
2026-08-28T09:54:47.8496673Z         "int"
2026-08-28T09:54:47.8496926Z       ],
2026-08-28T09:54:47.8497189Z       "stages": {
2026-08-28T09:54:47.8497444Z         "doc": {
2026-08-28T09:54:47.8497724Z           "complete": false,
2026-08-28T09:54:47.8498014Z           "evidence": []
2026-08-28T09:54:47.8498276Z         },
2026-08-28T09:54:47.8498539Z         "impl": {
2026-08-28T09:54:47.8498816Z           "complete": true,
2026-08-28T09:54:47.8499188Z           "evidence": [
2026-08-28T09:54:47.8499431Z             {
2026-08-28T09:54:47.8499797Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.8500080Z               "line": 741
2026-08-28T09:54:47.8500331Z             },
2026-08-28T09:54:47.8500706Z             {
2026-08-28T09:54:47.8501054Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.8501340Z               "line": 859
2026-08-28T09:54:47.8501603Z             }
2026-08-28T09:54:47.8501854Z           ]
2026-08-28T09:54:47.8502102Z         },
2026-08-28T09:54:47.8502364Z         "int": {
2026-08-28T09:54:47.8502646Z           "complete": true,
2026-08-28T09:54:47.8502907Z           "evidence": [
2026-08-28T09:54:47.8503167Z             {
2026-08-28T09:54:47.8503540Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8503911Z               "line": 2100
2026-08-28T09:54:47.8504165Z             }
2026-08-28T09:54:47.8504416Z           ]
2026-08-28T09:54:47.8504669Z         },
2026-08-28T09:54:47.8504931Z         "unit": {
2026-08-28T09:54:47.8505212Z           "complete": true,
2026-08-28T09:54:47.8505485Z           "evidence": [
2026-08-28T09:54:47.8505741Z             {
2026-08-28T09:54:47.8506109Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.8506386Z               "line": 1385
2026-08-28T09:54:47.8506637Z             },
2026-08-28T09:54:47.8506895Z             {
2026-08-28T09:54:47.8507261Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.8507543Z               "line": 1413
2026-08-28T09:54:47.8507805Z             }
2026-08-28T09:54:47.8508062Z           ]
2026-08-28T09:54:47.8508317Z         }
2026-08-28T09:54:47.8508570Z       }
2026-08-28T09:54:47.8508827Z     },
2026-08-28T09:54:47.8509160Z     {
2026-08-28T09:54:47.8509533Z       "id": "REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS",
2026-08-28T09:54:47.8524712Z       "title": "W1 (LIFECYCLE-TRUTH): EVERY successful psyche operation clears psyche_host_error — not just the pulse-loop leg. ROOT (three field confirmations, perri): the stamp clears only via note_turn_outcome's Ok leg (lifecycle.rs:1101); a SUCCESSFUL psyche op via checkpoint/wake bypasses it -> stale FAILED stamp sits over a healthy psyche. FIX: event turn, checkpoint/wake synthesis, and signoff echo all clear the stamp on success. ~~AMENDED BAROMETER W1 (2026-08-02, doyle-ruled) -- the UNCONDITIONAL clear this requirement asked for is STRUCK, because it makes a per-kind health stamp impossible: with one current-state field, any turn success erased a standing INGEST fault by construction, so a broken ingest was masked within seconds on a 5s pulse.~~ THE AMENDED FORM: a success clears its OWN kind's hard latch, and -- cross-kind -- the shared timeout latch, since any completed spawn is evidence the load window passed; the stamp is then RECOMPOSED from whatever latches still stand rather than written and cleared imperatively. The original defect stays fixed: a success on ANY leg (event turn, transition/checkpoint echo, signoff echo) still reaches the seam, so a stale stamp over a healthy psyche remains impossible -- what changed is that a success no longer clears a fault it knows nothing about. DECLARED LIMIT, deliberately in the requirement rather than left implicit: the latches live in the host's memory, so a DAEMON RESTART forgets them while the on-disk stamp persists, and after a bounce the first success of any kind clears a stamp whose kind is no longer known. That is the pre-existing behaviour surviving across a restart boundary instead of every few seconds; restart-durable per-kind clearing needs the stored stamp to carry its kind and is filed separately.",
2026-08-28T09:54:47.8525193Z       "requiredStages": [
2026-08-28T09:54:47.8525441Z         "impl",
2026-08-28T09:54:47.8525689Z         "unit"
2026-08-28T09:54:47.8525938Z       ],
2026-08-28T09:54:47.8526186Z       "stages": {
2026-08-28T09:54:47.8526452Z         "doc": {
2026-08-28T09:54:47.8526761Z           "complete": false,
2026-08-28T09:54:47.8527033Z           "evidence": []
2026-08-28T09:54:47.8527286Z         },
2026-08-28T09:54:47.8527544Z         "impl": {
2026-08-28T09:54:47.8527830Z           "complete": true,
2026-08-28T09:54:47.8528116Z           "evidence": [
2026-08-28T09:54:47.8528436Z             {
2026-08-28T09:54:47.8528818Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8529186Z               "line": 1288
2026-08-28T09:54:47.8529443Z             },
2026-08-28T09:54:47.8529700Z             {
2026-08-28T09:54:47.8530068Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8530349Z               "line": 1298
2026-08-28T09:54:47.8530624Z             },
2026-08-28T09:54:47.8530882Z             {
2026-08-28T09:54:47.8531254Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8531588Z               "line": 1310
2026-08-28T09:54:47.8531849Z             },
2026-08-28T09:54:47.8532100Z             {
2026-08-28T09:54:47.8532481Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8532749Z               "line": 1337
2026-08-28T09:54:47.8533011Z             }
2026-08-28T09:54:47.8533264Z           ]
2026-08-28T09:54:47.8533521Z         },
2026-08-28T09:54:47.8533783Z         "int": {
2026-08-28T09:54:47.8534063Z           "complete": false,
2026-08-28T09:54:47.8534346Z           "evidence": []
2026-08-28T09:54:47.8534597Z         },
2026-08-28T09:54:47.8534857Z         "unit": {
2026-08-28T09:54:47.8535143Z           "complete": true,
2026-08-28T09:54:47.8535419Z           "evidence": [
2026-08-28T09:54:47.8535668Z             {
2026-08-28T09:54:47.8536063Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:47.8536446Z               "line": 3254
2026-08-28T09:54:47.8536707Z             }
2026-08-28T09:54:47.8536960Z           ]
2026-08-28T09:54:47.8537231Z         }
2026-08-28T09:54:47.8537508Z       }
2026-08-28T09:54:47.8537765Z     },
2026-08-28T09:54:47.8538042Z     {
2026-08-28T09:54:47.8538395Z       "id": "REQ-PSYCHE-TURN-STREAM-EVIDENCE",
2026-08-28T09:54:47.8547439Z       "title": "A failed psyche turn preserves BOTH captured streams as evidence: TurnError::Failed carries the child's stdout alongside stderr, and the failure display appends a bounded single-line stdout TAIL (last ~500 bytes, UTF-8-boundary-safe cut, newlines collapsed, the literal <EMPTY> when the stream said nothing — absence stated, never implied by a missing field). WHY (2026-07-26 spend-limit RCA): a failed turn's stdout is not psyche output, so BOTH core (turn.rs kept {status_code, stderr} only) and the adapter (guarding its outbound channel) independently discarded it — the same blind spot implemented twice — and an account-level outage surfaced as a bare 'claude exited exit code: 1' with the decisive refusal text thrown away at two layers; three agents then chain-hypothesized on an error string the real failing path never emitted. The tail is cause-agnostic instrumentation: it does not care what the failure is, which is why it survives being wrong about it. Adapter twin: claude-spt v0.25.14 dual-stream tail (shipped 2026-07-26).",
2026-08-28T09:54:47.8547895Z       "requiredStages": [
2026-08-28T09:54:47.8548162Z         "impl",
2026-08-28T09:54:47.8548426Z         "unit"
2026-08-28T09:54:47.8548688Z       ],
2026-08-28T09:54:47.8549040Z       "stages": {
2026-08-28T09:54:47.8549294Z         "doc": {
2026-08-28T09:54:47.8549585Z           "complete": false,
2026-08-28T09:54:47.8549855Z           "evidence": []
2026-08-28T09:54:47.8550112Z         },
2026-08-28T09:54:47.8550376Z         "impl": {
2026-08-28T09:54:47.8550659Z           "complete": true,
2026-08-28T09:54:47.8550930Z           "evidence": [
2026-08-28T09:54:47.8551183Z             {
2026-08-28T09:54:47.8551532Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:47.8551803Z               "line": 108
2026-08-28T09:54:47.8552065Z             },
2026-08-28T09:54:47.8552317Z             {
2026-08-28T09:54:47.8552656Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:47.8552922Z               "line": 144
2026-08-28T09:54:47.8553179Z             }
2026-08-28T09:54:47.8553425Z           ]
2026-08-28T09:54:47.8553682Z         },
2026-08-28T09:54:47.8553944Z         "int": {
2026-08-28T09:54:47.8554288Z           "complete": false,
2026-08-28T09:54:47.8554560Z           "evidence": []
2026-08-28T09:54:47.8554808Z         },
2026-08-28T09:54:47.8555075Z         "unit": {
2026-08-28T09:54:47.8555348Z           "complete": true,
2026-08-28T09:54:47.8555622Z           "evidence": [
2026-08-28T09:54:47.8555867Z             {
2026-08-28T09:54:47.8556206Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:47.8556502Z               "line": 206
2026-08-28T09:54:47.8556750Z             },
2026-08-28T09:54:47.8557041Z             {
2026-08-28T09:54:47.8557370Z               "path": "crates/spt-live/src/turn.rs",
2026-08-28T09:54:47.8557722Z               "line": 232
2026-08-28T09:54:47.8557976Z             }
2026-08-28T09:54:47.8558248Z           ]
2026-08-28T09:54:47.8558498Z         }
2026-08-28T09:54:47.8558760Z       }
2026-08-28T09:54:47.8559089Z     },
2026-08-28T09:54:47.8559343Z     {
2026-08-28T09:54:47.8559691Z       "id": "REQ-PUBLIC-ERROR-SURFACES",
2026-08-28T09:54:47.8582142Z       "title": "F-1 (REMOTE-TRUTH triage §F-1, Q4 UX rule, operator-ruled): CLI stderr a non-developer can hit names the OBSERVABLE SITUATION + the NEXT ACTION — never journal/op/brain/store lingo. The sweep's named offenders: (1) `RC_FAIL:{id}: … brain IPC read deadline elapsed` — the brain transport error surfaced RAW through rc's residual Err arm (rc.rs run_attach_inner); operators read 'brain IPC' where the situation is 'the daemon didn't answer in time'. (2) `WOKE_FAIL:{id}: info.json absent or unreadable — not a hosted perch` (resting.rs apply_event miss) — store-file lingo in the one rest-verb line a stale remote row still surfaces cross-node (the qualified-arm D6 case; the A-3 bare-id local path already routes instead). The miss stays SINGLE-SOURCED from NOT_A_HOSTED_PERCH_MARKER (in-process discriminant, resting.rs — reword is compat-safe per its own doc; the drift-pin unit keeps builder+matcher fused). (3) translation_fault never human-rendered (F-030 post-release seed): a broker-stamped input-translation fault (e.g. 'inject worker panicked') was invisible in `endpoint list`/`whoami` while keystrokes silently degraded — rendered now as a SELF-pin annotation exactly like the psyche_host_error pattern (REQ-HAZARD-LIVEHOST-BOOT-RACE), human line + additive skip-if-none JSON field. (4) host_error never human-rendered (A-2 addendum item 2, the half e7c49e2 deferred to this sweep): the daemon's host-level failure REPORT (REQ-WAKE-RESUME-LEG — e.g. a wake-resume refused because the recorded session adapter is not registered) was written to info.json and surfaced ONLY on `spt endpoint wake`'s accepted-not-bound print, so an operator who ran `spt endpoint list` instead saw an endpoint that simply never came back with no stated reason. Rendered now as the THIRD field of the one render pass beside psyche_host_error + translation_fault (`host: FAILED — the daemon could not host or resume this endpoint (<reason>)`), the stored reason carrying its own next action rather than a second one bolted on, plus additive skip-if-none JSON on the two LOCAL DTOs (SelfPinJson + LocalPerchJson). LOCAL-ONLY by the ruled LocalPerchJson `activity` class (doyle 2026-07-30): host_error is a local perch fact read from info.json, so a gossiped remote row OMITS the key rather than guessing and wire carriage waits for a consumer that actually asks — EndpointRowJson (the WAN projection) is deliberately untouched. Kin to banked patterns: public --help no internal codes; 'Updated' not 'trial'. The A-4b retry terminal + B-3 give-up line + A-3 routing strings shipped F-1-clean already — this REQ sweeps the stragglers and is the home for future sightings (extend, don't multiply).",
2026-08-28T09:54:47.8582677Z       "requiredStages": [
2026-08-28T09:54:47.8582940Z         "impl",
2026-08-28T09:54:47.8583197Z         "unit"
2026-08-28T09:54:47.8583454Z       ],
2026-08-28T09:54:47.8583716Z       "stages": {
2026-08-28T09:54:47.8583973Z         "doc": {
2026-08-28T09:54:47.8584260Z           "complete": false,
2026-08-28T09:54:47.8584538Z           "evidence": []
2026-08-28T09:54:47.8584873Z         },
2026-08-28T09:54:47.8585134Z         "impl": {
2026-08-28T09:54:47.8585421Z           "complete": true,
2026-08-28T09:54:47.8585692Z           "evidence": [
2026-08-28T09:54:47.8585944Z             {
2026-08-28T09:54:47.8586302Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:47.8586583Z               "line": 298
2026-08-28T09:54:47.8586831Z             },
2026-08-28T09:54:47.8587085Z             {
2026-08-28T09:54:47.8587412Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8587682Z               "line": 6205
2026-08-28T09:54:47.8587982Z             },
2026-08-28T09:54:47.8588248Z             {
2026-08-28T09:54:47.8588563Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8588830Z               "line": 6212
2026-08-28T09:54:47.8589179Z             },
2026-08-28T09:54:47.8589432Z             {
2026-08-28T09:54:47.8589756Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8590032Z               "line": 6311
2026-08-28T09:54:47.8590294Z             },
2026-08-28T09:54:47.8590566Z             {
2026-08-28T09:54:47.8590877Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8591152Z               "line": 6513
2026-08-28T09:54:47.8591404Z             },
2026-08-28T09:54:47.8591662Z             {
2026-08-28T09:54:47.8591972Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8592248Z               "line": 6518
2026-08-28T09:54:47.8592505Z             },
2026-08-28T09:54:47.8592760Z             {
2026-08-28T09:54:47.8593075Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8593346Z               "line": 6596
2026-08-28T09:54:47.8593604Z             },
2026-08-28T09:54:47.8593857Z             {
2026-08-28T09:54:47.8594181Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8594449Z               "line": 12200
2026-08-28T09:54:47.8594707Z             },
2026-08-28T09:54:47.8595027Z             {
2026-08-28T09:54:47.8595339Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8595618Z               "line": 12211
2026-08-28T09:54:47.8595875Z             },
2026-08-28T09:54:47.8596124Z             {
2026-08-28T09:54:47.8596444Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8596715Z               "line": 12302
2026-08-28T09:54:47.8596968Z             },
2026-08-28T09:54:47.8597230Z             {
2026-08-28T09:54:47.8597535Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8597877Z               "line": 2216
2026-08-28T09:54:47.8598132Z             }
2026-08-28T09:54:47.8598385Z           ]
2026-08-28T09:54:47.8598638Z         },
2026-08-28T09:54:47.8598891Z         "int": {
2026-08-28T09:54:47.8599272Z           "complete": false,
2026-08-28T09:54:47.8599545Z           "evidence": []
2026-08-28T09:54:47.8599802Z         },
2026-08-28T09:54:47.8600063Z         "unit": {
2026-08-28T09:54:47.8600340Z           "complete": true,
2026-08-28T09:54:47.8600639Z           "evidence": [
2026-08-28T09:54:47.8600893Z             {
2026-08-28T09:54:47.8601207Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8601502Z               "line": 28686
2026-08-28T09:54:47.8601756Z             },
2026-08-28T09:54:47.8602007Z             {
2026-08-28T09:54:47.8602332Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8602608Z               "line": 28748
2026-08-28T09:54:47.8602861Z             },
2026-08-28T09:54:47.8603121Z             {
2026-08-28T09:54:47.8603426Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8603712Z               "line": 28828
2026-08-28T09:54:47.8603969Z             },
2026-08-28T09:54:47.8604226Z             {
2026-08-28T09:54:47.8604531Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8604798Z               "line": 4972
2026-08-28T09:54:47.8605066Z             }
2026-08-28T09:54:47.8605319Z           ]
2026-08-28T09:54:47.8605572Z         }
2026-08-28T09:54:47.8605817Z       }
2026-08-28T09:54:47.8606144Z     },
2026-08-28T09:54:47.8606393Z     {
2026-08-28T09:54:47.8606717Z       "id": "REQ-PUMP-DIAL-FASTFAIL",
2026-08-28T09:54:47.8627622Z       "title": "PUMP-TRUTH W1 (RE-SCOPED post round-2 empirical lock — the DIAL is EXONERATED, healthy ~100ms): a pump worker-leg PEER-REPLY read to a connect-then-silent / half-alive peer must drop THAT peer as an ORDINARY per-peer failure (peer_outcome's non-TimedOut arm -> PUMP_PEER_FAIL -> drop conn + redial, round CONTINUES, heartbeat advances), NEVER burn the brain's 30s PUMP_PEER_IO_TIMEOUT carrier deadline into a whole-round TimedOut POISON -> supervise_pump doubling-backoff restart. ROOT (deployah leg-instrumented capture, enlyzeam, 3 identical rounds): DIAL_EXIT 96ms ok, LEG i=3 update ms=30025 err[TimedOut] = the wedge. request_update (propagate.rs:373-375) opens the update stream + sends UpdRecord::Query (all bounded, all land), then BLOCKS read_event_until(deadline=call_deadline()=30s) on the peer's Offer/UpToDate reply; a peer that accepts the stream but never answers burns the full 30s -> TimedOut -> peer_outcome (pump/mod.rs:601) POISON -> whole-round abort + restart (= the field PEER_PUMP_FAIL: brain IPC read deadline, always-zero PUMP_PEER_FAIL). request_sync (sync.rs:374-376) is the LATENT TWIN (SKIPS the reply-read only when the want-set is empty; bites the moment it is non-empty against a silent peer). FIX (both legs): (a) reclassify the reply-read no-progress timeout OUT of TimedOut to a non-poison kind (Brain::read_peer_reply_until) so peer_outcome drops ONLY that peer -- poison RESERVED strictly for a genuine broker-IPC-CARRIER desync (the carrier ops net_open_stream/subscribe/send keep raw TimedOut); the abandoned peer stream is safe (exactly-once seq cursor stays contiguous, a late reply matches no live stream id). (b) budget-decouple the reply-read below 30s (Brain::reply_read_deadline = now + min(io_timeout, 10s)) so a silent peer drops promptly even in the still-sequential pre-W2 pump and can never race the carrier deadline. Files: propagate.rs (request_update) + sync.rs (request_sync) + brain.rs (reply_read_deadline + read_peer_reply_until) + pump/mod.rs (peer_outcome poison reserved for carrier-desync). Gate: a connect-then-silent peer at fan#0 -> the update leg drops it ordinarily within the reply-read budget, round continues + heartbeat advances, NO PEER_PUMP_RESTART; happy path (live peer) unchanged; + the sync-non-empty-want-set latent case. Kin REQ-PUMP-PEER-ISOLATION (W2 concurrency, VALIDATED by this root) + REQ-HAZARD-PUMP-IPC-DEADLINE (the poison it must stop mis-firing on a peer).",
2026-08-28T09:54:47.8628142Z       "requiredStages": [
2026-08-28T09:54:47.8628404Z         "impl",
2026-08-28T09:54:47.8628668Z         "unit",
2026-08-28T09:54:47.8628916Z         "int"
2026-08-28T09:54:47.8629254Z       ],
2026-08-28T09:54:47.8629533Z       "stages": {
2026-08-28T09:54:47.8634532Z         "doc": {
2026-08-28T09:54:47.8634863Z           "complete": false,
2026-08-28T09:54:47.8635168Z           "evidence": []
2026-08-28T09:54:47.8635416Z         },
2026-08-28T09:54:47.8635679Z         "impl": {
2026-08-28T09:54:47.8635960Z           "complete": true,
2026-08-28T09:54:47.8636245Z           "evidence": [
2026-08-28T09:54:47.8636493Z             {
2026-08-28T09:54:47.8636860Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8637132Z               "line": 1020
2026-08-28T09:54:47.8637394Z             },
2026-08-28T09:54:47.8637651Z             {
2026-08-28T09:54:47.8638012Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8638288Z               "line": 1365
2026-08-28T09:54:47.8638546Z             },
2026-08-28T09:54:47.8638812Z             {
2026-08-28T09:54:47.8639275Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8639552Z               "line": 2512
2026-08-28T09:54:47.8639814Z             },
2026-08-28T09:54:47.8640064Z             {
2026-08-28T09:54:47.8640425Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8640701Z               "line": 2523
2026-08-28T09:54:47.8641054Z             },
2026-08-28T09:54:47.8641312Z             {
2026-08-28T09:54:47.8641703Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:47.8641975Z               "line": 406
2026-08-28T09:54:47.8642232Z             },
2026-08-28T09:54:47.8642490Z             {
2026-08-28T09:54:47.8642837Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:47.8643110Z               "line": 407
2026-08-28T09:54:47.8643371Z             }
2026-08-28T09:54:47.8643633Z           ]
2026-08-28T09:54:47.8643881Z         },
2026-08-28T09:54:47.8644201Z         "int": {
2026-08-28T09:54:47.8644478Z           "complete": true,
2026-08-28T09:54:47.8644754Z           "evidence": [
2026-08-28T09:54:47.8645012Z             {
2026-08-28T09:54:47.8645503Z               "path": "crates/spt-daemon/tests/pumpdeadline.rs",
2026-08-28T09:54:47.8645785Z               "line": 125
2026-08-28T09:54:47.8646048Z             }
2026-08-28T09:54:47.8646306Z           ]
2026-08-28T09:54:47.8646558Z         },
2026-08-28T09:54:47.8646839Z         "unit": {
2026-08-28T09:54:47.8647255Z           "complete": true,
2026-08-28T09:54:47.8647658Z           "evidence": [
2026-08-28T09:54:47.8647927Z             {
2026-08-28T09:54:47.8648281Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8648553Z               "line": 2551
2026-08-28T09:54:47.8648806Z             },
2026-08-28T09:54:47.8649159Z             {
2026-08-28T09:54:47.8649502Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8649788Z               "line": 2569
2026-08-28T09:54:47.8650046Z             }
2026-08-28T09:54:47.8650297Z           ]
2026-08-28T09:54:47.8650559Z         }
2026-08-28T09:54:47.8650819Z       }
2026-08-28T09:54:47.8651076Z     },
2026-08-28T09:54:47.8651324Z     {
2026-08-28T09:54:47.8651648Z       "id": "REQ-PUMP-PEER-ISOLATION",
2026-08-28T09:54:47.8662267Z       "title": "PUMP-TRUTH W2 (architectural, operator ruling 2026-07-08): one peer must NOT block or poison all others -- peer discovery is async / per-peer-independent. Two coupled defects in run_peer_pump: (1) SEQUENTIAL fan-out (for peer in fan_targets dials one-at-a-time, each up to the bound -> peer N+1 waits behind peer N); (2) WHOLE-ROUND POISON (peer_outcome(...)? -- one TimedOut aborts the ENTIRE round via ? -> supervise_pump doubling-backoff restart, resetting ALL conns). FIX: per-peer concurrency + fault isolation -- the pump issues non-blocking dial requests; the broker (already async tokio+iroh) returns connection/presence results as async events (the D4c presence seam), no serial per-peer block; a peer TimedOut drops + reschedules ONLY that peer, NEVER aborts the round or restarts the pump. Supervised-restart is RESERVED for a dead BROKER conn, not a dead peer (the single-thread+bounded-read A-half REQ-HAZARD-PUMP-IPC-DEADLINE was defensive -- it stopped the infinite wedge but coupled every peer's fate; this decouples). Gate: a mixed roster (1 live + N offline peers) -- the live peer connects AND this node advertises presence in the SAME round the offline peers fail; heartbeat advances every round; no PEER_PUMP_RESTART from a dead peer. Depends on W1 (a fast-failing dial is the precondition for clean per-peer scheduling).",
2026-08-28T09:54:47.8662756Z       "requiredStages": [
2026-08-28T09:54:47.8663020Z         "impl",
2026-08-28T09:54:47.8663281Z         "unit",
2026-08-28T09:54:47.8663535Z         "int"
2026-08-28T09:54:47.8663798Z       ],
2026-08-28T09:54:47.8664057Z       "stages": {
2026-08-28T09:54:47.8664324Z         "doc": {
2026-08-28T09:54:47.8664611Z           "complete": false,
2026-08-28T09:54:47.8664887Z           "evidence": []
2026-08-28T09:54:47.8665146Z         },
2026-08-28T09:54:47.8665407Z         "impl": {
2026-08-28T09:54:47.8665693Z           "complete": true,
2026-08-28T09:54:47.8665984Z           "evidence": [
2026-08-28T09:54:47.8666241Z             {
2026-08-28T09:54:47.8666591Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8666996Z               "line": 1252
2026-08-28T09:54:47.8667253Z             },
2026-08-28T09:54:47.8667501Z             {
2026-08-28T09:54:47.8667850Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8668117Z               "line": 1924
2026-08-28T09:54:47.8668375Z             },
2026-08-28T09:54:47.8668623Z             {
2026-08-28T09:54:47.8669042Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8669317Z               "line": 2301
2026-08-28T09:54:47.8669582Z             },
2026-08-28T09:54:47.8669839Z             {
2026-08-28T09:54:47.8670264Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.8670531Z               "line": 5837
2026-08-28T09:54:47.8670783Z             },
2026-08-28T09:54:47.8671036Z             {
2026-08-28T09:54:47.8671385Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.8671655Z               "line": 8904
2026-08-28T09:54:47.8671907Z             },
2026-08-28T09:54:47.8672163Z             {
2026-08-28T09:54:47.8672498Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.8672774Z               "line": 247
2026-08-28T09:54:47.8673025Z             },
2026-08-28T09:54:47.8673274Z             {
2026-08-28T09:54:47.8673612Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.8673883Z               "line": 252
2026-08-28T09:54:47.8674143Z             },
2026-08-28T09:54:47.8674391Z             {
2026-08-28T09:54:47.8674742Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.8675018Z               "line": 266
2026-08-28T09:54:47.8675280Z             },
2026-08-28T09:54:47.8675537Z             {
2026-08-28T09:54:47.8675876Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.8676148Z               "line": 1683
2026-08-28T09:54:47.8676401Z             },
2026-08-28T09:54:47.8676660Z             {
2026-08-28T09:54:47.8677019Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8677352Z               "line": 81
2026-08-28T09:54:47.8677609Z             },
2026-08-28T09:54:47.8677861Z             {
2026-08-28T09:54:47.8678225Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8678495Z               "line": 697
2026-08-28T09:54:47.8678748Z             },
2026-08-28T09:54:47.8679092Z             {
2026-08-28T09:54:47.8679465Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8679734Z               "line": 1233
2026-08-28T09:54:47.8679994Z             },
2026-08-28T09:54:47.8680328Z             {
2026-08-28T09:54:47.8680723Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8681019Z               "line": 1592
2026-08-28T09:54:47.8681268Z             },
2026-08-28T09:54:47.8681534Z             {
2026-08-28T09:54:47.8681892Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8682164Z               "line": 163
2026-08-28T09:54:47.8682420Z             },
2026-08-28T09:54:47.8682680Z             {
2026-08-28T09:54:47.8683048Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8683319Z               "line": 178
2026-08-28T09:54:47.8683576Z             },
2026-08-28T09:54:47.8683830Z             {
2026-08-28T09:54:47.8684196Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8684468Z               "line": 206
2026-08-28T09:54:47.8684726Z             },
2026-08-28T09:54:47.8684975Z             {
2026-08-28T09:54:47.8685345Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8685622Z               "line": 907
2026-08-28T09:54:47.8685879Z             },
2026-08-28T09:54:47.8686136Z             {
2026-08-28T09:54:47.8686498Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8686765Z               "line": 934
2026-08-28T09:54:47.8687018Z             },
2026-08-28T09:54:47.8687281Z             {
2026-08-28T09:54:47.8687649Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8688007Z               "line": 974
2026-08-28T09:54:47.8688265Z             },
2026-08-28T09:54:47.8688518Z             {
2026-08-28T09:54:47.8688884Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8689237Z               "line": 1022
2026-08-28T09:54:47.8689490Z             }
2026-08-28T09:54:47.8689739Z           ]
2026-08-28T09:54:47.8689990Z         },
2026-08-28T09:54:47.8690252Z         "int": {
2026-08-28T09:54:47.8690521Z           "complete": true,
2026-08-28T09:54:47.8690798Z           "evidence": [
2026-08-28T09:54:47.8691051Z             {
2026-08-28T09:54:47.8691485Z               "path": "crates/spt-daemon/tests/pump.rs",
2026-08-28T09:54:47.8691747Z               "line": 673
2026-08-28T09:54:47.8692010Z             },
2026-08-28T09:54:47.8692257Z             {
2026-08-28T09:54:47.8692620Z               "path": "crates/spt-daemon/tests/pump.rs",
2026-08-28T09:54:47.8692889Z               "line": 874
2026-08-28T09:54:47.8693145Z             },
2026-08-28T09:54:47.8693398Z             {
2026-08-28T09:54:47.8693727Z               "path": "docs/PUMP-W2-DESIGN.md",
2026-08-28T09:54:47.8694004Z               "line": 54
2026-08-28T09:54:47.8694256Z             }
2026-08-28T09:54:47.8694513Z           ]
2026-08-28T09:54:47.8694761Z         },
2026-08-28T09:54:47.8695018Z         "unit": {
2026-08-28T09:54:47.8695295Z           "complete": true,
2026-08-28T09:54:47.8695568Z           "evidence": [
2026-08-28T09:54:47.8695829Z             {
2026-08-28T09:54:47.8696167Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.8696439Z               "line": 2057
2026-08-28T09:54:47.8696696Z             },
2026-08-28T09:54:47.8696959Z             {
2026-08-28T09:54:47.8697320Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8697592Z               "line": 2032
2026-08-28T09:54:47.8697855Z             },
2026-08-28T09:54:47.8698102Z             {
2026-08-28T09:54:47.8698538Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8698805Z               "line": 2077
2026-08-28T09:54:47.8699144Z             },
2026-08-28T09:54:47.8699398Z             {
2026-08-28T09:54:47.8699764Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8700037Z               "line": 2111
2026-08-28T09:54:47.8700285Z             },
2026-08-28T09:54:47.8700536Z             {
2026-08-28T09:54:47.8700897Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8701172Z               "line": 2182
2026-08-28T09:54:47.8701481Z             },
2026-08-28T09:54:47.8701739Z             {
2026-08-28T09:54:47.8702073Z               "path": "docs/PUMP-W2-DESIGN.md",
2026-08-28T09:54:47.8702345Z               "line": 55
2026-08-28T09:54:47.8702603Z             }
2026-08-28T09:54:47.8702851Z           ]
2026-08-28T09:54:47.8703103Z         }
2026-08-28T09:54:47.8703355Z       }
2026-08-28T09:54:47.8703615Z     },
2026-08-28T09:54:47.8703867Z     {
2026-08-28T09:54:47.8704173Z       "id": "REQ-PUMP-STAGE-TRUTH",
2026-08-28T09:54:47.8715552Z       "title": "MESH-RECOVERY W1 (ADR-0039, RCA wave 3 — the acceptance surface, same contract): peer-failure telemetry is STAGE-SPLIT and health is USER-MEANINGFUL. The single 10s PUMP_PEER_FAIL token splits into attributed stages — address-resolution, QUIC connect, ALPN, seed-proof send, seed-proof receive/verify, roster exchange — each failure stamped (wall+mono) and peer-attributed (subsumes the 2026-07-14 PUMP_PEER_FAIL-unstamped seed). daemon status / subnet status report: live peer count, last successful peer dial, last admitted registry update, duration of any all-peer failure; the incident fingerprint (all dials failing + heartbeat fresh + net_up true) MUST render degraded — no green without real peer progress. New fields ADDITIVE (N-1 readers unaffected). Gate: impl — stage split + status surfaces; unit — stage classification + health state machine (degraded on all-peer failure, healthy only on real progress, not on heartbeat/time); int — health flips degraded/healthy across a real peer outage/restore; doc — reference regen (CLI surface change → xtask gen, no internal codes in clap help). Kin REQ-PEER-ROUTE-CHAIN, REQ-DAEMON-5 (heartbeat — answers liveness, not reachability), REQ-CLI-2/REQ-SUBNET-8 (render legs).",
2026-08-28T09:54:47.8716058Z       "requiredStages": [
2026-08-28T09:54:47.8716829Z         "doc",
2026-08-28T09:54:47.8717407Z         "impl",
2026-08-28T09:54:47.8717979Z         "unit",
2026-08-28T09:54:47.8718548Z         "int"
2026-08-28T09:54:47.8719217Z       ],
2026-08-28T09:54:47.8719768Z       "stages": {
2026-08-28T09:54:47.8720431Z         "doc": {
2026-08-28T09:54:47.8721027Z           "complete": true,
2026-08-28T09:54:47.8721686Z           "evidence": [
2026-08-28T09:54:47.8722316Z             {
2026-08-28T09:54:47.8723056Z               "path": "docs/adr/0039-peer-route-resolution-truth.md",
2026-08-28T09:54:47.8723986Z               "line": 47
2026-08-28T09:54:47.8724618Z             }
2026-08-28T09:54:47.8725173Z           ]
2026-08-28T09:54:47.8725727Z         },
2026-08-28T09:54:47.8726281Z         "impl": {
2026-08-28T09:54:47.8726882Z           "complete": true,
2026-08-28T09:54:47.8727596Z           "evidence": [
2026-08-28T09:54:47.8728215Z             {
2026-08-28T09:54:47.8728906Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:47.8729834Z               "line": 117
2026-08-28T09:54:47.8730468Z             },
2026-08-28T09:54:47.8731035Z             {
2026-08-28T09:54:47.8731707Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8732559Z               "line": 974
2026-08-28T09:54:47.8733185Z             },
2026-08-28T09:54:47.8733749Z             {
2026-08-28T09:54:47.8734407Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8735245Z               "line": 1615
2026-08-28T09:54:47.8735896Z             },
2026-08-28T09:54:47.8736478Z             {
2026-08-28T09:54:47.8737230Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.8738093Z               "line": 21
2026-08-28T09:54:47.8738704Z             },
2026-08-28T09:54:47.8739362Z             {
2026-08-28T09:54:47.8740025Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:47.8740873Z               "line": 1060
2026-08-28T09:54:47.8741494Z             },
2026-08-28T09:54:47.8742062Z             {
2026-08-28T09:54:47.8742753Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.8743608Z               "line": 440
2026-08-28T09:54:47.8744309Z             },
2026-08-28T09:54:47.8744867Z             {
2026-08-28T09:54:47.8745643Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.8746499Z               "line": 448
2026-08-28T09:54:47.8747110Z             },
2026-08-28T09:54:47.8747659Z             {
2026-08-28T09:54:47.8748355Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.8749303Z               "line": 237
2026-08-28T09:54:47.8749937Z             },
2026-08-28T09:54:47.8750493Z             {
2026-08-28T09:54:47.8751100Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8751878Z               "line": 8309
2026-08-28T09:54:47.8752489Z             },
2026-08-28T09:54:47.8753046Z             {
2026-08-28T09:54:47.8753650Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8754431Z               "line": 8432
2026-08-28T09:54:47.8755065Z             },
2026-08-28T09:54:47.8755623Z             {
2026-08-28T09:54:47.8756250Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8757027Z               "line": 8745
2026-08-28T09:54:47.8757651Z             },
2026-08-28T09:54:47.8758204Z             {
2026-08-28T09:54:47.8758819Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8759643Z               "line": 14193
2026-08-28T09:54:47.8760271Z             },
2026-08-28T09:54:47.8760845Z             {
2026-08-28T09:54:47.8761468Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8762357Z               "line": 14348
2026-08-28T09:54:47.8762991Z             }
2026-08-28T09:54:47.8763539Z           ]
2026-08-28T09:54:47.8764083Z         },
2026-08-28T09:54:47.8764623Z         "int": {
2026-08-28T09:54:47.8765204Z           "complete": true,
2026-08-28T09:54:47.8765858Z           "evidence": [
2026-08-28T09:54:47.8766464Z             {
2026-08-28T09:54:47.8767161Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:47.8768048Z               "line": 375
2026-08-28T09:54:47.8768678Z             }
2026-08-28T09:54:47.8769307Z           ]
2026-08-28T09:54:47.8769917Z         },
2026-08-28T09:54:47.8770465Z         "unit": {
2026-08-28T09:54:47.8771067Z           "complete": true,
2026-08-28T09:54:47.8771729Z           "evidence": [
2026-08-28T09:54:47.8772350Z             {
2026-08-28T09:54:47.8773051Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.8773924Z               "line": 542
2026-08-28T09:54:47.8774544Z             },
2026-08-28T09:54:47.8775107Z             {
2026-08-28T09:54:47.8775799Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.8776671Z               "line": 556
2026-08-28T09:54:47.8777290Z             },
2026-08-28T09:54:47.8777851Z             {
2026-08-28T09:54:47.8778542Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.8779490Z               "line": 1026
2026-08-28T09:54:47.8780162Z             },
2026-08-28T09:54:47.8780720Z             {
2026-08-28T09:54:47.8781416Z               "path": "crates/spt-daemon/src/pump/health.rs",
2026-08-28T09:54:47.8782280Z               "line": 1064
2026-08-28T09:54:47.8782900Z             },
2026-08-28T09:54:47.8783462Z             {
2026-08-28T09:54:47.8784073Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:47.8784828Z               "line": 34870
2026-08-28T09:54:47.8785450Z             }
2026-08-28T09:54:47.8786044Z           ]
2026-08-28T09:54:47.8786811Z         }
2026-08-28T09:54:47.8787347Z       }
2026-08-28T09:54:47.8787884Z     },
2026-08-28T09:54:47.8788412Z     {
2026-08-28T09:54:47.8789040Z       "id": "REQ-RC-1",
2026-08-28T09:54:47.8795326Z       "title": "`spt rc <id>` — user CLI attaching a local terminal to a broker-held PTY, reusing the cross-node attach machinery (attach.rs request_attach → send_attach_input pump, spt-net AttachRecord codec); local attach is the degenerate single-node case of the cross-node path (rides REQ-TERM-3 byte-stream streaming). Read-only `--view` (watch, no stdin forwarded). Clean detach that does NOT terminate the broker-held session (KNOWN-HAZARDS: PTY ownership stays with the broker; no termination on detach). Explicit detach keybind that cannot collide with harness passthrough input (legacy capsule used a ctrl-b prefix); documented. ConPTY DSR auto-answer in the attach reader (hazard 5.5).",
2026-08-28T09:54:47.8801677Z       "requiredStages": [
2026-08-28T09:54:47.8802321Z         "impl",
2026-08-28T09:54:47.8802908Z         "unit",
2026-08-28T09:54:47.8803485Z         "int"
2026-08-28T09:54:47.8804030Z       ],
2026-08-28T09:54:47.8804578Z       "stages": {
2026-08-28T09:54:47.8805150Z         "doc": {
2026-08-28T09:54:47.8805751Z           "complete": false,
2026-08-28T09:54:47.8806437Z           "evidence": []
2026-08-28T09:54:47.8807059Z         },
2026-08-28T09:54:47.8807608Z         "impl": {
2026-08-28T09:54:47.8808219Z           "complete": true,
2026-08-28T09:54:47.8808900Z           "evidence": [
2026-08-28T09:54:47.8809593Z             {
2026-08-28T09:54:47.8810251Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8811082Z               "line": 1953
2026-08-28T09:54:47.8811706Z             },
2026-08-28T09:54:47.8812276Z             {
2026-08-28T09:54:47.8812954Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.8813787Z               "line": 8935
2026-08-28T09:54:47.8814404Z             },
2026-08-28T09:54:47.8814953Z             {
2026-08-28T09:54:47.8815621Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8816527Z               "line": 1742
2026-08-28T09:54:47.8817164Z             },
2026-08-28T09:54:47.8817729Z             {
2026-08-28T09:54:47.8818388Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8819308Z               "line": 1776
2026-08-28T09:54:47.8819924Z             },
2026-08-28T09:54:47.8820487Z             {
2026-08-28T09:54:47.8821092Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8821831Z               "line": 22
2026-08-28T09:54:47.8822455Z             },
2026-08-28T09:54:47.8823013Z             {
2026-08-28T09:54:47.8823680Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8824454Z               "line": 1522
2026-08-28T09:54:47.8825079Z             },
2026-08-28T09:54:47.8825728Z             {
2026-08-28T09:54:47.8826396Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8827162Z               "line": 2281
2026-08-28T09:54:47.8827794Z             }
2026-08-28T09:54:47.8828338Z           ]
2026-08-28T09:54:47.8828910Z         },
2026-08-28T09:54:47.8829539Z         "int": {
2026-08-28T09:54:47.8830129Z           "complete": true,
2026-08-28T09:54:47.8830798Z           "evidence": [
2026-08-28T09:54:47.8831404Z             {
2026-08-28T09:54:47.8832072Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.8832911Z               "line": 272
2026-08-28T09:54:47.8833521Z             },
2026-08-28T09:54:47.8834084Z             {
2026-08-28T09:54:47.8834761Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.8835600Z               "line": 299
2026-08-28T09:54:47.8836225Z             },
2026-08-28T09:54:47.8836779Z             {
2026-08-28T09:54:47.8837437Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.8838275Z               "line": 450
2026-08-28T09:54:47.8838903Z             }
2026-08-28T09:54:47.8839537Z           ]
2026-08-28T09:54:47.8840172Z         },
2026-08-28T09:54:47.8840751Z         "unit": {
2026-08-28T09:54:47.8841388Z           "complete": true,
2026-08-28T09:54:47.8842051Z           "evidence": [
2026-08-28T09:54:47.8842656Z             {
2026-08-28T09:54:47.8843339Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.8844190Z               "line": 2451
2026-08-28T09:54:47.8844820Z             },
2026-08-28T09:54:47.8845434Z             {
2026-08-28T09:54:47.8846047Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8846819Z               "line": 5016
2026-08-28T09:54:47.8847530Z             },
2026-08-28T09:54:47.8848088Z             {
2026-08-28T09:54:47.8848692Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8849524Z               "line": 5045
2026-08-28T09:54:47.8850144Z             },
2026-08-28T09:54:47.8850698Z             {
2026-08-28T09:54:47.8851287Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8852034Z               "line": 5058
2026-08-28T09:54:47.8852664Z             }
2026-08-28T09:54:47.8853211Z           ]
2026-08-28T09:54:47.8853750Z         }
2026-08-28T09:54:47.8854279Z       }
2026-08-28T09:54:47.8854797Z     },
2026-08-28T09:54:47.8855327Z     {
2026-08-28T09:54:47.8855910Z       "id": "REQ-RC-CROSS-NODE-ATTACH",
2026-08-28T09:54:47.8862351Z       "title": "Bug #4: spt rc to a remote endpoint fails with 'no live session' though endpoint list shows it Active — rc.rs:1063 resolves only the LOCAL broker session table and always dials loopback, never consulting the registry or dialing the owning node (the cross-node attach transport exists in the broker; only the client leg is missing). Fix: on a local resolve miss, resolve the owning node from the registry (reuse resolve_across_visible), net_dial that node, and run a remote session-resolve + serve_attach round-trip (mirror the wansend resolve-dial-round-trip pattern). Shares the resolve-owning-node primitive with REQ-WAN-SEND-DELIVERY. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #4.",
2026-08-28T09:54:47.8868369Z       "requiredStages": [
2026-08-28T09:54:47.8869213Z         "doc",
2026-08-28T09:54:47.8869798Z         "impl",
2026-08-28T09:54:47.8870364Z         "unit",
2026-08-28T09:54:47.8870922Z         "int"
2026-08-28T09:54:47.8871474Z       ],
2026-08-28T09:54:47.8872008Z       "stages": {
2026-08-28T09:54:47.8872583Z         "doc": {
2026-08-28T09:54:47.8873173Z           "complete": true,
2026-08-28T09:54:47.8873845Z           "evidence": [
2026-08-28T09:54:47.8874470Z             {
2026-08-28T09:54:47.8875067Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.8875795Z               "line": 755
2026-08-28T09:54:47.8876495Z             }
2026-08-28T09:54:47.8877049Z           ]
2026-08-28T09:54:47.8877601Z         },
2026-08-28T09:54:47.8878146Z         "impl": {
2026-08-28T09:54:47.8878742Z           "complete": true,
2026-08-28T09:54:47.8883757Z           "evidence": [
2026-08-28T09:54:47.8884420Z             {
2026-08-28T09:54:47.8885111Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.8885978Z               "line": 314
2026-08-28T09:54:47.8886608Z             },
2026-08-28T09:54:47.8887171Z             {
2026-08-28T09:54:47.8887839Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.8888697Z               "line": 340
2026-08-28T09:54:47.8889475Z             },
2026-08-28T09:54:47.8890052Z             {
2026-08-28T09:54:47.8890721Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.8891555Z               "line": 446
2026-08-28T09:54:47.8892179Z             },
2026-08-28T09:54:47.8892757Z             {
2026-08-28T09:54:47.8893414Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.8894265Z               "line": 888
2026-08-28T09:54:47.8894880Z             },
2026-08-28T09:54:47.8895438Z             {
2026-08-28T09:54:47.8896101Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.8896944Z               "line": 92
2026-08-28T09:54:47.8897701Z             },
2026-08-28T09:54:47.8898384Z             {
2026-08-28T09:54:47.8899324Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8900126Z               "line": 2281
2026-08-28T09:54:47.8900745Z             },
2026-08-28T09:54:47.8901305Z             {
2026-08-28T09:54:47.8901920Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.8902720Z               "line": 2826
2026-08-28T09:54:47.8903335Z             },
2026-08-28T09:54:47.8903894Z             {
2026-08-28T09:54:47.8904525Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.8905427Z               "line": 262
2026-08-28T09:54:47.8906041Z             }
2026-08-28T09:54:47.8906599Z           ]
2026-08-28T09:54:47.8907133Z         },
2026-08-28T09:54:47.8907671Z         "int": {
2026-08-28T09:54:47.8908257Z           "complete": true,
2026-08-28T09:54:47.8908910Z           "evidence": [
2026-08-28T09:54:47.8909603Z             {
2026-08-28T09:54:47.8910300Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.8911158Z               "line": 583
2026-08-28T09:54:47.8911783Z             },
2026-08-28T09:54:47.8912337Z             {
2026-08-28T09:54:47.8912975Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.8913787Z               "line": 2846
2026-08-28T09:54:47.8914408Z             }
2026-08-28T09:54:47.8914950Z           ]
2026-08-28T09:54:47.8915481Z         },
2026-08-28T09:54:47.8916015Z         "unit": {
2026-08-28T09:54:47.8916606Z           "complete": true,
2026-08-28T09:54:47.8917260Z           "evidence": [
2026-08-28T09:54:47.8917868Z             {
2026-08-28T09:54:47.8918521Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.8919447Z               "line": 455
2026-08-28T09:54:47.8920072Z             },
2026-08-28T09:54:47.8920631Z             {
2026-08-28T09:54:47.8921274Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.8922081Z               "line": 2803
2026-08-28T09:54:47.8922699Z             }
2026-08-28T09:54:47.8923244Z           ]
2026-08-28T09:54:47.8923864Z         }
2026-08-28T09:54:47.8924390Z       }
2026-08-28T09:54:47.8924920Z     },
2026-08-28T09:54:47.8925444Z     {
2026-08-28T09:54:47.8926041Z       "id": "REQ-RC-DISPLAY-SOLE-WRITER",
2026-08-28T09:54:47.8947371Z       "title": "TEARDOWN-AUTHORITY W5 (hertz RCA 3 bug 1, 2026-07-19 — REPRODUCED on 0.38.1 CLI + 0.38.1 broker; doyle ruled, and it CORRECTS an incomplete v0.38.1 call of doyle's own): while `spt rc` owns the terminal (raw / alternate screen), rc is the SOLE writer to that display — no background thread may write to the inherited stderr. TODAY: BrainConn::split_with_reader (spt-daemon/src/brain.rs:253-270) unconditionally eprintln!s `PUMP_IPC_READER: spawned` / `exited` from its reader thread. Every reconnect attempt calls establish_attach -> Brain::cold_start_pump (rc.rs:1700-1712), and reconnect_banner_bytes (rc.rs:2040-2054) deliberately clears/homes and leaves the cursor immediately after the countdown with NO trailing newline — so the marker lands exactly at that cursor and the operator sees `Reconnecting to local daemon... 9sPUMP_IPC_READER: spawned`. Field screenshot confirms it also reaches the harness alt screen on a real `endpoint run` + `rc --take`. WHY THIS IS A CORRECTION, ON THE RECORD: v0.38.1's REQ-RC-SINGLE-PUMP-BRAIN removed the DOUBLE construction and doyle ruled the surviving single banner 'truthful, keep it' and classified the change Internal (diagnostic hygiene, not user-facing). Both halves of that ruling were wrong on facts doyle did not check: the marker is not merely a startup diagnostic, it is rendered INTO an rc-owned display, so it was user-facing all along and v0.38.1 reduced rather than eliminated the corruption. FIX: delete both unconditional eprintln diagnostics from the pump reader thread. If the observability is still wanted it goes to the daemon's persistent diagnostic sink or an explicit opt-in debug trace that NEVER inherits an interactive client's stderr — never to a stderr an attached client owns. Grounding: ADR-0043 terminal render lifecycle (one renderer owns the baseline); CONTEXT.md:33-36 (the broker's internals are not a client-visible surface). Gate: impl — diagnostics removed from split_with_reader (and any sibling unconditional client-inherited stderr write on the pump path); unit — insufficient alone and explicitly NOT the gate (the defect is cross-thread out-of-band stderr, which a banner-byte unit cannot observe); int — drive the REAL reconnect-banner path with the child's stderr captured into the SAME sink as the rendered terminal and assert neither PUMP marker appears anywhere in the captured stream, PLUS assert an ordinary initial `spt rc` is marker-free.",
2026-08-28T09:54:47.8968220Z       "requiredStages": [
2026-08-28T09:54:47.8968873Z         "impl",
2026-08-28T09:54:47.8969550Z         "int"
2026-08-28T09:54:47.8970108Z       ],
2026-08-28T09:54:47.8970650Z       "stages": {
2026-08-28T09:54:47.8971226Z         "doc": {
2026-08-28T09:54:47.8971838Z           "complete": false,
2026-08-28T09:54:47.8972528Z           "evidence": []
2026-08-28T09:54:47.8973169Z         },
2026-08-28T09:54:47.8973718Z         "impl": {
2026-08-28T09:54:47.8974313Z           "complete": true,
2026-08-28T09:54:47.8974985Z           "evidence": [
2026-08-28T09:54:47.8975594Z             {
2026-08-28T09:54:47.8976246Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8977090Z               "line": 321
2026-08-28T09:54:47.8977716Z             },
2026-08-28T09:54:47.8978283Z             {
2026-08-28T09:54:47.8979033Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8979876Z               "line": 353
2026-08-28T09:54:47.8980501Z             },
2026-08-28T09:54:47.8981068Z             {
2026-08-28T09:54:47.8981745Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.8982560Z               "line": 479
2026-08-28T09:54:47.8983178Z             }
2026-08-28T09:54:47.8983719Z           ]
2026-08-28T09:54:47.8984278Z         },
2026-08-28T09:54:47.8984836Z         "int": {
2026-08-28T09:54:47.8985499Z           "complete": true,
2026-08-28T09:54:47.8986169Z           "evidence": [
2026-08-28T09:54:47.8986787Z             {
2026-08-28T09:54:47.8987454Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:47.8988299Z               "line": 594
2026-08-28T09:54:47.8988929Z             }
2026-08-28T09:54:47.8989554Z           ]
2026-08-28T09:54:47.8990088Z         },
2026-08-28T09:54:47.8990871Z         "unit": {
2026-08-28T09:54:47.8991474Z           "complete": false,
2026-08-28T09:54:47.8992214Z           "evidence": []
2026-08-28T09:54:47.8992830Z         }
2026-08-28T09:54:47.8993436Z       }
2026-08-28T09:54:47.8993955Z     },
2026-08-28T09:54:47.8994471Z     {
2026-08-28T09:54:47.8995077Z       "id": "REQ-RC-DRIVER-READ-LIVENESS",
2026-08-28T09:54:47.9019059Z       "title": "The rc client's busy-refuse reads a LIVE driver, never a stale stamp (kin to REQ-HAZARD-DRIVEN-BY-SELFHEAL / KH 7.15, observed from the CLIENT side; instrumented x20 2026-08-19, doyle-ruled same day). MECHANISM, measured not inferred: `driven_by` is broker-owned and EVERY clear of it lives in the daemon (broker stamp_reaped, converge_perch_stamps, the livehost reconcile belt), while the write that makes a stopped perch read `offline` is `terminal_normalize` — run SYNCHRONOUSLY in the `spt endpoint stop` CLI process, whose write set is exactly the REST triple (status / rest_state / dormant_since_ms) and structurally cannot touch the CONTROL triple. `current_driver` (rc.rs) was a raw disk read of `driven_by` with NO liveness check, feeding `pre_broker_busy_guidance`, which prints and `return Ok(())` BEFORE any broker traffic — so between the CLI's stop-write and the next daemon tick, a plain `spt rc` is refused by a controller that is provably gone, and the broker's own truth (no live session) is never consulted. This is operator-visible with no test involved: stop an endpoint, immediately rc it, get 'controlled by another window on this machine' and exit 0. Instrument vector (run-3 of 20): driven_by=Some(own hex) + controlled=true beside status=offline at the refusal instant, cleared only ~56s later — the clear is LATE, not missing. FIX = reader-side and NARROW: the driver a record names is `None` exactly when `status == STATUS_OFFLINE`, the product's own declared staleness marker (the same predicate the daemon's DRIVEN_BY_SELFHEAL_OFFLINE belt asserts at livehost.rs); the reader stops having to wait for the tick to agree. Any other status — INCLUDING a record with no `status` field at all — is left alone and reports its driver verbatim: a broader `!= online` rule would suppress the refusal on legitimately mid-bind records, which is worse than the residual it closes (3/20 status-absent reads measured at capture instants, doyle-ruled ACCEPTED WITH ITS NUMBER 2026-08-19; re-opens only if a gate-instant absent-status refusal is ever measured). NO new writer: `driven_by` stays single-writer (the broker) — the belt that would have cleared the control triple from the CLI stop path was ruled OUT for exactly that reason, and `terminal_normalize`'s doc instead states the ownership split by replacement. `--view`/`--take`/qualified targets are unaffected (they already bypass the gate). Gate: impl — the liveness-filtered driver read in rc.rs + the terminal_normalize ownership-split doc; unit — an offline record reports no driver, an online one reports it verbatim, and NEITHER a non-offline status NOR an absent status is treated as a staleness marker (the narrowing is asserted in both directions, so a later widening cannot land silently). NO int: the existing engine-room bring-up e2e already expresses the invariant and must go green as it stands — a new int cell would only re-run it.",
2026-08-28T09:54:47.9043362Z       "requiredStages": [
2026-08-28T09:54:47.9044010Z         "impl",
2026-08-28T09:54:47.9044580Z         "unit"
2026-08-28T09:54:47.9045453Z       ],
2026-08-28T09:54:47.9046021Z       "stages": {
2026-08-28T09:54:47.9046592Z         "doc": {
2026-08-28T09:54:47.9047200Z           "complete": false,
2026-08-28T09:54:47.9047978Z           "evidence": []
2026-08-28T09:54:47.9048596Z         },
2026-08-28T09:54:47.9049268Z         "impl": {
2026-08-28T09:54:47.9049872Z           "complete": true,
2026-08-28T09:54:47.9050539Z           "evidence": [
2026-08-28T09:54:47.9051144Z             {
2026-08-28T09:54:47.9051797Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.9052619Z               "line": 541
2026-08-28T09:54:47.9053249Z             },
2026-08-28T09:54:47.9053802Z             {
2026-08-28T09:54:47.9054427Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9055280Z               "line": 1336
2026-08-28T09:54:47.9055923Z             },
2026-08-28T09:54:47.9056486Z             {
2026-08-28T09:54:47.9057095Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9057884Z               "line": 1349
2026-08-28T09:54:47.9058499Z             }
2026-08-28T09:54:47.9059133Z           ]
2026-08-28T09:54:47.9059687Z         },
2026-08-28T09:54:47.9060231Z         "int": {
2026-08-28T09:54:47.9060851Z           "complete": false,
2026-08-28T09:54:47.9061528Z           "evidence": []
2026-08-28T09:54:47.9062148Z         },
2026-08-28T09:54:47.9062688Z         "unit": {
2026-08-28T09:54:47.9063280Z           "complete": true,
2026-08-28T09:54:47.9063942Z           "evidence": [
2026-08-28T09:54:47.9064557Z             {
2026-08-28T09:54:47.9065178Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9065958Z               "line": 3878
2026-08-28T09:54:47.9066573Z             }
2026-08-28T09:54:47.9067122Z           ]
2026-08-28T09:54:47.9067664Z         }
2026-08-28T09:54:47.9068200Z       }
2026-08-28T09:54:47.9068726Z     },
2026-08-28T09:54:47.9069336Z     {
2026-08-28T09:54:47.9069938Z       "id": "REQ-RC-HARNESS-ONLY-REFUSAL",
2026-08-28T09:54:47.9078253Z       "title": "RC-RENDER-TRUTH W1 (ADR-0042 decision 3, hertz elevated-endpoints RCA core leg 1): direct `spt rc <id>` preflights the already-known harness_only/controllable=Some(false) fact (local + gossiped rows both carry it) and refuses BEFORE any attach/stream with truthful copy naming the actual state ('online but harness-hosted; spt does not own its terminal') — never the stale-row guess ('it may have ended, or the registry row is stale'). Reproduced deterministically 2x live on an ONLINE - HARNESS ONLY endpoint. RC support for harness-hosted endpoints is NOT claimed until the elevated PTY-host satellite exists (standing ruling). Gate: impl — pre-stream preflight + truthful copy; unit — harness-only row refuses pre-dial with the new copy, non-harness rows unaffected; int — live remote Instance{harness_only:true} => direct rc refuses pre-stream, names harness-hosted, never says stale; doc — ADR-0042.",
2026-08-28T09:54:47.9086354Z       "requiredStages": [
2026-08-28T09:54:47.9087012Z         "doc",
2026-08-28T09:54:47.9087589Z         "impl",
2026-08-28T09:54:47.9088157Z         "unit",
2026-08-28T09:54:47.9088727Z         "int"
2026-08-28T09:54:47.9089373Z       ],
2026-08-28T09:54:47.9089931Z       "stages": {
2026-08-28T09:54:47.9090513Z         "doc": {
2026-08-28T09:54:47.9091124Z           "complete": true,
2026-08-28T09:54:47.9091784Z           "evidence": [
2026-08-28T09:54:47.9092399Z             {
2026-08-28T09:54:47.9093070Z               "path": "docs/adr/0042-rc-attach-truth.md",
2026-08-28T09:54:47.9093906Z               "line": 61
2026-08-28T09:54:47.9094531Z             }
2026-08-28T09:54:47.9095093Z           ]
2026-08-28T09:54:47.9095641Z         },
2026-08-28T09:54:47.9096177Z         "impl": {
2026-08-28T09:54:47.9096778Z           "complete": true,
2026-08-28T09:54:47.9097458Z           "evidence": [
2026-08-28T09:54:47.9098145Z             {
2026-08-28T09:54:47.9098756Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9099633Z               "line": 1306
2026-08-28T09:54:47.9100282Z             },
2026-08-28T09:54:47.9100825Z             {
2026-08-28T09:54:47.9101426Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9102216Z               "line": 2086
2026-08-28T09:54:47.9102935Z             },
2026-08-28T09:54:47.9103502Z             {
2026-08-28T09:54:47.9104142Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.9104943Z               "line": 327
2026-08-28T09:54:47.9105578Z             }
2026-08-28T09:54:47.9106126Z           ]
2026-08-28T09:54:47.9106674Z         },
2026-08-28T09:54:47.9107208Z         "int": {
2026-08-28T09:54:47.9107790Z           "complete": true,
2026-08-28T09:54:47.9108448Z           "evidence": [
2026-08-28T09:54:47.9109129Z             {
2026-08-28T09:54:47.9109847Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:47.9110765Z               "line": 510
2026-08-28T09:54:47.9111394Z             }
2026-08-28T09:54:47.9111948Z           ]
2026-08-28T09:54:47.9112488Z         },
2026-08-28T09:54:47.9113022Z         "unit": {
2026-08-28T09:54:47.9113613Z           "complete": true,
2026-08-28T09:54:47.9114257Z           "evidence": [
2026-08-28T09:54:47.9114863Z             {
2026-08-28T09:54:47.9115475Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9116266Z               "line": 3782
2026-08-28T09:54:47.9116896Z             }
2026-08-28T09:54:47.9117454Z           ]
2026-08-28T09:54:47.9118007Z         }
2026-08-28T09:54:47.9118545Z       }
2026-08-28T09:54:47.9119159Z     },
2026-08-28T09:54:47.9119689Z     {
2026-08-28T09:54:47.9120298Z       "id": "REQ-RC-HONEST-SESSION-AUTHORITY",
2026-08-28T09:54:47.9130254Z       "title": "RC-RENDER-TRUTH W1 (ADR-0042 decision 1, hertz perri-contradiction RCA): normal `spt rc` consults the ADR-0041 single honest-session authority BEFORE the persisted-offline fast-fail — run the bounded SessionProbe::has_live_session_honest gate; honest session exists means attach via run_attach_session_confirmed regardless of persisted status; no honest session means the existing offline refusal stands; claimed session with dead client tree means refusal/reap, NEVER attach. Reuse SessionProbe — no new liveness heuristic. Kills the authority split where rc refused ('offline — nothing to attach to') while endpoint run --resume reattached to the same live session. Gate: impl — the pre-fast-fail probe + session-confirmed routing; unit — probe-true routes to session-confirmed attach, probe-false keeps the refusal, dead-tree claim refuses; int — the 3-row regression matrix: offline persisted row + honest live broker session => rc attaches; offline + no session => existing refusal; zombie/dead client tree => refusal, never attach; doc — ADR-0042.",
2026-08-28T09:54:47.9140123Z       "requiredStages": [
2026-08-28T09:54:47.9140771Z         "doc",
2026-08-28T09:54:47.9141348Z         "impl",
2026-08-28T09:54:47.9141922Z         "unit",
2026-08-28T09:54:47.9142479Z         "int"
2026-08-28T09:54:47.9143023Z       ],
2026-08-28T09:54:47.9143563Z       "stages": {
2026-08-28T09:54:47.9144130Z         "doc": {
2026-08-28T09:54:47.9144726Z           "complete": true,
2026-08-28T09:54:47.9145424Z           "evidence": [
2026-08-28T09:54:47.9146048Z             {
2026-08-28T09:54:47.9146707Z               "path": "docs/adr/0042-rc-attach-truth.md",
2026-08-28T09:54:47.9147546Z               "line": 45
2026-08-28T09:54:47.9148166Z             }
2026-08-28T09:54:47.9148719Z           ]
2026-08-28T09:54:47.9149358Z         },
2026-08-28T09:54:47.9150186Z         "impl": {
2026-08-28T09:54:47.9150821Z           "complete": true,
2026-08-28T09:54:47.9151489Z           "evidence": [
2026-08-28T09:54:47.9152097Z             {
2026-08-28T09:54:47.9152710Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9153502Z               "line": 1073
2026-08-28T09:54:47.9154123Z             },
2026-08-28T09:54:47.9154671Z             {
2026-08-28T09:54:47.9155277Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9156107Z               "line": 1154
2026-08-28T09:54:47.9156741Z             },
2026-08-28T09:54:47.9157329Z             {
2026-08-28T09:54:47.9157939Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9158717Z               "line": 2015
2026-08-28T09:54:47.9159567Z             }
2026-08-28T09:54:47.9160125Z           ]
2026-08-28T09:54:47.9160661Z         },
2026-08-28T09:54:47.9161200Z         "int": {
2026-08-28T09:54:47.9161792Z           "complete": true,
2026-08-28T09:54:47.9162455Z           "evidence": [
2026-08-28T09:54:47.9163066Z             {
2026-08-28T09:54:47.9163748Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:47.9164597Z               "line": 278
2026-08-28T09:54:47.9165207Z             },
2026-08-28T09:54:47.9165771Z             {
2026-08-28T09:54:47.9166452Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:47.9167363Z               "line": 341
2026-08-28T09:54:47.9167992Z             },
2026-08-28T09:54:47.9168543Z             {
2026-08-28T09:54:47.9169296Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:47.9170131Z               "line": 376
2026-08-28T09:54:47.9170897Z             }
2026-08-28T09:54:47.9171475Z           ]
2026-08-28T09:54:47.9172018Z         },
2026-08-28T09:54:47.9172561Z         "unit": {
2026-08-28T09:54:47.9173152Z           "complete": true,
2026-08-28T09:54:47.9173816Z           "evidence": [
2026-08-28T09:54:47.9174422Z             {
2026-08-28T09:54:47.9175037Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9175820Z               "line": 3620
2026-08-28T09:54:47.9176436Z             }
2026-08-28T09:54:47.9176974Z           ]
2026-08-28T09:54:47.9177518Z         }
2026-08-28T09:54:47.9178039Z       }
2026-08-28T09:54:47.9178562Z     },
2026-08-28T09:54:47.9179175Z     {
2026-08-28T09:54:47.9179737Z       "id": "REQ-RC-IDENTITY",
2026-08-28T09:54:47.9186820Z       "title": "`spt rc` overlays a persistent endpoint-identity marker so the operator always groks which endpoint they control: a reserved TOP status row via a DECSTBM scroll-region (shrink the PTY's reported rows by 1, own the row), right-aligned `SUBNET : ENDPOINT_ID @ NODE`, CYAN text. Re-assert the margin + repaint on alt-screen enter / DECSTBM reset / resize (output-scanning, like the existing mouse_scanner). NO window title (the harness, e.g. CC, owns it for busyness — OSC dropped). Resolve subnet/node/id once at attach (perch/registry read) and thread into the pump; subnet = the endpoint's home/primary (\"local\" if none). The literal floating rounded-rectangle corner box is DEFERRED to the future web-based GUI (not a grid-model rc — that lift is better spent on the GUI). (v0.16.0)",
2026-08-28T09:54:47.9193840Z       "requiredStages": [
2026-08-28T09:54:47.9194560Z         "impl",
2026-08-28T09:54:47.9195128Z         "unit",
2026-08-28T09:54:47.9195705Z         "int"
2026-08-28T09:54:47.9196282Z       ],
2026-08-28T09:54:47.9196830Z       "stages": {
2026-08-28T09:54:47.9197409Z         "doc": {
2026-08-28T09:54:47.9198000Z           "complete": false,
2026-08-28T09:54:47.9198696Z           "evidence": []
2026-08-28T09:54:47.9199397Z         },
2026-08-28T09:54:47.9199952Z         "impl": {
2026-08-28T09:54:47.9200571Z           "complete": true,
2026-08-28T09:54:47.9200852Z           "evidence": [
2026-08-28T09:54:47.9201111Z             {
2026-08-28T09:54:47.9201425Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9201691Z               "line": 228
2026-08-28T09:54:47.9201949Z             },
2026-08-28T09:54:47.9202201Z             {
2026-08-28T09:54:47.9202516Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9202783Z               "line": 242
2026-08-28T09:54:47.9203040Z             },
2026-08-28T09:54:47.9203302Z             {
2026-08-28T09:54:47.9203607Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9203884Z               "line": 256
2026-08-28T09:54:47.9204136Z             },
2026-08-28T09:54:47.9204395Z             {
2026-08-28T09:54:47.9204700Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9204970Z               "line": 278
2026-08-28T09:54:47.9205220Z             },
2026-08-28T09:54:47.9205482Z             {
2026-08-28T09:54:47.9205802Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9206145Z               "line": 289
2026-08-28T09:54:47.9206408Z             },
2026-08-28T09:54:47.9206656Z             {
2026-08-28T09:54:47.9206961Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9207229Z               "line": 307
2026-08-28T09:54:47.9207482Z             },
2026-08-28T09:54:47.9207732Z             {
2026-08-28T09:54:47.9208044Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9208312Z               "line": 319
2026-08-28T09:54:47.9208569Z             },
2026-08-28T09:54:47.9208832Z             {
2026-08-28T09:54:47.9209308Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9209584Z               "line": 353
2026-08-28T09:54:47.9209833Z             },
2026-08-28T09:54:47.9210092Z             {
2026-08-28T09:54:47.9210389Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9210663Z               "line": 407
2026-08-28T09:54:47.9210921Z             }
2026-08-28T09:54:47.9211174Z           ]
2026-08-28T09:54:47.9211436Z         },
2026-08-28T09:54:47.9211700Z         "int": {
2026-08-28T09:54:47.9211980Z           "complete": true,
2026-08-28T09:54:47.9212247Z           "evidence": [
2026-08-28T09:54:47.9212500Z             {
2026-08-28T09:54:47.9212795Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9213076Z               "line": 5627
2026-08-28T09:54:47.9213324Z             }
2026-08-28T09:54:47.9213581Z           ]
2026-08-28T09:54:47.9213838Z         },
2026-08-28T09:54:47.9214096Z         "unit": {
2026-08-28T09:54:47.9214377Z           "complete": true,
2026-08-28T09:54:47.9214645Z           "evidence": [
2026-08-28T09:54:47.9214898Z             {
2026-08-28T09:54:47.9215204Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9215477Z               "line": 5492
2026-08-28T09:54:47.9215733Z             },
2026-08-28T09:54:47.9215986Z             {
2026-08-28T09:54:47.9216296Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9216629Z               "line": 5510
2026-08-28T09:54:47.9216883Z             },
2026-08-28T09:54:47.9217140Z             {
2026-08-28T09:54:47.9217450Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9217722Z               "line": 5528
2026-08-28T09:54:47.9217979Z             },
2026-08-28T09:54:47.9218236Z             {
2026-08-28T09:54:47.9218543Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9218815Z               "line": 5564
2026-08-28T09:54:47.9219154Z             },
2026-08-28T09:54:47.9219468Z             {
2026-08-28T09:54:47.9219778Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9220055Z               "line": 5571
2026-08-28T09:54:47.9220304Z             },
2026-08-28T09:54:47.9220565Z             {
2026-08-28T09:54:47.9220878Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9221143Z               "line": 5584
2026-08-28T09:54:47.9221397Z             },
2026-08-28T09:54:47.9221654Z             {
2026-08-28T09:54:47.9221983Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9222250Z               "line": 5612
2026-08-28T09:54:47.9222541Z             }
2026-08-28T09:54:47.9222904Z           ]
2026-08-28T09:54:47.9223166Z         }
2026-08-28T09:54:47.9223413Z       }
2026-08-28T09:54:47.9227667Z     },
2026-08-28T09:54:47.9228081Z     {
2026-08-28T09:54:47.9228534Z       "id": "REQ-RC-IDMARKER-DISABLE",
2026-08-28T09:54:47.9233272Z       "title": "Bugs #14 + #7/#8 (marker half): feature-flag the top-right StatusRow endpoint-id marker OFF (rc.rs:198-307). It is a one-shot absolutely-positioned paint that scrolls off-screen and is not re-stickied (#14), and its DECSC/clear/SGR injection splices into the harness in-flight drawing causing residual artifacts (#7/#8). Ship disabled next release (operator: save the concept for a future web SPT GUI); revisit as a proper per-frame sticky overlay only once REQ-BROKER-SCREEN-GRID provides the screen model. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #14.",
2026-08-28T09:54:47.9233581Z       "requiredStages": [
2026-08-28T09:54:47.9233963Z         "impl",
2026-08-28T09:54:47.9234225Z         "unit"
2026-08-28T09:54:47.9234478Z       ],
2026-08-28T09:54:47.9234745Z       "stages": {
2026-08-28T09:54:47.9235002Z         "doc": {
2026-08-28T09:54:47.9235288Z           "complete": false,
2026-08-28T09:54:47.9235559Z           "evidence": []
2026-08-28T09:54:47.9235888Z         },
2026-08-28T09:54:47.9236193Z         "impl": {
2026-08-28T09:54:47.9236460Z           "complete": true,
2026-08-28T09:54:47.9236737Z           "evidence": [
2026-08-28T09:54:47.9237008Z             {
2026-08-28T09:54:47.9237407Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9237674Z               "line": 215
2026-08-28T09:54:47.9237932Z             },
2026-08-28T09:54:47.9238179Z             {
2026-08-28T09:54:47.9238488Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9238760Z               "line": 2159
2026-08-28T09:54:47.9239104Z             }
2026-08-28T09:54:47.9239361Z           ]
2026-08-28T09:54:47.9239630Z         },
2026-08-28T09:54:47.9239893Z         "int": {
2026-08-28T09:54:47.9240179Z           "complete": false,
2026-08-28T09:54:47.9240445Z           "evidence": []
2026-08-28T09:54:47.9240693Z         },
2026-08-28T09:54:47.9240941Z         "unit": {
2026-08-28T09:54:47.9241213Z           "complete": true,
2026-08-28T09:54:47.9241485Z           "evidence": [
2026-08-28T09:54:47.9241739Z             {
2026-08-28T09:54:47.9242046Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9242320Z               "line": 5482
2026-08-28T09:54:47.9242573Z             }
2026-08-28T09:54:47.9242836Z           ]
2026-08-28T09:54:47.9243093Z         }
2026-08-28T09:54:47.9243347Z       }
2026-08-28T09:54:47.9243593Z     },
2026-08-28T09:54:47.9243847Z     {
2026-08-28T09:54:47.9244166Z       "id": "REQ-RC-KEY-VT-TRANSLATE",
2026-08-28T09:54:47.9261112Z       "title": "On Windows, `spt rc` translates CONSOLE KEY EVENTS to standard xterm VT so ALL keys reach the hosted harness — arrows/Home/End/PgUp/PgDn/Insert/Delete/F-keys, every modifier combo, Backspace/Ctrl+Backspace — not just the byte-emitting ones. ROOT (operator HITL, doyle /diagnose): `spt rc` reads raw STDIN BYTES (spawn_stdin_reader, std::io::stdin().read); on the Windows LEGACY console (no ENABLE_VIRTUAL_TERMINAL_INPUT) the special keys produce console KEY_EVENTs, NOT stdin bytes, so the byte-pump sees nothing → those keys are DEAD. Enabling ENABLE_VIRTUAL_TERMINAL_INPUT was rejected (W7 dc07c39): on Windows Terminal it yields harness-specific win32-input-mode + broke ctrl-b detach. FIX (agnostic, full fidelity): on Windows, replace the stdin byte-read with a crossterm EVENT source (crossterm 0.28 already a dep; the picker already reads events) and translate each KeyEvent → STANDARD xterm VT bytes via a PURE translate_key_event(KeyEvent)->Vec<u8> (copy a known-correct xterm table verbatim, ADR-0001 spirit), forwarded through the SAME rc pump — the harness receives ordinary xterm VT (harness-AGNOSTIC, no win32-input-mode). Press-only (drop Repeat/Release). Detach stays the ctrl-b+'d' PREFIX, event-sourced (doyle Option B): Ctrl+B arms; armed+plain-'d'⇒Detach; armed+Ctrl+B⇒emit literal 0x02; armed+other⇒0x02 then translate(other). Non-tty stdin (piped/tests) → FALL BACK to the byte-read path (keeps e2e byte-injection working). UNIX UNCHANGED (its raw-mode byte stream already delivers proper VT; cfg-split, zero Unix regression). SUPERSEDES the W7 normalize_key_byte swap on Windows — the translator emits 0x7f for Backspace and 0x08 for Ctrl+Backspace natively (REQ-HAZARD-RC-INPUT-KEY-ENCODING folded in). NO int (a live interactive console can't be driven in CI — HITL, REQ-RUN-PICKER/RC-1 precedent); the exhaustive non-vacuous translate_key_event mapping unit + the event-detach unit ARE the surface. (v0.13.0)",
2026-08-28T09:54:47.9261661Z       "requiredStages": [
2026-08-28T09:54:47.9261962Z         "doc",
2026-08-28T09:54:47.9262219Z         "impl",
2026-08-28T09:54:47.9262481Z         "unit"
2026-08-28T09:54:47.9262733Z       ],
2026-08-28T09:54:47.9263081Z       "stages": {
2026-08-28T09:54:47.9263336Z         "doc": {
2026-08-28T09:54:47.9263623Z           "complete": true,
2026-08-28T09:54:47.9263894Z           "evidence": [
2026-08-28T09:54:47.9264152Z             {
2026-08-28T09:54:47.9264457Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.9264728Z               "line": 411
2026-08-28T09:54:47.9264990Z             },
2026-08-28T09:54:47.9265243Z             {
2026-08-28T09:54:47.9265567Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.9265840Z               "line": 553
2026-08-28T09:54:47.9266158Z             }
2026-08-28T09:54:47.9266406Z           ]
2026-08-28T09:54:47.9266663Z         },
2026-08-28T09:54:47.9266920Z         "impl": {
2026-08-28T09:54:47.9267207Z           "complete": true,
2026-08-28T09:54:47.9267483Z           "evidence": [
2026-08-28T09:54:47.9267737Z             {
2026-08-28T09:54:47.9268052Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9268326Z               "line": 488
2026-08-28T09:54:47.9268586Z             },
2026-08-28T09:54:47.9268838Z             {
2026-08-28T09:54:47.9269244Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9269515Z               "line": 547
2026-08-28T09:54:47.9269769Z             },
2026-08-28T09:54:47.9270021Z             {
2026-08-28T09:54:47.9270332Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9270599Z               "line": 562
2026-08-28T09:54:47.9270852Z             },
2026-08-28T09:54:47.9271117Z             {
2026-08-28T09:54:47.9271415Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9271696Z               "line": 577
2026-08-28T09:54:47.9271969Z             },
2026-08-28T09:54:47.9272222Z             {
2026-08-28T09:54:47.9272522Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9272926Z               "line": 626
2026-08-28T09:54:47.9273236Z             }
2026-08-28T09:54:47.9273655Z           ]
2026-08-28T09:54:47.9273920Z         },
2026-08-28T09:54:47.9274183Z         "int": {
2026-08-28T09:54:47.9274459Z           "complete": false,
2026-08-28T09:54:47.9274732Z           "evidence": []
2026-08-28T09:54:47.9274973Z         },
2026-08-28T09:54:47.9275255Z         "unit": {
2026-08-28T09:54:47.9275536Z           "complete": true,
2026-08-28T09:54:47.9275808Z           "evidence": [
2026-08-28T09:54:47.9276057Z             {
2026-08-28T09:54:47.9276367Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9276642Z               "line": 5073
2026-08-28T09:54:47.9276952Z             },
2026-08-28T09:54:47.9277199Z             {
2026-08-28T09:54:47.9277504Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9277786Z               "line": 5188
2026-08-28T09:54:47.9278034Z             }
2026-08-28T09:54:47.9278306Z           ]
2026-08-28T09:54:47.9278555Z         }
2026-08-28T09:54:47.9278805Z       }
2026-08-28T09:54:47.9279117Z     },
2026-08-28T09:54:47.9279375Z     {
2026-08-28T09:54:47.9279695Z       "id": "REQ-RC-MOUSE-FORWARD",
2026-08-28T09:54:47.9292427Z       "title": "On Windows, `spt rc` must FORWARD scroll-wheel events to the harness when the harness has mouse reporting on. ROOT (operator HITL): P1's RawGuard EnableMouseCapture (added for right-click paste, REQ-RC-WIN-PASTE) makes Windows Terminal forward ALL mouse — including the scroll wheel — to rc instead of scrolling its own buffer, but the rc mouse handler dropped everything except right-button-down → scroll DIED (and WT's native scrollback is stolen by the capture). Operator ruling: keep mouse capture + right-click bracketed paste AND forward scroll to the harness. FIX (doyle design, cfg(windows), folds into the rc mouse handler): TRACK the harness's mouse-reporting mode by scanning its OUTPUT stream for the DECSET set/reset — ESC[?1000h/1002h/1003h (mouse on) + ESC[?1006h (SGR ext) and their ...l (off) — into a shared MouseMode{enabled,sgr} (pump writes from output, stdin reader reads); the scan survives a sequence SPLIT across output chunks (a bounded carry buffer). The mouse handler: right-button-DOWN -> bracketed clipboard paste (unchanged, REQ-RC-WIN-PASTE); ScrollUp/Down -> translate to an xterm SGR mouse report (ESC[<64;col+1;row+1M up / ESC[<65;..M down, 0-based crossterm -> 1-based xterm) and forward ONLY when enabled && sgr (else DROP — a legacy X10 report the harness may not parse is garbage); Moved/drag/left/middle -> DROP (scroll is the operator's need; click-forward risks garbage, no click-to-position). Unix UNCHANGED (no capture; the terminal scrolls natively). (v0.13.0)",
2026-08-28T09:54:47.9292859Z       "requiredStages": [
2026-08-28T09:54:47.9293178Z         "doc",
2026-08-28T09:54:47.9293437Z         "impl",
2026-08-28T09:54:47.9293690Z         "unit"
2026-08-28T09:54:47.9293943Z       ],
2026-08-28T09:54:47.9294205Z       "stages": {
2026-08-28T09:54:47.9294466Z         "doc": {
2026-08-28T09:54:47.9294742Z           "complete": true,
2026-08-28T09:54:47.9295017Z           "evidence": [
2026-08-28T09:54:47.9295274Z             {
2026-08-28T09:54:47.9295617Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.9295885Z               "line": 574
2026-08-28T09:54:47.9296138Z             }
2026-08-28T09:54:47.9296389Z           ]
2026-08-28T09:54:47.9296638Z         },
2026-08-28T09:54:47.9296900Z         "impl": {
2026-08-28T09:54:47.9297182Z           "complete": true,
2026-08-28T09:54:47.9297459Z           "evidence": [
2026-08-28T09:54:47.9297724Z             {
2026-08-28T09:54:47.9298048Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9298319Z               "line": 683
2026-08-28T09:54:47.9298581Z             },
2026-08-28T09:54:47.9298844Z             {
2026-08-28T09:54:47.9299235Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9299507Z               "line": 699
2026-08-28T09:54:47.9299760Z             }
2026-08-28T09:54:47.9300016Z           ]
2026-08-28T09:54:47.9300266Z         },
2026-08-28T09:54:47.9300529Z         "int": {
2026-08-28T09:54:47.9300871Z           "complete": false,
2026-08-28T09:54:47.9301144Z           "evidence": []
2026-08-28T09:54:47.9301406Z         },
2026-08-28T09:54:47.9301659Z         "unit": {
2026-08-28T09:54:47.9301941Z           "complete": true,
2026-08-28T09:54:47.9302218Z           "evidence": [
2026-08-28T09:54:47.9302474Z             {
2026-08-28T09:54:47.9302778Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9303058Z               "line": 5402
2026-08-28T09:54:47.9303311Z             },
2026-08-28T09:54:47.9303568Z             {
2026-08-28T09:54:47.9303940Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9304207Z               "line": 5421
2026-08-28T09:54:47.9304470Z             },
2026-08-28T09:54:47.9304717Z             {
2026-08-28T09:54:47.9305022Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9305297Z               "line": 5433
2026-08-28T09:54:47.9305563Z             },
2026-08-28T09:54:47.9305816Z             {
2026-08-28T09:54:47.9306121Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9306393Z               "line": 5461
2026-08-28T09:54:47.9306649Z             }
2026-08-28T09:54:47.9306902Z           ]
2026-08-28T09:54:47.9307155Z         }
2026-08-28T09:54:47.9307413Z       }
2026-08-28T09:54:47.9307652Z     },
2026-08-28T09:54:47.9307898Z     {
2026-08-28T09:54:47.9308255Z       "id": "REQ-RC-NEWLINE-PRESENTATION-TRUTH",
2026-08-28T09:54:47.9319054Z       "title": "W3 (v0.39.4 field bug 3 ROOT, pinned 2026-07-22): the rc client presents relayed bytes exactly as the emitter addressed them — KNOWN-HAZARDS 7.56. rc's with_vt_output enables ENABLE_PROCESSED_OUTPUT without DISABLE_NEWLINE_AUTO_RETURN (DNAR: zero grep hits tree-wide), so the operator's console translates relayed bare LF into CR+LF — a column reset the emitter never asked for; the /c/config field scraps are capture record t=1784714152501's bare-LF index presented through that mode. Relay byte-clean end to end (why both isolated rigs read NOT-REPRODUCED and the fresh viewer read clean — the synthesized repaint is CUP-absolute). FIX: DNAR joins the with_vt_output composition whenever processed/VT output is enabled; prior-mode capture/restore unchanged; Unix needs nothing (raw mode already clears OPOST/ONLCR). Regression: the W3 captured-bytes rig PAIR (vehicle console without DNAR = field-client model = RED pre-fix; with DNAR = GREEN post-fix) + the minimal LF column-preservation probe through an rc-mode console. Amends REQ-RC-WIN-VT-OUTPUT (#12); kin KH 7.55 + the W3 vehicle-fidelity clause (three console-mode-seam manifestations, one day). Attribution CLOSED when hertz confirms fixed-rc clean on the field session; no debug channel needed.",
2026-08-28T09:54:47.9319527Z       "requiredStages": [
2026-08-28T09:54:47.9319788Z         "doc",
2026-08-28T09:54:47.9320040Z         "impl",
2026-08-28T09:54:47.9320298Z         "unit",
2026-08-28T09:54:47.9320552Z         "int"
2026-08-28T09:54:47.9320795Z       ],
2026-08-28T09:54:47.9321059Z       "stages": {
2026-08-28T09:54:47.9321325Z         "doc": {
2026-08-28T09:54:47.9321616Z           "complete": true,
2026-08-28T09:54:47.9321884Z           "evidence": [
2026-08-28T09:54:47.9322141Z             {
2026-08-28T09:54:47.9322470Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.9322737Z               "line": 872
2026-08-28T09:54:47.9322994Z             },
2026-08-28T09:54:47.9323251Z             {
2026-08-28T09:54:47.9323753Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:47.9324028Z               "line": 251
2026-08-28T09:54:47.9324288Z             }
2026-08-28T09:54:47.9324530Z           ]
2026-08-28T09:54:47.9324793Z         },
2026-08-28T09:54:47.9325051Z         "impl": {
2026-08-28T09:54:47.9325327Z           "complete": true,
2026-08-28T09:54:47.9325595Z           "evidence": [
2026-08-28T09:54:47.9325846Z             {
2026-08-28T09:54:47.9326161Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9326437Z               "line": 766
2026-08-28T09:54:47.9326749Z             }
2026-08-28T09:54:47.9327003Z           ]
2026-08-28T09:54:47.9327260Z         },
2026-08-28T09:54:47.9327518Z         "int": {
2026-08-28T09:54:47.9327803Z           "complete": true,
2026-08-28T09:54:47.9328069Z           "evidence": [
2026-08-28T09:54:47.9328328Z             {
2026-08-28T09:54:47.9328787Z               "path": "crates/spt-daemon/tests/attach_resize_capture.rs",
2026-08-28T09:54:47.9329144Z               "line": 447
2026-08-28T09:54:47.9329399Z             },
2026-08-28T09:54:47.9329656Z             {
2026-08-28T09:54:47.9330258Z               "path": "crates/spt-term/tests/rc_console_newline_presentation.rs",
2026-08-28T09:54:47.9330529Z               "line": 126
2026-08-28T09:54:47.9330788Z             },
2026-08-28T09:54:47.9331041Z             {
2026-08-28T09:54:47.9331563Z               "path": "crates/spt-term/tests/rc_console_newline_presentation.rs",
2026-08-28T09:54:47.9331828Z               "line": 143
2026-08-28T09:54:47.9332076Z             }
2026-08-28T09:54:47.9332319Z           ]
2026-08-28T09:54:47.9332571Z         },
2026-08-28T09:54:47.9332829Z         "unit": {
2026-08-28T09:54:47.9333106Z           "complete": true,
2026-08-28T09:54:47.9333387Z           "evidence": [
2026-08-28T09:54:47.9333646Z             {
2026-08-28T09:54:47.9334093Z               "path": "crates/spt-term/tests/capture_vehicle_fidelity.rs",
2026-08-28T09:54:47.9334359Z               "line": 175
2026-08-28T09:54:47.9334612Z             },
2026-08-28T09:54:47.9334867Z             {
2026-08-28T09:54:47.9335386Z               "path": "crates/spt-term/tests/rc_console_newline_presentation.rs",
2026-08-28T09:54:47.9335663Z               "line": 110
2026-08-28T09:54:47.9335916Z             },
2026-08-28T09:54:47.9336170Z             {
2026-08-28T09:54:47.9336484Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9336751Z               "line": 4051
2026-08-28T09:54:47.9337011Z             }
2026-08-28T09:54:47.9337262Z           ]
2026-08-28T09:54:47.9337520Z         }
2026-08-28T09:54:47.9337773Z       }
2026-08-28T09:54:47.9338093Z     },
2026-08-28T09:54:47.9338344Z     {
2026-08-28T09:54:47.9338707Z       "id": "REQ-RC-QUALIFIED-TARGET-CANONICAL",
2026-08-28T09:54:47.9346443Z       "title": "RC-RENDER-TRUTH W1 (ADR-0042 decision 4, hertz elevated-endpoints RCA core leg 2, doyle seam-confirmed rc.rs establish_attach): the resolver's canonical BARE endpoint id is carried separately from the user-facing qualified target — AttachRequest.endpoint_id is always the bare id (today rc passes the ORIGINAL qualified string; the target's resolve_local_session compares verbatim vs the bare HostedSession.endpoint, so `spt rc id@node`/`subnet:id` dials the RIGHT node then gets a false no-live-session refusal). N-1-additive: bare-form callers are unchanged. Gate: impl — canonical-id carry through establish_attach; unit — Address::parse qualified forms yield bare wire id, user-facing copy keeps the qualified spelling; int — bare + id@node + subnet:id ALL attach against a remote broker-hosted target, wire always carries the canonical bare id; doc — ADR-0042.",
2026-08-28T09:54:47.9346838Z       "requiredStages": [
2026-08-28T09:54:47.9347092Z         "doc",
2026-08-28T09:54:47.9347354Z         "impl",
2026-08-28T09:54:47.9347609Z         "unit",
2026-08-28T09:54:47.9347865Z         "int"
2026-08-28T09:54:47.9348123Z       ],
2026-08-28T09:54:47.9348385Z       "stages": {
2026-08-28T09:54:47.9348643Z         "doc": {
2026-08-28T09:54:47.9348929Z           "complete": true,
2026-08-28T09:54:47.9349297Z           "evidence": [
2026-08-28T09:54:47.9349553Z             {
2026-08-28T09:54:47.9349931Z               "path": "docs/adr/0042-rc-attach-truth.md",
2026-08-28T09:54:47.9350202Z               "line": 67
2026-08-28T09:54:47.9350462Z             }
2026-08-28T09:54:47.9350715Z           ]
2026-08-28T09:54:47.9350964Z         },
2026-08-28T09:54:47.9351221Z         "impl": {
2026-08-28T09:54:47.9351492Z           "complete": true,
2026-08-28T09:54:47.9351773Z           "evidence": [
2026-08-28T09:54:47.9352088Z             {
2026-08-28T09:54:47.9352408Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9352669Z               "line": 1291
2026-08-28T09:54:47.9352925Z             },
2026-08-28T09:54:47.9353178Z             {
2026-08-28T09:54:47.9353483Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9353755Z               "line": 1959
2026-08-28T09:54:47.9354011Z             },
2026-08-28T09:54:47.9354264Z             {
2026-08-28T09:54:47.9354565Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9354941Z               "line": 2350
2026-08-28T09:54:47.9355265Z             },
2026-08-28T09:54:47.9355527Z             {
2026-08-28T09:54:47.9355825Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9356102Z               "line": 2444
2026-08-28T09:54:47.9356369Z             },
2026-08-28T09:54:47.9356622Z             {
2026-08-28T09:54:47.9356956Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.9357227Z               "line": 241
2026-08-28T09:54:47.9357479Z             }
2026-08-28T09:54:47.9357727Z           ]
2026-08-28T09:54:47.9357986Z         },
2026-08-28T09:54:47.9358246Z         "int": {
2026-08-28T09:54:47.9358525Z           "complete": true,
2026-08-28T09:54:47.9358792Z           "evidence": [
2026-08-28T09:54:47.9359144Z             {
2026-08-28T09:54:47.9359454Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9359721Z               "line": 4516
2026-08-28T09:54:47.9359980Z             }
2026-08-28T09:54:47.9360228Z           ]
2026-08-28T09:54:47.9360481Z         },
2026-08-28T09:54:47.9360733Z         "unit": {
2026-08-28T09:54:47.9361008Z           "complete": true,
2026-08-28T09:54:47.9361280Z           "evidence": [
2026-08-28T09:54:47.9361528Z             {
2026-08-28T09:54:47.9361833Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9362101Z               "line": 3768
2026-08-28T09:54:47.9362358Z             },
2026-08-28T09:54:47.9362601Z             {
2026-08-28T09:54:47.9362939Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:47.9363291Z               "line": 2826
2026-08-28T09:54:47.9363542Z             }
2026-08-28T09:54:47.9363795Z           ]
2026-08-28T09:54:47.9364053Z         }
2026-08-28T09:54:47.9364305Z       }
2026-08-28T09:54:47.9364556Z     },
2026-08-28T09:54:47.9364810Z     {
2026-08-28T09:54:47.9365101Z       "id": "REQ-RC-RECONNECT",
2026-08-28T09:54:47.9381553Z       "title": "B-3 (REMOTE-TRUTH triage §B-3, the operator-asked UX): the rc attach viewport RECONNECTS on a severed transport instead of print-and-exit. Pre-fix rc was one-shot (resolve→dial→attach→pump→parting line); FAULT-MATRIX row 9 over-promised. FIX: the establish sequence (daemon ensure → broker conn → session resolve local-first/cross-node → dial → attach-open w/ A-4b tracing retry → subscribe) is factored into establish_attach and run_attach_inner wraps establish+pump in a loop. RECONNECTABLE class = severed transport ONLY: PumpEnd::BrokerGone (broker-conn EOF class, broker bounce) + the NEW PumpEnd::Severed (serve-side stream EOF AFTER rendered output = remote conn drop — pre-fix MISLABELED as 'detached — still running'; a nothing-rendered EOF stays the honest NoLiveSession refuse). FINAL ends (Exited/Detached/Displaced/Stalled/NoLiveSession) never re-drive — re-attaching a deliberately-ended session is wrong. On sever: full-screen centered 'Reconnecting to {target}…' banner (pure byte-emit like StatusRow; target = owning-node label or 'local daemon'; Q4 UX rule — operator language, internal sever detail never paints), then re-drive establish_attach every RECONNECT_PAUSE (1s) inside RECONNECT_WINDOW (30s, generous for a daemon bounce); a Detach keypress mid-window aborts honestly to [detached]; window expiry → PumpEnd::ReconnectGaveUp with a plain-language give-up line naming the cause, the window, and the retry action (never op/read-err lingo). Per re-establish: fresh OpMinter (ADR-0034 rc tracing per viewport), fresh initial resize (PTY matches the CURRENT terminal), pump-local render cursor resets so the re-serve ring replay REPAINTS the screen the banner cleared. FAULT-MATRIX row 9 made TRUE (F-3), not edited down. Red-first: serve-EOF-after-render → Severed (vs the pre-fix false Detached); only BrokerGone/Severed classify Reconnect.",
2026-08-28T09:54:47.9382072Z       "requiredStages": [
2026-08-28T09:54:47.9382320Z         "doc",
2026-08-28T09:54:47.9382582Z         "impl",
2026-08-28T09:54:47.9382839Z         "unit",
2026-08-28T09:54:47.9383096Z         "int"
2026-08-28T09:54:47.9383359Z       ],
2026-08-28T09:54:47.9383679Z       "stages": {
2026-08-28T09:54:47.9383936Z         "doc": {
2026-08-28T09:54:47.9384228Z           "complete": true,
2026-08-28T09:54:47.9384502Z           "evidence": [
2026-08-28T09:54:47.9384747Z             {
2026-08-28T09:54:47.9385077Z               "path": "docs/FAULT-MATRIX.md",
2026-08-28T09:54:47.9385339Z               "line": 28
2026-08-28T09:54:47.9385592Z             },
2026-08-28T09:54:47.9385840Z             {
2026-08-28T09:54:47.9386173Z               "path": "docs/TWO-HOST-RUNBOOK.md",
2026-08-28T09:54:47.9386493Z               "line": 249
2026-08-28T09:54:47.9386747Z             },
2026-08-28T09:54:47.9387000Z             {
2026-08-28T09:54:47.9387326Z               "path": "docs/TWO-HOST-RUNBOOK.md",
2026-08-28T09:54:47.9387595Z               "line": 298
2026-08-28T09:54:47.9387853Z             }
2026-08-28T09:54:47.9388102Z           ]
2026-08-28T09:54:47.9388355Z         },
2026-08-28T09:54:47.9388612Z         "impl": {
2026-08-28T09:54:47.9388893Z           "complete": true,
2026-08-28T09:54:47.9389251Z           "evidence": [
2026-08-28T09:54:47.9389503Z             {
2026-08-28T09:54:47.9389807Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9390110Z               "line": 2233
2026-08-28T09:54:47.9390368Z             },
2026-08-28T09:54:47.9390621Z             {
2026-08-28T09:54:47.9390931Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9391199Z               "line": 2281
2026-08-28T09:54:47.9391455Z             },
2026-08-28T09:54:47.9391774Z             {
2026-08-28T09:54:47.9392084Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9392356Z               "line": 2708
2026-08-28T09:54:47.9392613Z             },
2026-08-28T09:54:47.9392875Z             {
2026-08-28T09:54:47.9393181Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9393457Z               "line": 2736
2026-08-28T09:54:47.9393704Z             },
2026-08-28T09:54:47.9393971Z             {
2026-08-28T09:54:47.9394272Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9394543Z               "line": 2754
2026-08-28T09:54:47.9394853Z             },
2026-08-28T09:54:47.9395119Z             {
2026-08-28T09:54:47.9395447Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9395714Z               "line": 2767
2026-08-28T09:54:47.9395966Z             },
2026-08-28T09:54:47.9396223Z             {
2026-08-28T09:54:47.9396533Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9396791Z               "line": 2801
2026-08-28T09:54:47.9397053Z             },
2026-08-28T09:54:47.9397298Z             {
2026-08-28T09:54:47.9397608Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9397882Z               "line": 2808
2026-08-28T09:54:47.9398137Z             }
2026-08-28T09:54:47.9398394Z           ]
2026-08-28T09:54:47.9398652Z         },
2026-08-28T09:54:47.9398906Z         "int": {
2026-08-28T09:54:47.9399267Z           "complete": true,
2026-08-28T09:54:47.9399545Z           "evidence": [
2026-08-28T09:54:47.9399797Z             {
2026-08-28T09:54:47.9400112Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9400386Z               "line": 4171
2026-08-28T09:54:47.9400642Z             },
2026-08-28T09:54:47.9400905Z             {
2026-08-28T09:54:47.9401253Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:47.9401662Z               "line": 1280
2026-08-28T09:54:47.9402039Z             }
2026-08-28T09:54:47.9402450Z           ]
2026-08-28T09:54:47.9402732Z         },
2026-08-28T09:54:47.9403032Z         "unit": {
2026-08-28T09:54:47.9403344Z           "complete": true,
2026-08-28T09:54:47.9403640Z           "evidence": [
2026-08-28T09:54:47.9403921Z             {
2026-08-28T09:54:47.9404260Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9404565Z               "line": 4773
2026-08-28T09:54:47.9404846Z             },
2026-08-28T09:54:47.9405132Z             {
2026-08-28T09:54:47.9405460Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9405830Z               "line": 4799
2026-08-28T09:54:47.9406115Z             },
2026-08-28T09:54:47.9406393Z             {
2026-08-28T09:54:47.9406731Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9407027Z               "line": 4809
2026-08-28T09:54:47.9407303Z             },
2026-08-28T09:54:47.9407581Z             {
2026-08-28T09:54:47.9407910Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9408216Z               "line": 4819
2026-08-28T09:54:47.9408494Z             }
2026-08-28T09:54:47.9408779Z           ]
2026-08-28T09:54:47.9409146Z         }
2026-08-28T09:54:47.9409427Z       }
2026-08-28T09:54:47.9409703Z     },
2026-08-28T09:54:47.9409984Z     {
2026-08-28T09:54:47.9410319Z       "id": "REQ-RC-RECONNECT-TRUTH",
2026-08-28T09:54:47.9415207Z       "title": "W3 (LIFECYCLE-TRUTH): rc reconnect never auto-starts a daemon and never hangs forever. ROOTS rig-proven (the operator's long-standing 'stop 2-4 times' bug): (a) an rc client's reconnect loop AUTO-LAUNCHES a daemon via WMI (rig: DAEMON_LAUNCH_VIA_WMI from the rc) — resurrection fights the operator's stops; (b) rc freezes at 'Reconnecting to local daemon…' forever when its session died with the broker. FIX: rc NEVER auto-starts a daemon (reconnect only to an already-up broker; loud 'session lost — daemon down' exit otherwise), bounded reconnect with visible countdown.",
2026-08-28T09:54:47.9415536Z       "requiredStages": [
2026-08-28T09:54:47.9415817Z         "impl",
2026-08-28T09:54:47.9416092Z         "unit",
2026-08-28T09:54:47.9416447Z         "int"
2026-08-28T09:54:47.9416728Z       ],
2026-08-28T09:54:47.9417028Z       "stages": {
2026-08-28T09:54:47.9417310Z         "doc": {
2026-08-28T09:54:47.9417630Z           "complete": false,
2026-08-28T09:54:47.9417926Z           "evidence": []
2026-08-28T09:54:47.9418207Z         },
2026-08-28T09:54:47.9418489Z         "impl": {
2026-08-28T09:54:47.9418794Z           "complete": true,
2026-08-28T09:54:47.9419172Z           "evidence": [
2026-08-28T09:54:47.9419478Z             {
2026-08-28T09:54:47.9419816Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9420177Z               "line": 2123
2026-08-28T09:54:47.9420459Z             },
2026-08-28T09:54:47.9420740Z             {
2026-08-28T09:54:47.9421074Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9421365Z               "line": 2254
2026-08-28T09:54:47.9421645Z             },
2026-08-28T09:54:47.9421924Z             {
2026-08-28T09:54:47.9422264Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9422569Z               "line": 2314
2026-08-28T09:54:47.9422845Z             },
2026-08-28T09:54:47.9423126Z             {
2026-08-28T09:54:47.9423459Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9423746Z               "line": 2717
2026-08-28T09:54:47.9424027Z             },
2026-08-28T09:54:47.9424307Z             {
2026-08-28T09:54:47.9424646Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9424946Z               "line": 2808
2026-08-28T09:54:47.9425233Z             }
2026-08-28T09:54:47.9425509Z           ]
2026-08-28T09:54:47.9425786Z         },
2026-08-28T09:54:47.9426068Z         "int": {
2026-08-28T09:54:47.9426377Z           "complete": true,
2026-08-28T09:54:47.9426676Z           "evidence": [
2026-08-28T09:54:47.9426954Z             {
2026-08-28T09:54:47.9427283Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9427579Z               "line": 4927
2026-08-28T09:54:47.9427937Z             }
2026-08-28T09:54:47.9428214Z           ]
2026-08-28T09:54:47.9428490Z         },
2026-08-28T09:54:47.9428776Z         "unit": {
2026-08-28T09:54:47.9429172Z           "complete": true,
2026-08-28T09:54:47.9429476Z           "evidence": [
2026-08-28T09:54:47.9429756Z             {
2026-08-28T09:54:47.9430089Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9430385Z               "line": 4836
2026-08-28T09:54:47.9430671Z             },
2026-08-28T09:54:47.9430948Z             {
2026-08-28T09:54:47.9431282Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9431639Z               "line": 4853
2026-08-28T09:54:47.9432355Z             },
2026-08-28T09:54:47.9432628Z             {
2026-08-28T09:54:47.9432966Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9433262Z               "line": 4886
2026-08-28T09:54:47.9433542Z             }
2026-08-28T09:54:47.9433830Z           ]
2026-08-28T09:54:47.9434102Z         }
2026-08-28T09:54:47.9434392Z       }
2026-08-28T09:54:47.9434669Z     },
2026-08-28T09:54:47.9434953Z     {
2026-08-28T09:54:47.9435310Z       "id": "REQ-RC-RESIZE-GEOMETRY-EPOCH",
2026-08-28T09:54:47.9493140Z       "title": "A resize transition is ATOMIC from ScreenGrid's perspective: every byte is parsed at the geometry it was EMITTED under. (hertz v0.39.0 field RCA 2026-07-21, doyle re-grounded at source the same hour; P0 — this falsifies a SHIPPED v0.39.0 release claim, so it is a regression, not new scope.) SYMPTOM: right-margin fragments and left-shifted rows on a node where CLI and broker are BOTH 0.39.0 — i.e. exactly the defect the v0.39.0 notes claim fixed. SOURCE (statically provable, no repro box required): broker.rs dispatch_resize calls session.resize(SurfaceSize::new(rows, cols)) (~4557-4559) and only THEN recover_log(&log).set_size_and_notify(rows, cols) (~4560), which reaches self.grid.resize(rows, cols) (~1492) — TWO SEPARATE recover_log acquisitions, so the reader thread's append/parse interleaves between them BY CONSTRUCTION. On ConPTY the resize ITSELF emits a full repaint asynchronously; the reader parses that repaint into the grid at the OLD geometry; the subsequent top-left-preserving grid.resize then faithfully preserves an ALREADY-MISWRAPPED model; the cold attach repaint emits the shift. WHY THE EXISTING TESTS PASS: the spt-term width oracle (REQ-SCREENGRID-WIDTH's int stage) is green 5/5 while the field is red — it never crosses the ConPTY-emission -> grid-geometry -> attach-repaint seam, and the surface mock structurally cannot. The W3 width model is therefore NOT falsified; it is correct work running under a broken geometry transition. FIX — and the record must carry WHY the obvious fix is wrong: merely REORDERING (set grid geometry before invoking the ConPTY resize) is INSUFFICIENT. It is safe on a GROW and unsafe on a SHRINK, because bytes already in flight at the old WIDER geometry are then parsed at the new narrow width and wrap early. Neither pure ordering is correct because the defect is not the ORDER — it is that the grid has no notion of 'these bytes were emitted under the old geometry'. Required shape: quiesce/gate the drain across the ordered surface+grid transition AND carry an explicit geometry EPOCH so parse always reckons at the emitting geometry, with rollback/refetch of the grid geometry if the surface resize fails. Gate: doc — the epoch/barrier contract stated where the resize path is documented, including the shrink counter-example so the insufficient reorder is not re-proposed; impl — barrier + geometry epoch + failure rollback in the dispatch_resize/set_size_and_notify path; unit — a resize whose repaint bytes arrive mid-transition is parsed at the emitting geometry (both grow AND shrink), and a failed surface resize leaves the grid geometry unchanged; int — Windows REAL ConPTY (not the surface mock): resize emits a dense frame, then the synthesized attach repaint is compared against an INDEPENDENT terminal authority, never ScreenGrid against itself. FIXTURE AMENDMENT (hertz field supplement 2026-07-21 second capture, doyle-accepted, carried by todlando at build): the dense frame is ordinary readable PROSE with REPEATED WORDS and punctuation, not sparse synthetic markers — the field captures are semantic corruption of rendered content (`ReQ2`, `ROADMAPnsayh'credertigls`, `Recommend:gdirect REST`, `thii reqw st`, `resdluuion`: clobber, merge, substitution and displacement of width-1 cells MID-ROW), and repeated words are what make a displaced fragment land somewhere that still looks plausible — the shape that let this read as cosmetic. The leg must fail on DELETION, INSERTION, SUBSTITUTION, MERGE or DISPLACEMENT of any width-1 cell, with NO normalization and NO presence-only assertions (full-row untrimmed string equality plus equal row counts satisfies this by construction). CONSTRAINT, binding: the fixture stays inside the region where the authority emulator and ConPTY AGREE — the screen at the resize instant carries no line reaching either margin and loses no row, so reflow-vs-truncate is a no-op on it, and the wrap-crossing prose is emitted AFTER the transition opens, at the new geometry. A fixture crossing the margin at the resize instant would red on emulator POLICY DIVERGENCE rather than on this defect; pinning the wrap policy between authority and ConPTY is separate work and must not be smuggled in here. The comparison is EVERY CELL, including cells expected to be BLANK — not row starts, right margins, or text presence. The dense frame must include erased interior spans and repeated spaces, and those cells must still be blank after the synthesized repaint. (hertz field supplement 2026-07-21, doyle-accepted: the operator confirmed a THIRD corruption shape on the same fully-0.39.0 node — stale characters surviving INSIDE nominal whitespace between words, e.g. `isnsettled`, `fulllyacaptured`. A mis-widthed repaint places glyphs into wrong interior cells; later differential output and EL operations address the CORRECT geometry and so do not necessarily clear them; the synthesized cold repaint then faithfully re-emits the contaminated interior. Accepted as further evidence for THIS requirement, not a new root, on a DISCRIMINATION rather than the prediction: the captured debris is pure ASCII, every glyph width-1, so no width-table or wide-half defect can produce it — and the erase paths are already width-normalized on both halves at screen.rs clear_cell_keep_pen ~416/~420, the span helper ~440-443, and delete/insert_chars ~617-620, with erase_across_a_wide_half_leaves_no_orphan ~1391 passing. Word-scale `isn`+`settled` collapsing across a space is the same shifted-by-N placement as the whole-row left shift, observed at word scale. OPEN DISCRIMINATOR: interior debris in a session where NO resize occurred at any point would mean a SECOND root that this fix will not clear.) BINDING CONSTRAINT on satisfying the blank-cell assertions: NO whitespace special-casing and NO extra clears — the barrier must restore ONE geometry authority for glyph placement AND erasure. A fix that passes by clearing harder satisfies the test and leaves the defect. KNOWN ACCEPTED RESIDUAL (doyle ruling 2026-07-21): a cold attach landing DURING a transition renders the PRE-TRANSITION screen — the held bytes are not parsed yet. Accepted because it is a strict improvement over the shipped behavior on the same input (pre-fix: miswrapped/corrupt; post-fix: stale but coherent). The window is bounded in TIME (settle + one surface call) AND — since REQ-RC-RESIZE-PRESENTATION-BARRIER (built 2026-07-21) — in VISIBILITY: the commit/abort-time sync frame delivers every attached sink, transition-era attachers included, the fresh repaint the moment the barrier tears down, quiet child or not (the successor REQ's commit-time sync frame IS the follow-up seed this residual carried, absorbed by construction). The attach itself still renders the pre-transition screen for the width of the window. REFUSED, so nobody builds it later without a fresh argument: making the attach repaint WAIT on an in-flight transition — that puts a user-facing attach behind the settle cap / serialize wait.",
2026-08-28T09:54:47.9494108Z       "requiredStages": [
2026-08-28T09:54:47.9494370Z         "doc",
2026-08-28T09:54:47.9494629Z         "impl",
2026-08-28T09:54:47.9494891Z         "unit",
2026-08-28T09:54:47.9495148Z         "int"
2026-08-28T09:54:47.9495399Z       ],
2026-08-28T09:54:47.9495678Z       "stages": {
2026-08-28T09:54:47.9495932Z         "doc": {
2026-08-28T09:54:47.9496222Z           "complete": true,
2026-08-28T09:54:47.9496485Z           "evidence": [
2026-08-28T09:54:47.9496741Z             {
2026-08-28T09:54:47.9497328Z               "path": "docs/adr/0031-server-side-screen-grid-render-repaint.md",
2026-08-28T09:54:47.9497605Z               "line": 34
2026-08-28T09:54:47.9497862Z             }
2026-08-28T09:54:47.9498112Z           ]
2026-08-28T09:54:47.9498367Z         },
2026-08-28T09:54:47.9498624Z         "impl": {
2026-08-28T09:54:47.9498905Z           "complete": true,
2026-08-28T09:54:47.9499258Z           "evidence": [
2026-08-28T09:54:47.9499530Z             {
2026-08-28T09:54:47.9499897Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9500169Z               "line": 1107
2026-08-28T09:54:47.9500426Z             },
2026-08-28T09:54:47.9500678Z             {
2026-08-28T09:54:47.9501039Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9501306Z               "line": 1136
2026-08-28T09:54:47.9501563Z             },
2026-08-28T09:54:47.9501815Z             {
2026-08-28T09:54:47.9502187Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9502464Z               "line": 1185
2026-08-28T09:54:47.9502716Z             },
2026-08-28T09:54:47.9502970Z             {
2026-08-28T09:54:47.9503331Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9503602Z               "line": 1198
2026-08-28T09:54:47.9503853Z             },
2026-08-28T09:54:47.9504110Z             {
2026-08-28T09:54:47.9504469Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9504745Z               "line": 1429
2026-08-28T09:54:47.9505074Z             },
2026-08-28T09:54:47.9505321Z             {
2026-08-28T09:54:47.9505689Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9505955Z               "line": 3090
2026-08-28T09:54:47.9506215Z             },
2026-08-28T09:54:47.9506463Z             {
2026-08-28T09:54:47.9506830Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9507107Z               "line": 3113
2026-08-28T09:54:47.9507364Z             },
2026-08-28T09:54:47.9507621Z             {
2026-08-28T09:54:47.9507980Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9508314Z               "line": 3128
2026-08-28T09:54:47.9508571Z             },
2026-08-28T09:54:47.9508827Z             {
2026-08-28T09:54:47.9509289Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9509561Z               "line": 3161
2026-08-28T09:54:47.9509823Z             },
2026-08-28T09:54:47.9510076Z             {
2026-08-28T09:54:47.9510452Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9510724Z               "line": 3252
2026-08-28T09:54:47.9510977Z             },
2026-08-28T09:54:47.9511224Z             {
2026-08-28T09:54:47.9511590Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9511861Z               "line": 8662
2026-08-28T09:54:47.9512118Z             },
2026-08-28T09:54:47.9512375Z             {
2026-08-28T09:54:47.9512743Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:47.9513015Z               "line": 73
2026-08-28T09:54:47.9513267Z             }
2026-08-28T09:54:47.9513525Z           ]
2026-08-28T09:54:47.9513779Z         },
2026-08-28T09:54:47.9514029Z         "int": {
2026-08-28T09:54:47.9514303Z           "complete": true,
2026-08-28T09:54:47.9514571Z           "evidence": [
2026-08-28T09:54:47.9514824Z             {
2026-08-28T09:54:47.9515290Z               "path": "crates/spt-daemon/tests/resize_geometry_epoch.rs",
2026-08-28T09:54:47.9515634Z               "line": 340
2026-08-28T09:54:47.9515887Z             },
2026-08-28T09:54:47.9516144Z             {
2026-08-28T09:54:47.9516600Z               "path": "crates/spt-daemon/tests/resize_geometry_epoch.rs",
2026-08-28T09:54:47.9516874Z               "line": 350
2026-08-28T09:54:47.9517128Z             }
2026-08-28T09:54:47.9517385Z           ]
2026-08-28T09:54:47.9517648Z         },
2026-08-28T09:54:47.9517901Z         "unit": {
2026-08-28T09:54:47.9518191Z           "complete": true,
2026-08-28T09:54:47.9518515Z           "evidence": [
2026-08-28T09:54:47.9518772Z             {
2026-08-28T09:54:47.9519212Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9519501Z               "line": 10656
2026-08-28T09:54:47.9519754Z             },
2026-08-28T09:54:47.9520011Z             {
2026-08-28T09:54:47.9520383Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9520660Z               "line": 10698
2026-08-28T09:54:47.9520917Z             },
2026-08-28T09:54:47.9521176Z             {
2026-08-28T09:54:47.9521528Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9521803Z               "line": 10723
2026-08-28T09:54:47.9522058Z             },
2026-08-28T09:54:47.9522311Z             {
2026-08-28T09:54:47.9522668Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9522945Z               "line": 10746
2026-08-28T09:54:47.9523207Z             }
2026-08-28T09:54:47.9523460Z           ]
2026-08-28T09:54:47.9523719Z         }
2026-08-28T09:54:47.9523976Z       }
2026-08-28T09:54:47.9524223Z     },
2026-08-28T09:54:47.9524480Z     {
2026-08-28T09:54:47.9524844Z       "id": "REQ-RC-RESIZE-PRESENTATION-BARRIER",
2026-08-28T09:54:47.9591735Z       "title": "During a resize transition, LIVE DELIVERY is barriered along with the grid parse: no attached sink (controller or viewer) ever receives mixed-geometry raw bytes; commit substitutes ONE synthesized sync frame at the target geometry. (hertz post-fix field RCA 2026-07-21 on a fully-0.39.3 node, doyle-accepted with every cite verified at source; SUCCEEDS REQ-RC-RESIZE-GEOMETRY-EPOCH, which shipped correct but scoped to the wrong surface — broker.rs's own ResizeTransition doc states append 'still rings + fans out every chunk exactly as before' during a transition, and OutputLog::append gates ONLY grid.advance. A live attached terminal therefore receives old+new-geometry differentials across an already-resized viewport; the cold-attach repaint model is definitionally blind to that path, which is why the shipped gate was green while the field was red. REQUIREMENT-SCOPE defect: the gate held against documented design.) CONTRACT (ADR-0031 Amendment II): (1) append still assigns seq and rings every chunk, but controller handoff and viewer fan-out are SUPPRESSED during the transition — a skip, never a block or sleep (KH 7.12 intact), and the suppressed window does not count toward the controller Full-eviction deadline; (2) commit replays held segments at their emitting geometry (the geometry-epoch machinery, unchanged), lands the grid at target geometry, then UNDER THE SAME OutputLog LOCK ACQUISITION pushes viewers the size frame FIRST and then one synthesized sync frame (render_repaint at target geometry ++ deferred non-grid bytes) to EVERY attached sink, controller included, before raw fan-out resumes — no raw frame may interleave; (3) the controller sync frame carries watermark seq = highest suppressed seq, so the cursor-of-record advances past the whole suppressed range as-if-written (repaint supersedes; the repaint_initial watermark shape); WIRE-FLAG AMENDMENT (doyle ruling 2026-07-21, from the build's real-wire int finding — the watermark jump would otherwise fatal every STRICT consumer as an output gap and ladder into ControllerIrrecoverablyBehind = marked truncation on every resize under a live controller): OutputEvent gains additive `sync: bool` (serde default false, never serialized when false — the resume_seq D4-1 additive shape), set by the broker on the commit AND abort sync frames AND on every repaint_initial batch; a consumer accepts a FLAGGED FORWARD jump and baselines on it on BOTH dedup paths (the supersession is explicit and broker-authored — B2-sound, nothing silently skipped); FORWARD-ONLY, binding: a flagged frame at/below the cursor dedup-drops exactly as today, never a backward baseline; an UNFLAGGED jump keeps strict reject-gap byte-for-byte; baseline_next_output STAYS as the old-broker x new-client cold-attach compat path (retirement is an N-2 seed at most); N-1 matrix published: new broker x old client = a resize in the mixed-version window ends the attach with a marked truncation (honest termination, strictly better than the pre-fix silent corruption; release notes carry 'update CLI and broker together'), old broker x new client = no flag arrives, strict paths byte-identical (unit-pinned as the N-1 leg); REJECTED shapes recorded in ADR-0031 Amendment II so none is re-proposed: unconditional baseline-on-jump, empty-frame delivery through the window, seq rebase, cold-reattach-on-second-gap; (4) abort takes the same uniform path minus the size frame, at the old geometry; (5) the log records the presentation floor (seq after last commit/abort) and a resume-from-floor asking BELOW it is served the cold-attach shape (sync repaint + skip to live), never a raw replay across the boundary — at-least-once preserved in effect because the repaint supersedes the skipped range. NON-GRID BYTE DISPOSITION (enumerated at triage, every class ruled): tracked-by-grid state (title OSC 0/2, alt screen 47/1047/1049, DECTCEM 25, DECSTBM, pen, cursor) = SUPERSEDED by the repaint by construction, unit-pinned per class; untracked STATEFUL sequences (bracketed paste 2004, mouse 9/1000/1002/1003 + encodings 1005/1006/1015, focus 1004, DECCKM 1, DECAWM 7, keypad ESC=/ESC>, DECSCUSR, OSC color 4/10/11/12/104/110/111/112, charset designation), ONE-SHOT events (BEL, OSC 52 clipboard, OSC 9/777 notifications) and child->client QUERIES (DA1/DA2, DECRQM, XTWINOPS, OSC 10/11 '?') = DEFERRED verbatim in emission order, flushed inside the sync frame (a dropped toggle is indefinite divergence, a dropped query can hang a waiting child; a deferred one is bounded-window latency); cell-scoped decorations the grid does not carry (OSC 8 hyperlinks, DCS graphics) = DROPPED as a balanced class (content superseded by the repaint; an unbalanced deferred open would decorate unrelated post-repaint text; matches the repaint's existing fidelity boundary). DSR is in NO class: the drain strips + answers it pre-append (REQ-DSR-SINGLE-CPR); its mid-transition CPR reports the pre-transition cursor — accepted bounded residual, recorded not built-around. MECHANISM CONSTRAINT, binding: classification runs in the ONE parser authority — ScreenGrid's vte::Perform in a capture mode during held-byte replay, re-encoding unconsumed sequences from callback parameters; NEVER a second scanner over raw bytes (two parsers = two truths about sequence boundaries). SIDE EFFECT, must be recorded when built: the commit-time sync frame IS the seeded 'push a fresh repaint to transition-era attachers' follow-up — the cold-attach-during-transition residual's 'not bounded in VISIBILITY' caveat dies (the stale window now ends at commit); update the KNOWN ACCEPTED RESIDUAL text at repaint_initial and in REQ-RC-RESIZE-GEOMETRY-EPOCH accordingly. RESIZE_HOLD_CAP overflow now also means suppressed-never-delivered bytes: the sync repaint after a partial parse leaves client and grid sharing the same self-healing partial view — strictly more consistent than shipped; keep the overflow loud. BINDING CONSTRAINTS CARRIED FORWARD from the predecessor: NO whitespace special-casing, NO extra clears (one geometry authority for placement AND erasure — a fix that passes by clearing harder fails gate); fixture rules verbatim (readable prose, repeated words, every cell incl. expected-blank interiors, full-row untrimmed equality, no reflow-crossing at the resize instant). FENCED SEPARATE, do not build in this wave: the heuristic epoch-split strengthening (mark_resize_issued precedes session.resize; the 20ms-quiet/250ms-cap split is a heuristic, RESIZE_SETTLE_CAP admits old-geometry bytes may land in the new epoch) — only if the field stays red after the fanout repair. Gate: doc — ADR-0031 Amendment II states the presentation contract incl. the byte-class disposition table; impl — suppression + commit-time sync frame + watermark cursor advance + presentation floor in OutputLog/append/commit_resize/abort_resize; unit — per-class disposition pins (a title change, cursor-visibility toggle, DECSTBM change, alt-screen switch, AND a bracketed-paste/mouse toggle inside the suppressed window each surface in or after the sync frame; a hyperlink pair does not), the watermark advance (a resumed controller never re-receives a suppressed seq), the eviction-deadline exemption, the abort path, AND the wire-flag matrix (flagged-forward accepted + baselined on both dedup paths; flagged-backward dedup-dropped unchanged; unflagged-forward strict reject-gap byte-for-byte; old-broker wire without the key defaults false and a cold attach still baselines via baseline_next_output); int — the REAL live controller writer driven across a transition: an attached controller whose socket feed is parsed by an independent terminal authority at the CLIENT TARGET geometry, full untrimmed row equality every row after the sync frame, every cell incl. blanks; a viewer leg asserting size-frame-before-sync-frame and zero raw frames between commit and sync; a resume-across-resize leg (controller detaches pre-resize, resumes post-commit, receives zero mixed-geometry raw bytes and lands exact at target geometry). The cold-attach oracle is insufficient by construction and does not satisfy the int stage.",
2026-08-28T09:54:47.9592742Z       "requiredStages": [
2026-08-28T09:54:47.9593004Z         "doc",
2026-08-28T09:54:47.9593270Z         "impl",
2026-08-28T09:54:47.9593523Z         "unit",
2026-08-28T09:54:47.9593785Z         "int"
2026-08-28T09:54:47.9594047Z       ],
2026-08-28T09:54:47.9594313Z       "stages": {
2026-08-28T09:54:47.9594633Z         "doc": {
2026-08-28T09:54:47.9594919Z           "complete": true,
2026-08-28T09:54:47.9595200Z           "evidence": [
2026-08-28T09:54:47.9595449Z             {
2026-08-28T09:54:47.9595989Z               "path": "docs/adr/0031-server-side-screen-grid-render-repaint.md",
2026-08-28T09:54:47.9596255Z               "line": 89
2026-08-28T09:54:47.9596513Z             }
2026-08-28T09:54:47.9596767Z           ]
2026-08-28T09:54:47.9597033Z         },
2026-08-28T09:54:47.9597296Z         "impl": {
2026-08-28T09:54:47.9597578Z           "complete": true,
2026-08-28T09:54:47.9597893Z           "evidence": [
2026-08-28T09:54:47.9598144Z             {
2026-08-28T09:54:47.9598500Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.9598780Z               "line": 1110
2026-08-28T09:54:47.9599118Z             },
2026-08-28T09:54:47.9599366Z             {
2026-08-28T09:54:47.9599728Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9600005Z               "line": 780
2026-08-28T09:54:47.9600258Z             },
2026-08-28T09:54:47.9600516Z             {
2026-08-28T09:54:47.9600874Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9601149Z               "line": 1256
2026-08-28T09:54:47.9601408Z             },
2026-08-28T09:54:47.9601665Z             {
2026-08-28T09:54:47.9602023Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9602300Z               "line": 1385
2026-08-28T09:54:47.9602543Z             },
2026-08-28T09:54:47.9602801Z             {
2026-08-28T09:54:47.9603173Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9603445Z               "line": 3129
2026-08-28T09:54:47.9603699Z             },
2026-08-28T09:54:47.9603949Z             {
2026-08-28T09:54:47.9604321Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9604592Z               "line": 3162
2026-08-28T09:54:47.9604907Z             },
2026-08-28T09:54:47.9605164Z             {
2026-08-28T09:54:47.9605527Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9605804Z               "line": 3210
2026-08-28T09:54:47.9606056Z             },
2026-08-28T09:54:47.9606318Z             {
2026-08-28T09:54:47.9606679Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9606955Z               "line": 3253
2026-08-28T09:54:47.9607218Z             },
2026-08-28T09:54:47.9607469Z             {
2026-08-28T09:54:47.9607828Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9608157Z               "line": 3857
2026-08-28T09:54:47.9608414Z             },
2026-08-28T09:54:47.9608666Z             {
2026-08-28T09:54:47.9609104Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.9609372Z               "line": 1730
2026-08-28T09:54:47.9609630Z             },
2026-08-28T09:54:47.9614196Z             {
2026-08-28T09:54:47.9614610Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9614896Z               "line": 255
2026-08-28T09:54:47.9615148Z             },
2026-08-28T09:54:47.9615401Z             {
2026-08-28T09:54:47.9615753Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9616026Z               "line": 848
2026-08-28T09:54:47.9616292Z             },
2026-08-28T09:54:47.9616546Z             {
2026-08-28T09:54:47.9616896Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9617162Z               "line": 863
2026-08-28T09:54:47.9617419Z             },
2026-08-28T09:54:47.9617662Z             {
2026-08-28T09:54:47.9618005Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9618282Z               "line": 902
2026-08-28T09:54:47.9618540Z             },
2026-08-28T09:54:47.9618793Z             {
2026-08-28T09:54:47.9619236Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9619516Z               "line": 920
2026-08-28T09:54:47.9619768Z             },
2026-08-28T09:54:47.9620024Z             {
2026-08-28T09:54:47.9620468Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9620739Z               "line": 1137
2026-08-28T09:54:47.9620993Z             },
2026-08-28T09:54:47.9621250Z             {
2026-08-28T09:54:47.9621594Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9621865Z               "line": 1201
2026-08-28T09:54:47.9622126Z             },
2026-08-28T09:54:47.9622381Z             {
2026-08-28T09:54:47.9622719Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9622987Z               "line": 1230
2026-08-28T09:54:47.9623302Z             },
2026-08-28T09:54:47.9623550Z             {
2026-08-28T09:54:47.9623902Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9624170Z               "line": 1246
2026-08-28T09:54:47.9624417Z             },
2026-08-28T09:54:47.9624670Z             {
2026-08-28T09:54:47.9625012Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9625289Z               "line": 1269
2026-08-28T09:54:47.9625537Z             },
2026-08-28T09:54:47.9625790Z             {
2026-08-28T09:54:47.9626142Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9626415Z               "line": 1308
2026-08-28T09:54:47.9626677Z             }
2026-08-28T09:54:47.9626924Z           ]
2026-08-28T09:54:47.9627177Z         },
2026-08-28T09:54:47.9627438Z         "int": {
2026-08-28T09:54:47.9627722Z           "complete": true,
2026-08-28T09:54:47.9627989Z           "evidence": [
2026-08-28T09:54:47.9628246Z             {
2026-08-28T09:54:47.9628766Z               "path": "crates/spt-daemon/tests/resize_presentation_barrier.rs",
2026-08-28T09:54:47.9629133Z               "line": 258
2026-08-28T09:54:47.9629386Z             },
2026-08-28T09:54:47.9629635Z             {
2026-08-28T09:54:47.9630148Z               "path": "crates/spt-daemon/tests/resize_presentation_barrier.rs",
2026-08-28T09:54:47.9630489Z               "line": 390
2026-08-28T09:54:47.9630746Z             }
2026-08-28T09:54:47.9631000Z           ]
2026-08-28T09:54:47.9631262Z         },
2026-08-28T09:54:47.9631524Z         "unit": {
2026-08-28T09:54:47.9631805Z           "complete": true,
2026-08-28T09:54:47.9632086Z           "evidence": [
2026-08-28T09:54:47.9632329Z             {
2026-08-28T09:54:47.9632681Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.9632941Z               "line": 2824
2026-08-28T09:54:47.9633190Z             },
2026-08-28T09:54:47.9633437Z             {
2026-08-28T09:54:47.9633847Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.9634125Z               "line": 2902
2026-08-28T09:54:47.9634372Z             },
2026-08-28T09:54:47.9634629Z             {
2026-08-28T09:54:47.9634992Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9635273Z               "line": 10778
2026-08-28T09:54:47.9635525Z             },
2026-08-28T09:54:47.9635788Z             {
2026-08-28T09:54:47.9636145Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9636426Z               "line": 10875
2026-08-28T09:54:47.9636679Z             },
2026-08-28T09:54:47.9636936Z             {
2026-08-28T09:54:47.9637305Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9637575Z               "line": 10938
2026-08-28T09:54:47.9637836Z             },
2026-08-28T09:54:47.9638092Z             {
2026-08-28T09:54:47.9638449Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9638726Z               "line": 10974
2026-08-28T09:54:47.9639049Z             },
2026-08-28T09:54:47.9639312Z             {
2026-08-28T09:54:47.9639665Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9639937Z               "line": 10997
2026-08-28T09:54:47.9640190Z             },
2026-08-28T09:54:47.9640448Z             {
2026-08-28T09:54:47.9640799Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9641077Z               "line": 11028
2026-08-28T09:54:47.9641426Z             },
2026-08-28T09:54:47.9641678Z             {
2026-08-28T09:54:47.9642041Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9642307Z               "line": 11093
2026-08-28T09:54:47.9642580Z             },
2026-08-28T09:54:47.9642828Z             {
2026-08-28T09:54:47.9643185Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9643465Z               "line": 11133
2026-08-28T09:54:47.9643764Z             },
2026-08-28T09:54:47.9644017Z             {
2026-08-28T09:54:47.9644375Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9644704Z               "line": 11188
2026-08-28T09:54:47.9644952Z             },
2026-08-28T09:54:47.9645209Z             {
2026-08-28T09:54:47.9645542Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.9645867Z               "line": 2140
2026-08-28T09:54:47.9646118Z             },
2026-08-28T09:54:47.9646381Z             {
2026-08-28T09:54:47.9646737Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9647006Z               "line": 1658
2026-08-28T09:54:47.9647263Z             },
2026-08-28T09:54:47.9647516Z             {
2026-08-28T09:54:47.9647860Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9648121Z               "line": 1692
2026-08-28T09:54:47.9648372Z             },
2026-08-28T09:54:47.9648623Z             {
2026-08-28T09:54:47.9649046Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9649328Z               "line": 1713
2026-08-28T09:54:47.9649581Z             },
2026-08-28T09:54:47.9649829Z             {
2026-08-28T09:54:47.9650172Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9650445Z               "line": 1732
2026-08-28T09:54:47.9650698Z             },
2026-08-28T09:54:47.9650954Z             {
2026-08-28T09:54:47.9651301Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9651628Z               "line": 1748
2026-08-28T09:54:47.9651890Z             },
2026-08-28T09:54:47.9652134Z             {
2026-08-28T09:54:47.9652482Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9652849Z               "line": 1765
2026-08-28T09:54:47.9653236Z             },
2026-08-28T09:54:47.9653560Z             {
2026-08-28T09:54:47.9653916Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:47.9654190Z               "line": 1777
2026-08-28T09:54:47.9654442Z             }
2026-08-28T09:54:47.9654786Z           ]
2026-08-28T09:54:47.9655035Z         }
2026-08-28T09:54:47.9655297Z       }
2026-08-28T09:54:47.9655541Z     },
2026-08-28T09:54:47.9655802Z     {
2026-08-28T09:54:47.9656117Z       "id": "REQ-RC-SINGLE-PUMP-BRAIN",
2026-08-28T09:54:47.9666906Z       "title": "RC-RENDER-TRUTH v0.38.1 fast-follow leg 2 (hertz v0.38.0 field repro 2, hertz RCA confirmed + doyle-accepted): plain `spt rc` constructs EXACTLY ONE pump Brain — the W1 truth probe (SessionProbe::connect, rc.rs ~1388/981-987, KIND_SESSIONS then drop) and establish_attach (~1464/1632) each build a real pump Brain today = two transient IPC reader threads/conns + a doubled user-visible 'PUMP_IPC_READER: spawned' banner per invocation (brain.rs:254 emits once per BrainConn::split_with_reader via cold_start_pump — the log site is NOT duplicated). FIX (hertz seam, ratified): carry the SessionProbe's Brain INTO establish_attach and re-query sessions on that same conn for freshness — do NOT suppress the log line and do NOT switch to Whole (the banner is truthful; the double construction is the defect). Qualified/session-confirmed paths (which skip the probe) and the reconnect loop (one fresh pump per attempt, correct) unchanged. Gate: impl — probe-Brain carry + same-conn freshness re-query; unit — probe-then-establish reuses the conn (construction-count observable); int — rc_attach_truth offline_row_over_live_session_attaches extended: capture stderr, assert PUMP_IPC_READER spawned count == 1 PLUS existing behavior assertions; doc — none (internal seam).",
2026-08-28T09:54:47.9667314Z       "requiredStages": [
2026-08-28T09:54:47.9667576Z         "impl",
2026-08-28T09:54:47.9667835Z         "unit",
2026-08-28T09:54:47.9668078Z         "int"
2026-08-28T09:54:47.9668331Z       ],
2026-08-28T09:54:47.9668578Z       "stages": {
2026-08-28T09:54:47.9668831Z         "doc": {
2026-08-28T09:54:47.9669222Z           "complete": false,
2026-08-28T09:54:47.9669516Z           "evidence": []
2026-08-28T09:54:47.9669767Z         },
2026-08-28T09:54:47.9670040Z         "impl": {
2026-08-28T09:54:47.9670325Z           "complete": true,
2026-08-28T09:54:47.9670668Z           "evidence": [
2026-08-28T09:54:47.9670922Z             {
2026-08-28T09:54:47.9671237Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9671518Z               "line": 1016
2026-08-28T09:54:47.9671774Z             },
2026-08-28T09:54:47.9672027Z             {
2026-08-28T09:54:47.9672341Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9672624Z               "line": 2287
2026-08-28T09:54:47.9672892Z             }
2026-08-28T09:54:47.9673150Z           ]
2026-08-28T09:54:47.9673402Z         },
2026-08-28T09:54:47.9673659Z         "int": {
2026-08-28T09:54:47.9673940Z           "complete": true,
2026-08-28T09:54:47.9674212Z           "evidence": [
2026-08-28T09:54:47.9674475Z             {
2026-08-28T09:54:47.9674842Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:47.9675112Z               "line": 279
2026-08-28T09:54:47.9675373Z             }
2026-08-28T09:54:47.9675625Z           ]
2026-08-28T09:54:47.9675883Z         },
2026-08-28T09:54:47.9676131Z         "unit": {
2026-08-28T09:54:47.9676417Z           "complete": true,
2026-08-28T09:54:47.9676680Z           "evidence": [
2026-08-28T09:54:47.9676932Z             {
2026-08-28T09:54:47.9677242Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9677513Z               "line": 4394
2026-08-28T09:54:47.9677831Z             }
2026-08-28T09:54:47.9678080Z           ]
2026-08-28T09:54:47.9678342Z         }
2026-08-28T09:54:47.9678591Z       }
2026-08-28T09:54:47.9678847Z     },
2026-08-28T09:54:47.9679177Z     {
2026-08-28T09:54:47.9679482Z       "id": "REQ-RC-VT-TEARDOWN",
2026-08-28T09:54:47.9688146Z       "title": "RC-RENDER-TRUTH W3 (ADR-0043 decision 2, hertz stale-glyphs RCA leg 2 P0): rc display teardown is a display RAII guard SEPARATE from the OS input/raw-mode guard, unconditional and idempotent on EVERY exit path including errors and unwind — best-effort SGR reset + full scroll-region reset + cursor show + leave alternate screen + clear/home, emitted while VT output processing is still enabled, THEN restore the prior console output mode, THEN parting prose (today RawGuard::drop restores raw/mouse/console-mode only; detach, child exit, displacement, first-event stall, fatal error, and the 30s reconnect give-up all can leave the operator terminal dirty; the reconnect banner clears+homes then give-up prints at the centered cursor). Gate: impl — split display guard + every-path coverage; unit — guard emits the cleanup postlude exactly once, idempotent on double-drop; int — dirty sink (?1049h ?25l SGR31) x every PumpEnd/error class => cleanup postlude precedes the final prose; doc — ADR-0043.",
2026-08-28T09:54:47.9688536Z       "requiredStages": [
2026-08-28T09:54:47.9688788Z         "doc",
2026-08-28T09:54:47.9689137Z         "impl",
2026-08-28T09:54:47.9689394Z         "unit",
2026-08-28T09:54:47.9689660Z         "int"
2026-08-28T09:54:47.9689908Z       ],
2026-08-28T09:54:47.9690190Z       "stages": {
2026-08-28T09:54:47.9690444Z         "doc": {
2026-08-28T09:54:47.9690897Z           "complete": true,
2026-08-28T09:54:47.9691178Z           "evidence": [
2026-08-28T09:54:47.9691418Z             {
2026-08-28T09:54:47.9691855Z               "path": "docs/adr/0043-terminal-render-lifecycle.md",
2026-08-28T09:54:47.9692122Z               "line": 51
2026-08-28T09:54:47.9692395Z             }
2026-08-28T09:54:47.9692662Z           ]
2026-08-28T09:54:47.9692919Z         },
2026-08-28T09:54:47.9693273Z         "impl": {
2026-08-28T09:54:47.9693546Z           "complete": true,
2026-08-28T09:54:47.9693816Z           "evidence": [
2026-08-28T09:54:47.9694074Z             {
2026-08-28T09:54:47.9694380Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9694651Z               "line": 891
2026-08-28T09:54:47.9694909Z             },
2026-08-28T09:54:47.9695161Z             {
2026-08-28T09:54:47.9695476Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9695748Z               "line": 904
2026-08-28T09:54:47.9695995Z             },
2026-08-28T09:54:47.9696297Z             {
2026-08-28T09:54:47.9696608Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9696880Z               "line": 2139
2026-08-28T09:54:47.9697138Z             },
2026-08-28T09:54:47.9697399Z             {
2026-08-28T09:54:47.9697713Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9697980Z               "line": 2194
2026-08-28T09:54:47.9698238Z             }
2026-08-28T09:54:47.9698491Z           ]
2026-08-28T09:54:47.9698745Z         },
2026-08-28T09:54:47.9699086Z         "int": {
2026-08-28T09:54:47.9699382Z           "complete": true,
2026-08-28T09:54:47.9699644Z           "evidence": [
2026-08-28T09:54:47.9699896Z             {
2026-08-28T09:54:47.9700196Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9700473Z               "line": 3959
2026-08-28T09:54:47.9700750Z             }
2026-08-28T09:54:47.9701008Z           ]
2026-08-28T09:54:47.9701268Z         },
2026-08-28T09:54:47.9701528Z         "unit": {
2026-08-28T09:54:47.9701819Z           "complete": true,
2026-08-28T09:54:47.9702087Z           "evidence": [
2026-08-28T09:54:47.9702349Z             {
2026-08-28T09:54:47.9702654Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9702921Z               "line": 3942
2026-08-28T09:54:47.9703169Z             }
2026-08-28T09:54:47.9703430Z           ]
2026-08-28T09:54:47.9703818Z         }
2026-08-28T09:54:47.9704073Z       }
2026-08-28T09:54:47.9704329Z     },
2026-08-28T09:54:47.9704577Z     {
2026-08-28T09:54:47.9704878Z       "id": "REQ-RC-WIN-PASTE",
2026-08-28T09:54:47.9719207Z       "title": "In an `spt rc` session neither ctrl+V nor right-click pastes (CC explicitly supports ctrl+V). ROOT (doyle /diagnose): RawGuard does only enable_raw_mode (no bracketed paste / no mouse capture / no clipboard interception); the Windows console delivers a paste as synthetic per-char KEY EVENTs (no crossterm Event::Paste), and ctrl+V translates to bare ^V forwarded to CC — but CC runs DAEMON-SIDE with NO access to the operator's LOCAL clipboard, so remote paste is fundamentally CLIENT-ORIGINATED. A multi-line paste-as-keys also becomes a \\r submit-storm. FIX (doyle design, V0.13.0-P1-RC-PASTE-DESIGN.md, cfg(windows), folds into the bug-2 event path): on a paste gesture rc reads the LOCAL clipboard + forwards a BRACKETED PASTE (ESC[200~ + content + ESC[201~); CC has bracketed-paste mode on (its TUI sets ESC[?2004h) so it treats it as a paste — content intact, no submit-storm, harness-AGNOSTIC. ctrl+V: intercept Char('v')+CONTROL in the event loop -> read_clipboard -> bracketed paste. Right-click: RawGuard also EnableMouseCapture (disables console QuickEdit + enables ENABLE_MOUSE_INPUT so right-click surfaces as Event::Mouse on legacy cmd/powershell) -> right-button -> read_clipboard -> bracketed paste; DROP all other mouse (CC has no mouse features, operator-confirmed, so capture costs nothing). read_clipboard = clipboard-win crate (cfg(windows), minimal); empty/failed = clean no-op. Content forwarded VERBATIM (literal pasted text, no per-char translation). Unix UNCHANGED (its terminal pastes natively through the byte pump). DEPENDS ON P0 (a paste chunk must not wedge the broker). (v0.13.0)",
2026-08-28T09:54:47.9719663Z       "requiredStages": [
2026-08-28T09:54:47.9719954Z         "doc",
2026-08-28T09:54:47.9720211Z         "impl",
2026-08-28T09:54:47.9720473Z         "unit"
2026-08-28T09:54:47.9720730Z       ],
2026-08-28T09:54:47.9721074Z       "stages": {
2026-08-28T09:54:47.9721321Z         "doc": {
2026-08-28T09:54:47.9721589Z           "complete": true,
2026-08-28T09:54:47.9721865Z           "evidence": [
2026-08-28T09:54:47.9722115Z             {
2026-08-28T09:54:47.9722446Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:47.9722715Z               "line": 560
2026-08-28T09:54:47.9722972Z             }
2026-08-28T09:54:47.9723221Z           ]
2026-08-28T09:54:47.9723479Z         },
2026-08-28T09:54:47.9723750Z         "impl": {
2026-08-28T09:54:47.9724033Z           "complete": true,
2026-08-28T09:54:47.9724366Z           "evidence": [
2026-08-28T09:54:47.9724624Z             {
2026-08-28T09:54:47.9724938Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9725237Z               "line": 657
2026-08-28T09:54:47.9725496Z             },
2026-08-28T09:54:47.9725750Z             {
2026-08-28T09:54:47.9726065Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9726332Z               "line": 673
2026-08-28T09:54:47.9726585Z             },
2026-08-28T09:54:47.9726856Z             {
2026-08-28T09:54:47.9727166Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9727437Z               "line": 716
2026-08-28T09:54:47.9727689Z             },
2026-08-28T09:54:47.9727946Z             {
2026-08-28T09:54:47.9728250Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9728517Z               "line": 730
2026-08-28T09:54:47.9728774Z             },
2026-08-28T09:54:47.9729114Z             {
2026-08-28T09:54:47.9729438Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9729704Z               "line": 741
2026-08-28T09:54:47.9729957Z             }
2026-08-28T09:54:47.9730214Z           ]
2026-08-28T09:54:47.9730468Z         },
2026-08-28T09:54:47.9730723Z         "int": {
2026-08-28T09:54:47.9731009Z           "complete": false,
2026-08-28T09:54:47.9731295Z           "evidence": []
2026-08-28T09:54:47.9731610Z         },
2026-08-28T09:54:47.9731872Z         "unit": {
2026-08-28T09:54:47.9732154Z           "complete": true,
2026-08-28T09:54:47.9732430Z           "evidence": [
2026-08-28T09:54:47.9732685Z             {
2026-08-28T09:54:47.9733002Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9733266Z               "line": 5343
2026-08-28T09:54:47.9733523Z             },
2026-08-28T09:54:47.9733781Z             {
2026-08-28T09:54:47.9734086Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9734358Z               "line": 5364
2026-08-28T09:54:47.9734682Z             },
2026-08-28T09:54:47.9734927Z             {
2026-08-28T09:54:47.9735237Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9735513Z               "line": 5385
2026-08-28T09:54:47.9735758Z             }
2026-08-28T09:54:47.9736014Z           ]
2026-08-28T09:54:47.9736277Z         }
2026-08-28T09:54:47.9736539Z       }
2026-08-28T09:54:47.9736797Z     },
2026-08-28T09:54:47.9737053Z     {
2026-08-28T09:54:47.9737368Z       "id": "REQ-RC-WIN-VT-OUTPUT",
2026-08-28T09:54:47.9747523Z       "title": "Bug #12: `spt rc` to an endpoint renders ANSI escapes LITERALLY (raw ←[K / color codes) on a Win10 conhost console, garbling the viewport — while `endpoint run --attach` in the SAME env renders fine and Win11 Windows Terminal is unaffected. Root (code-grounded, doyle): rc.rs RawGuard::enable calls only crossterm enable_raw_mode (INPUT raw mode) and NEVER enables ENABLE_VIRTUAL_TERMINAL_PROCESSING on the OUTPUT handle; Win10 conhost defaults VT-output OFF so escapes print literally, whereas the picker/alt-screen setup on the endpoint-run path enters crossterm's VT-enabling console setup first (leaving VT-output on) — so it is the rc-attach CLIENT PATH specifically, and --attach-works-same-env confirms (not refutes) the VT-out theory. Fix: in the rc attach path (RawGuard), on cfg(windows) + interactive console (mirror the windows_mouse_wanted guard so piped stdin/stdout keeps clean bytes for the e2e byte tests), SetConsoleMode STD_OUTPUT_HANDLE |= ENABLE_VIRTUAL_TERMINAL_PROCESSING|ENABLE_PROCESSED_OUTPUT, capture the prior mode, restore on Drop. cfg(windows)-only, client-side, independent of #4/#6. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #12.",
2026-08-28T09:54:47.9747938Z       "requiredStages": [
2026-08-28T09:54:47.9748200Z         "impl",
2026-08-28T09:54:47.9748452Z         "unit"
2026-08-28T09:54:47.9748706Z       ],
2026-08-28T09:54:47.9749028Z       "stages": {
2026-08-28T09:54:47.9749284Z         "doc": {
2026-08-28T09:54:47.9749570Z           "complete": false,
2026-08-28T09:54:47.9749841Z           "evidence": []
2026-08-28T09:54:47.9750095Z         },
2026-08-28T09:54:47.9750428Z         "impl": {
2026-08-28T09:54:47.9750705Z           "complete": true,
2026-08-28T09:54:47.9750967Z           "evidence": [
2026-08-28T09:54:47.9751217Z             {
2026-08-28T09:54:47.9751546Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9751810Z               "line": 765
2026-08-28T09:54:47.9752067Z             },
2026-08-28T09:54:47.9752325Z             {
2026-08-28T09:54:47.9752631Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9752903Z               "line": 782
2026-08-28T09:54:47.9753151Z             },
2026-08-28T09:54:47.9753408Z             {
2026-08-28T09:54:47.9753718Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9753984Z               "line": 806
2026-08-28T09:54:47.9754234Z             }
2026-08-28T09:54:47.9754497Z           ]
2026-08-28T09:54:47.9754754Z         },
2026-08-28T09:54:47.9755006Z         "int": {
2026-08-28T09:54:47.9755297Z           "complete": false,
2026-08-28T09:54:47.9755568Z           "evidence": []
2026-08-28T09:54:47.9755832Z         },
2026-08-28T09:54:47.9756085Z         "unit": {
2026-08-28T09:54:47.9756371Z           "complete": true,
2026-08-28T09:54:47.9756638Z           "evidence": [
2026-08-28T09:54:47.9756898Z             {
2026-08-28T09:54:47.9757206Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9757534Z               "line": 4028
2026-08-28T09:54:47.9757792Z             }
2026-08-28T09:54:47.9758051Z           ]
2026-08-28T09:54:47.9758313Z         }
2026-08-28T09:54:47.9758561Z       }
2026-08-28T09:54:47.9758813Z     },
2026-08-28T09:54:47.9759142Z     {
2026-08-28T09:54:47.9759427Z       "id": "REQ-RCVIEW-1",
2026-08-28T09:54:47.9772083Z       "title": "Remote-attach controller/viewer model (CONTEXT.md:317): a session's broker OutputLog serves ONE interactive controller (input + EXCLUSIVE PTY resize; its viewport sets the size, sent on attach + every window change via crossterm Event::Resize) plus ANY NUMBER of read-only `--view` attachers (output-only, no input, no resize; client-side letterbox — center+pad when larger, clip+1-line indicator when smaller; only the local ctrl-b d detach chord). Attach intent is three-valued (`Viewer | Control | Take`, wire-default Control): Control to a FREE endpoint becomes controller, Control to a CONTROLLED endpoint is REFUSED with guidance (`--view`/`--take`) — never auto-viewer, never silent-displace. Wire adds (additive, N-1 skip-unknown): `Request.intent`, `Resize{rows,cols}` (controller-only), `Size{rows,cols}` (→viewer), `Displaced{by}` (→displaced controller). The brain-resume cursor (delivered_through, ADR-0018) tracks the CONTROLLER ONLY; viewers replay from their own from_seq and never move it. Dormancy keys on the controller ONLY: controller attach wakes / controller detach goes dormant (even with viewers present); viewer attach/detach is wake-neutral and may watch a dormant endpoint as-is. v1: viewing is gated identically to driving — a viewer runs the same access_check(Unsolicited) as a controller (watching reveals full session contents = a real disclosure); a lighter distinct watch-gate is deferred to cross-subnet/finer-consent (CONTEXT.md:317 'driving ≠ watching' = the future seam).",
2026-08-28T09:54:47.9772493Z       "requiredStages": [
2026-08-28T09:54:47.9772755Z         "doc",
2026-08-28T09:54:47.9773012Z         "impl",
2026-08-28T09:54:47.9773279Z         "unit",
2026-08-28T09:54:47.9773530Z         "int"
2026-08-28T09:54:47.9773860Z       ],
2026-08-28T09:54:47.9774127Z       "stages": {
2026-08-28T09:54:47.9774380Z         "doc": {
2026-08-28T09:54:47.9774666Z           "complete": true,
2026-08-28T09:54:47.9774929Z           "evidence": [
2026-08-28T09:54:47.9775189Z             {
2026-08-28T09:54:47.9775483Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.9775754Z               "line": 405
2026-08-28T09:54:47.9776008Z             }
2026-08-28T09:54:47.9776261Z           ]
2026-08-28T09:54:47.9776518Z         },
2026-08-28T09:54:47.9776780Z         "impl": {
2026-08-28T09:54:47.9777071Z           "complete": true,
2026-08-28T09:54:47.9777405Z           "evidence": [
2026-08-28T09:54:47.9777662Z             {
2026-08-28T09:54:47.9778032Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:47.9778307Z               "line": 940
2026-08-28T09:54:47.9778560Z             },
2026-08-28T09:54:47.9778822Z             {
2026-08-28T09:54:47.9779270Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9779542Z               "line": 3397
2026-08-28T09:54:47.9779800Z             },
2026-08-28T09:54:47.9780053Z             {
2026-08-28T09:54:47.9780411Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9780685Z               "line": 3413
2026-08-28T09:54:47.9780946Z             },
2026-08-28T09:54:47.9781193Z             {
2026-08-28T09:54:47.9781565Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.9781832Z               "line": 41
2026-08-28T09:54:47.9782085Z             },
2026-08-28T09:54:47.9782338Z             {
2026-08-28T09:54:47.9782695Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.9782972Z               "line": 75
2026-08-28T09:54:47.9783221Z             },
2026-08-28T09:54:47.9783486Z             {
2026-08-28T09:54:47.9783820Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.9784154Z               "line": 698
2026-08-28T09:54:47.9784410Z             },
2026-08-28T09:54:47.9784673Z             {
2026-08-28T09:54:47.9784988Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:47.9785259Z               "line": 1522
2026-08-28T09:54:47.9785517Z             }
2026-08-28T09:54:47.9785764Z           ]
2026-08-28T09:54:47.9786019Z         },
2026-08-28T09:54:47.9786277Z         "int": {
2026-08-28T09:54:47.9786563Z           "complete": true,
2026-08-28T09:54:47.9786830Z           "evidence": [
2026-08-28T09:54:47.9787078Z             {
2026-08-28T09:54:47.9787512Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.9787783Z               "line": 1166
2026-08-28T09:54:47.9788042Z             },
2026-08-28T09:54:47.9788294Z             {
2026-08-28T09:54:47.9788660Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.9789026Z               "line": 1229
2026-08-28T09:54:47.9789278Z             },
2026-08-28T09:54:47.9789534Z             {
2026-08-28T09:54:47.9789902Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.9790174Z               "line": 1291
2026-08-28T09:54:47.9790427Z             },
2026-08-28T09:54:47.9790684Z             {
2026-08-28T09:54:47.9791046Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.9791321Z               "line": 1519
2026-08-28T09:54:47.9791573Z             }
2026-08-28T09:54:47.9791825Z           ]
2026-08-28T09:54:47.9792077Z         },
2026-08-28T09:54:47.9792331Z         "unit": {
2026-08-28T09:54:47.9792611Z           "complete": true,
2026-08-28T09:54:47.9792879Z           "evidence": [
2026-08-28T09:54:47.9793132Z             {
2026-08-28T09:54:47.9793491Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.9793757Z               "line": 434
2026-08-28T09:54:47.9794008Z             },
2026-08-28T09:54:47.9794256Z             {
2026-08-28T09:54:47.9794618Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:47.9794890Z               "line": 492
2026-08-28T09:54:47.9795219Z             }
2026-08-28T09:54:47.9795476Z           ]
2026-08-28T09:54:47.9795731Z         }
2026-08-28T09:54:47.9795978Z       }
2026-08-28T09:54:47.9796228Z     },
2026-08-28T09:54:47.9796479Z     {
2026-08-28T09:54:47.9796761Z       "id": "REQ-REACH-1",
2026-08-28T09:54:47.9797208Z       "title": "Off-node remote-drive detection + file transfer",
2026-08-28T09:54:47.9797485Z       "requiredStages": [
2026-08-28T09:54:47.9797748Z         "impl",
2026-08-28T09:54:47.9798000Z         "unit",
2026-08-28T09:54:47.9798264Z         "int"
2026-08-28T09:54:47.9798511Z       ],
2026-08-28T09:54:47.9798836Z       "stages": {
2026-08-28T09:54:47.9799167Z         "doc": {
2026-08-28T09:54:47.9799455Z           "complete": false,
2026-08-28T09:54:47.9799728Z           "evidence": []
2026-08-28T09:54:47.9799986Z         },
2026-08-28T09:54:47.9800253Z         "impl": {
2026-08-28T09:54:47.9800534Z           "complete": true,
2026-08-28T09:54:47.9800812Z           "evidence": [
2026-08-28T09:54:47.9801063Z             {
2026-08-28T09:54:47.9801431Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9801701Z               "line": 3397
2026-08-28T09:54:47.9801951Z             },
2026-08-28T09:54:47.9802205Z             {
2026-08-28T09:54:47.9802548Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:47.9802810Z               "line": 77
2026-08-28T09:54:47.9803063Z             },
2026-08-28T09:54:47.9803315Z             {
2026-08-28T09:54:47.9803654Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:47.9803916Z               "line": 223
2026-08-28T09:54:47.9804163Z             },
2026-08-28T09:54:47.9804417Z             {
2026-08-28T09:54:47.9804765Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:47.9805027Z               "line": 433
2026-08-28T09:54:47.9805289Z             },
2026-08-28T09:54:47.9805541Z             {
2026-08-28T09:54:47.9805884Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:47.9806219Z               "line": 540
2026-08-28T09:54:47.9806475Z             },
2026-08-28T09:54:47.9806732Z             {
2026-08-28T09:54:47.9807068Z               "path": "crates/spt-net/src/net/xfer.rs",
2026-08-28T09:54:47.9807340Z               "line": 39
2026-08-28T09:54:47.9807588Z             },
2026-08-28T09:54:47.9807851Z             {
2026-08-28T09:54:47.9808185Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.9808456Z               "line": 666
2026-08-28T09:54:47.9808713Z             },
2026-08-28T09:54:47.9809105Z             {
2026-08-28T09:54:47.9809458Z               "path": "crates/spt-store/src/xfer.rs",
2026-08-28T09:54:47.9809733Z               "line": 88
2026-08-28T09:54:47.9809987Z             },
2026-08-28T09:54:47.9810240Z             {
2026-08-28T09:54:47.9810588Z               "path": "crates/spt-store/src/xfer.rs",
2026-08-28T09:54:47.9810851Z               "line": 98
2026-08-28T09:54:47.9811113Z             },
2026-08-28T09:54:47.9811372Z             {
2026-08-28T09:54:47.9811738Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.9812006Z               "line": 421
2026-08-28T09:54:47.9812256Z             }
2026-08-28T09:54:47.9812512Z           ]
2026-08-28T09:54:47.9812765Z         },
2026-08-28T09:54:47.9813032Z         "int": {
2026-08-28T09:54:47.9813308Z           "complete": true,
2026-08-28T09:54:47.9813590Z           "evidence": [
2026-08-28T09:54:47.9813846Z             {
2026-08-28T09:54:47.9814362Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.9814643Z               "line": 458
2026-08-28T09:54:47.9814897Z             },
2026-08-28T09:54:47.9815152Z             {
2026-08-28T09:54:47.9815520Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:47.9815796Z               "line": 726
2026-08-28T09:54:47.9816048Z             },
2026-08-28T09:54:47.9816296Z             {
2026-08-28T09:54:47.9816655Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.9817011Z               "line": 2031
2026-08-28T09:54:47.9817264Z             },
2026-08-28T09:54:47.9817516Z             {
2026-08-28T09:54:47.9817882Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:47.9818153Z               "line": 3133
2026-08-28T09:54:47.9818416Z             },
2026-08-28T09:54:47.9818663Z             {
2026-08-28T09:54:47.9819074Z               "path": "docs/INFRA-REGISTER.md",
2026-08-28T09:54:47.9819355Z               "line": 1638
2026-08-28T09:54:47.9819612Z             }
2026-08-28T09:54:47.9819869Z           ]
2026-08-28T09:54:47.9820173Z         },
2026-08-28T09:54:47.9820434Z         "unit": {
2026-08-28T09:54:47.9820710Z           "complete": true,
2026-08-28T09:54:47.9820983Z           "evidence": [
2026-08-28T09:54:47.9821239Z             {
2026-08-28T09:54:47.9821588Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:47.9821863Z               "line": 650
2026-08-28T09:54:47.9822116Z             },
2026-08-28T09:54:47.9822378Z             {
2026-08-28T09:54:47.9822707Z               "path": "crates/spt-daemon/src/xfer.rs",
2026-08-28T09:54:47.9822996Z               "line": 671
2026-08-28T09:54:47.9823243Z             },
2026-08-28T09:54:47.9823496Z             {
2026-08-28T09:54:47.9823859Z               "path": "crates/spt-daemon/tests/attach.rs",
2026-08-28T09:54:47.9824126Z               "line": 1002
2026-08-28T09:54:47.9824383Z             },
2026-08-28T09:54:47.9824636Z             {
2026-08-28T09:54:47.9824984Z               "path": "crates/spt-daemon/tests/xfer.rs",
2026-08-28T09:54:47.9825245Z               "line": 94
2026-08-28T09:54:47.9825504Z             },
2026-08-28T09:54:47.9825755Z             {
2026-08-28T09:54:47.9826113Z               "path": "crates/spt-daemon/tests/xfer.rs",
2026-08-28T09:54:47.9826390Z               "line": 225
2026-08-28T09:54:47.9826641Z             },
2026-08-28T09:54:47.9826895Z             {
2026-08-28T09:54:47.9827310Z               "path": "crates/spt-net/src/net/xfer.rs",
2026-08-28T09:54:47.9827590Z               "line": 96
2026-08-28T09:54:47.9827852Z             },
2026-08-28T09:54:47.9828109Z             {
2026-08-28T09:54:47.9828452Z               "path": "crates/spt-net/src/net/xfer.rs",
2026-08-28T09:54:47.9828723Z               "line": 146
2026-08-28T09:54:47.9829056Z             },
2026-08-28T09:54:47.9829305Z             {
2026-08-28T09:54:47.9829643Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:47.9829911Z               "line": 1577
2026-08-28T09:54:47.9830216Z             },
2026-08-28T09:54:47.9830463Z             {
2026-08-28T09:54:47.9830814Z               "path": "crates/spt-store/src/xfer.rs",
2026-08-28T09:54:47.9831079Z               "line": 118
2026-08-28T09:54:47.9831333Z             },
2026-08-28T09:54:47.9831595Z             {
2026-08-28T09:54:47.9831928Z               "path": "crates/spt-store/src/xfer.rs",
2026-08-28T09:54:47.9832206Z               "line": 148
2026-08-28T09:54:47.9832458Z             },
2026-08-28T09:54:47.9832725Z             {
2026-08-28T09:54:47.9833093Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:47.9833366Z               "line": 1771
2026-08-28T09:54:47.9833622Z             }
2026-08-28T09:54:47.9833871Z           ]
2026-08-28T09:54:47.9834124Z         }
2026-08-28T09:54:47.9834366Z       }
2026-08-28T09:54:47.9834614Z     },
2026-08-28T09:54:47.9834867Z     {
2026-08-28T09:54:47.9835143Z       "id": "REQ-REACH-2",
2026-08-28T09:54:47.9835606Z       "title": "Remote command execution (deferred, consent-gated)",
2026-08-28T09:54:47.9835892Z       "requiredStages": [],
2026-08-28T09:54:47.9836153Z       "stages": {
2026-08-28T09:54:47.9836397Z         "doc": {
2026-08-28T09:54:47.9836717Z           "complete": false,
2026-08-28T09:54:47.9836984Z           "evidence": []
2026-08-28T09:54:47.9837236Z         },
2026-08-28T09:54:47.9837493Z         "impl": {
2026-08-28T09:54:47.9837775Z           "complete": false,
2026-08-28T09:54:47.9838051Z           "evidence": []
2026-08-28T09:54:47.9838380Z         },
2026-08-28T09:54:47.9838631Z         "int": {
2026-08-28T09:54:47.9838915Z           "complete": false,
2026-08-28T09:54:47.9839264Z           "evidence": []
2026-08-28T09:54:47.9839517Z         },
2026-08-28T09:54:47.9839773Z         "unit": {
2026-08-28T09:54:47.9840055Z           "complete": false,
2026-08-28T09:54:47.9840327Z           "evidence": []
2026-08-28T09:54:47.9840580Z         }
2026-08-28T09:54:47.9840833Z       }
2026-08-28T09:54:47.9841081Z     },
2026-08-28T09:54:47.9841332Z     {
2026-08-28T09:54:47.9841648Z       "id": "REQ-READY-AGENT-RESUME",
2026-08-28T09:54:47.9851727Z       "title": "An offline ReadyAgent shows in `spt endpoint run`'s picker Resume-from-history and resumes correctly — closing the gap that today only LiveAgents do. ROOT: a harness-hosted ready bind (ReadyAgent::start_homed, ready.rs) writes info.json DIRECTLY and never appends the session ledger (unlike the shared establish_perch:250 live path), so a ready agent — though it has a session_id — produces ZERO ledger rows → the picker's offline+local Resume-from-history (which gates on ledger rows) never offers it. FIX (1): ledger the ready bind (ReadyAgent::start_homed → sessions::append Boot, mirroring establish_perch). FIX (2): `spt endpoint resume <id>` honors the adapter MANIFEST's endpoint TYPE — a ReadyAgent manifest (no [session.psyche_init]) resumes as a ready endpoint (poll listener, NO psyche-host); a LiveAgent (with psyche_init) as live. NO new bringup mode + NO picker changes (operator 2026-06-18): `spt endpoint run` is the spt-hosted ENDPOINT bringup for BOTH types, the type IS the adapter-manifest's concern (psyche-host already keys on psyche_init presence) — so (2) likely already holds; VERIFY at code, build only the residual. (v0.12.0)",
2026-08-28T09:54:47.9852082Z       "requiredStages": [
2026-08-28T09:54:47.9852333Z         "doc",
2026-08-28T09:54:47.9852595Z         "impl",
2026-08-28T09:54:47.9852848Z         "unit",
2026-08-28T09:54:47.9853288Z         "int"
2026-08-28T09:54:47.9853544Z       ],
2026-08-28T09:54:47.9853806Z       "stages": {
2026-08-28T09:54:47.9854059Z         "doc": {
2026-08-28T09:54:47.9854341Z           "complete": true,
2026-08-28T09:54:47.9854602Z           "evidence": [
2026-08-28T09:54:47.9854857Z             {
2026-08-28T09:54:47.9855152Z               "path": "CONTEXT.md",
2026-08-28T09:54:47.9855414Z               "line": 479
2026-08-28T09:54:47.9855663Z             }
2026-08-28T09:54:47.9855907Z           ]
2026-08-28T09:54:47.9856150Z         },
2026-08-28T09:54:47.9856465Z         "impl": {
2026-08-28T09:54:47.9856765Z           "complete": true,
2026-08-28T09:54:47.9857041Z           "evidence": [
2026-08-28T09:54:47.9857307Z             {
2026-08-28T09:54:47.9857650Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.9857917Z               "line": 120
2026-08-28T09:54:47.9858175Z             }
2026-08-28T09:54:47.9858424Z           ]
2026-08-28T09:54:47.9858685Z         },
2026-08-28T09:54:47.9859029Z         "int": {
2026-08-28T09:54:47.9859324Z           "complete": true,
2026-08-28T09:54:47.9859604Z           "evidence": [
2026-08-28T09:54:47.9859855Z             {
2026-08-28T09:54:47.9860269Z               "path": "crates/spt/tests/ready_resume_ledger_e2e.rs",
2026-08-28T09:54:47.9860536Z               "line": 26
2026-08-28T09:54:47.9860798Z             }
2026-08-28T09:54:47.9861047Z           ]
2026-08-28T09:54:47.9861300Z         },
2026-08-28T09:54:47.9861557Z         "unit": {
2026-08-28T09:54:47.9861838Z           "complete": true,
2026-08-28T09:54:47.9862110Z           "evidence": [
2026-08-28T09:54:47.9862362Z             {
2026-08-28T09:54:47.9862698Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:47.9862966Z               "line": 384
2026-08-28T09:54:47.9863223Z             }
2026-08-28T09:54:47.9863470Z           ]
2026-08-28T09:54:47.9863728Z         }
2026-08-28T09:54:47.9863971Z       }
2026-08-28T09:54:47.9864219Z     },
2026-08-28T09:54:47.9864473Z     {
2026-08-28T09:54:47.9868788Z       "id": "REQ-RECONCILE-FAILED-ADDR-REFUSE",
2026-08-28T09:54:47.9878142Z       "title": "WAN-TRUTH #40 F3 (the RECONCILE consumer of REQ-DIAL-FAILED-ADDR-MEMORY): reconcile_peeraddrs refuses to reinstall over a suspect cache row the very address whose dial just failed, and leaves the suspect mark standing — while still installing any DIFFERING validated roster address and clearing the mark exactly as today. This kills the livelock the live-fire injection proved (fail at 19:42:19 -> demote -> the 19:42:34 roster exchange reinstalls the byte-identical stale address and clears the mark -> fail), without removing the connection-independent recovery the same function exists to provide. Sibling: REQ-ROUTE-CHAIN-FAILED-ADDR-SKIP, the same memory read at the route-chain consumer. Gate: impl — the suspect-arm predicate through the shared helper, at both the startup and the roster-merge sink call sites; unit — a suspect row is NOT overwritten by the just-failed address and stays suspect, a suspect row IS replaced by a differing roster address with the mark cleared (re-pinned by intent), and absent/invariant-invalid rows behave as before.",
2026-08-28T09:54:47.9878580Z       "requiredStages": [
2026-08-28T09:54:47.9878841Z         "impl",
2026-08-28T09:54:47.9879186Z         "unit"
2026-08-28T09:54:47.9879437Z       ],
2026-08-28T09:54:47.9879700Z       "stages": {
2026-08-28T09:54:47.9879958Z         "doc": {
2026-08-28T09:54:47.9880240Z           "complete": false,
2026-08-28T09:54:47.9880512Z           "evidence": []
2026-08-28T09:54:47.9880767Z         },
2026-08-28T09:54:47.9881027Z         "impl": {
2026-08-28T09:54:47.9881313Z           "complete": true,
2026-08-28T09:54:47.9881590Z           "evidence": [
2026-08-28T09:54:47.9881847Z             {
2026-08-28T09:54:47.9882234Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.9882505Z               "line": 1001
2026-08-28T09:54:47.9882764Z             }
2026-08-28T09:54:47.9883088Z           ]
2026-08-28T09:54:47.9883336Z         },
2026-08-28T09:54:47.9883605Z         "int": {
2026-08-28T09:54:47.9883889Z           "complete": false,
2026-08-28T09:54:47.9884161Z           "evidence": []
2026-08-28T09:54:47.9884419Z         },
2026-08-28T09:54:47.9884673Z         "unit": {
2026-08-28T09:54:47.9884953Z           "complete": true,
2026-08-28T09:54:47.9885229Z           "evidence": [
2026-08-28T09:54:47.9885487Z             {
2026-08-28T09:54:47.9885864Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.9886144Z               "line": 1386
2026-08-28T09:54:47.9886604Z             },
2026-08-28T09:54:47.9886866Z             {
2026-08-28T09:54:47.9887239Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:47.9887506Z               "line": 1417
2026-08-28T09:54:47.9887757Z             }
2026-08-28T09:54:47.9888001Z           ]
2026-08-28T09:54:47.9888263Z         }
2026-08-28T09:54:47.9888508Z       }
2026-08-28T09:54:47.9888746Z     },
2026-08-28T09:54:47.9889269Z     {
2026-08-28T09:54:47.9889617Z       "id": "REQ-REDISPATCH-FINISHED-RETIRE",
2026-08-28T09:54:47.9898156Z       "title": "REDISPATCH-TRUTH W1 (ADR-0038, hertz fix A): finished/terminal stream rows are RETIRED from redispatch eligibility — NetShared.streams today has NO removal path (single insert nethost.rs ~649; StreamLog::finish only marks) so every dispatcher generation re-enumerates every historical stream forever. Retire terminal rows from the enumeration the dispatcher claims from (remove, or lifecycle-exclude), preserving only the post-EOF state genuinely needed by other readers (presence/log reads); bounded growth replaces forever-discoverable rows. Clearing the whole table on brain restart is REJECTED (destroys live streams' reconstruction facts). Gate: impl — the retirement path; unit — a finished stream is invisible to the dispatch enumeration while an active one stays claimable + post-EOF reader state survives retirement; doc — rides ADR-0038 + the triage doc. Kin REQ-HAZARD-REDISPATCH-CONTROL-STEAL (the invariant it satisfies), REQ-STREAM-OPENER-DURABLE.",
2026-08-28T09:54:47.9898576Z       "requiredStages": [
2026-08-28T09:54:47.9898833Z         "doc",
2026-08-28T09:54:47.9899214Z         "impl",
2026-08-28T09:54:47.9899472Z         "unit",
2026-08-28T09:54:47.9899734Z         "int"
2026-08-28T09:54:47.9899986Z       ],
2026-08-28T09:54:47.9900252Z       "stages": {
2026-08-28T09:54:47.9900515Z         "doc": {
2026-08-28T09:54:47.9900802Z           "complete": true,
2026-08-28T09:54:47.9901078Z           "evidence": [
2026-08-28T09:54:47.9901346Z             {
2026-08-28T09:54:47.9901816Z               "path": "docs/adr/0038-broker-stream-lifecycle-truth.md",
2026-08-28T09:54:47.9902157Z               "line": 27
2026-08-28T09:54:47.9902415Z             }
2026-08-28T09:54:47.9902672Z           ]
2026-08-28T09:54:47.9902926Z         },
2026-08-28T09:54:47.9903202Z         "impl": {
2026-08-28T09:54:47.9903482Z           "complete": true,
2026-08-28T09:54:47.9903759Z           "evidence": [
2026-08-28T09:54:47.9904007Z             {
2026-08-28T09:54:47.9904365Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:47.9904640Z               "line": 2068
2026-08-28T09:54:47.9905024Z             },
2026-08-28T09:54:47.9905405Z             {
2026-08-28T09:54:47.9905826Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:47.9906141Z               "line": 9280
2026-08-28T09:54:47.9906418Z             },
2026-08-28T09:54:47.9906704Z             {
2026-08-28T09:54:47.9907100Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9907412Z               "line": 550
2026-08-28T09:54:47.9907691Z             },
2026-08-28T09:54:47.9907977Z             {
2026-08-28T09:54:47.9908350Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:47.9908660Z               "line": 206
2026-08-28T09:54:47.9909041Z             },
2026-08-28T09:54:47.9909328Z             {
2026-08-28T09:54:47.9909722Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.9910089Z               "line": 852
2026-08-28T09:54:47.9910389Z             },
2026-08-28T09:54:47.9910666Z             {
2026-08-28T09:54:47.9911066Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.9911352Z               "line": 1058
2026-08-28T09:54:47.9911648Z             },
2026-08-28T09:54:47.9911930Z             {
2026-08-28T09:54:47.9912315Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.9912622Z               "line": 2004
2026-08-28T09:54:47.9912961Z             }
2026-08-28T09:54:47.9913242Z           ]
2026-08-28T09:54:47.9913519Z         },
2026-08-28T09:54:47.9913800Z         "int": {
2026-08-28T09:54:47.9914101Z           "complete": true,
2026-08-28T09:54:47.9914407Z           "evidence": [
2026-08-28T09:54:47.9914682Z             {
2026-08-28T09:54:47.9915121Z               "path": "crates/spt-daemon/tests/redispatch.rs",
2026-08-28T09:54:47.9915415Z               "line": 363
2026-08-28T09:54:47.9915694Z             },
2026-08-28T09:54:47.9915980Z             {
2026-08-28T09:54:47.9916400Z               "path": "crates/spt-daemon/tests/redispatch.rs",
2026-08-28T09:54:47.9916696Z               "line": 493
2026-08-28T09:54:47.9916978Z             }
2026-08-28T09:54:47.9917239Z           ]
2026-08-28T09:54:47.9917520Z         },
2026-08-28T09:54:47.9917801Z         "unit": {
2026-08-28T09:54:47.9918113Z           "complete": true,
2026-08-28T09:54:47.9918408Z           "evidence": [
2026-08-28T09:54:47.9918681Z             {
2026-08-28T09:54:47.9919201Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9919506Z               "line": 3129
2026-08-28T09:54:47.9919786Z             },
2026-08-28T09:54:47.9920063Z             {
2026-08-28T09:54:47.9920451Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.9920743Z               "line": 2743
2026-08-28T09:54:47.9921025Z             },
2026-08-28T09:54:47.9921297Z             {
2026-08-28T09:54:47.9921688Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.9922056Z               "line": 2782
2026-08-28T09:54:47.9922336Z             },
2026-08-28T09:54:47.9922613Z             {
2026-08-28T09:54:47.9922998Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:47.9923296Z               "line": 2828
2026-08-28T09:54:47.9923573Z             }
2026-08-28T09:54:47.9923854Z           ]
2026-08-28T09:54:47.9924126Z         }
2026-08-28T09:54:47.9924408Z       }
2026-08-28T09:54:47.9924684Z     },
2026-08-28T09:54:47.9924967Z     {
2026-08-28T09:54:47.9925362Z       "id": "REQ-REGISTRY-APPLY-TRANSACTIONAL",
2026-08-28T09:54:47.9933728Z       "title": "REGISTRY-LIFECYCLE W1 (ADR-0040 decision 3, hertz defect B leg 3): registry feed application is TRANSACTIONAL per feed — serve_registry_feed merges decoded labels + instance updates in memory across transport chunks and applies ONCE at EOF (or one bounded batch commit for oversized feeds); write_snapshots runs O(feeds), never O(chunks x record-kinds); attention-shift side effects fire once post-merge. No synchronous full-registry rewrite inside a per-chunk drain iteration (KH 7.12/7.43 discipline on the brain side — the per-chunk rewrites are what stalled IPC drain and manufactured the 15s seat-writer poisons). Gate: impl — accumulate-then-apply; unit — snapshot-write counter across a multi-chunk feed == 1 (bounded batches: == ceil(records/batch)), merge result equals per-chunk semantics, gate policy still applied per record; int — rides REQ-HAZARD-REGISTRY-STALL seam (snapshot writes O(feeds), zero poisons); doc — ADR-0040.",
2026-08-28T09:54:47.9934100Z       "requiredStages": [
2026-08-28T09:54:47.9934381Z         "doc",
2026-08-28T09:54:47.9934668Z         "impl",
2026-08-28T09:54:47.9934949Z         "unit",
2026-08-28T09:54:47.9935226Z         "int"
2026-08-28T09:54:47.9935512Z       ],
2026-08-28T09:54:47.9935798Z       "stages": {
2026-08-28T09:54:47.9936083Z         "doc": {
2026-08-28T09:54:47.9936463Z           "complete": true,
2026-08-28T09:54:47.9936858Z           "evidence": [
2026-08-28T09:54:47.9937139Z             {
2026-08-28T09:54:47.9937788Z               "path": "docs/adr/0040-bounded-stream-seat-lifecycle-one-way-terminal.md",
2026-08-28T09:54:47.9938059Z               "line": 61
2026-08-28T09:54:47.9938311Z             }
2026-08-28T09:54:47.9938568Z           ]
2026-08-28T09:54:47.9938822Z         },
2026-08-28T09:54:47.9939163Z         "impl": {
2026-08-28T09:54:47.9939448Z           "complete": true,
2026-08-28T09:54:47.9939720Z           "evidence": [
2026-08-28T09:54:47.9940054Z             {
2026-08-28T09:54:47.9940511Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9940793Z               "line": 1296
2026-08-28T09:54:47.9941041Z             },
2026-08-28T09:54:47.9941299Z             {
2026-08-28T09:54:47.9941666Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9941936Z               "line": 1324
2026-08-28T09:54:47.9942193Z             },
2026-08-28T09:54:47.9942450Z             {
2026-08-28T09:54:47.9942818Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9943094Z               "line": 1385
2026-08-28T09:54:47.9943342Z             },
2026-08-28T09:54:47.9943591Z             {
2026-08-28T09:54:47.9943985Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.9944252Z               "line": 166
2026-08-28T09:54:47.9944508Z             },
2026-08-28T09:54:47.9944760Z             {
2026-08-28T09:54:47.9945147Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.9945419Z               "line": 284
2026-08-28T09:54:47.9945675Z             },
2026-08-28T09:54:47.9945990Z             {
2026-08-28T09:54:47.9946378Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.9946648Z               "line": 346
2026-08-28T09:54:47.9946900Z             },
2026-08-28T09:54:47.9947151Z             {
2026-08-28T09:54:47.9947537Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.9947880Z               "line": 409
2026-08-28T09:54:47.9948152Z             }
2026-08-28T09:54:47.9948414Z           ]
2026-08-28T09:54:47.9948673Z         },
2026-08-28T09:54:47.9948925Z         "int": {
2026-08-28T09:54:47.9949288Z           "complete": true,
2026-08-28T09:54:47.9949557Z           "evidence": [
2026-08-28T09:54:47.9949807Z             {
2026-08-28T09:54:47.9950247Z               "path": "crates/spt-daemon/tests/registry_lifecycle.rs",
2026-08-28T09:54:47.9950508Z               "line": 528
2026-08-28T09:54:47.9950766Z             }
2026-08-28T09:54:47.9951076Z           ]
2026-08-28T09:54:47.9951329Z         },
2026-08-28T09:54:47.9951582Z         "unit": {
2026-08-28T09:54:47.9951864Z           "complete": true,
2026-08-28T09:54:47.9952141Z           "evidence": [
2026-08-28T09:54:47.9952395Z             {
2026-08-28T09:54:47.9952758Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9953029Z               "line": 3154
2026-08-28T09:54:47.9953293Z             },
2026-08-28T09:54:47.9953541Z             {
2026-08-28T09:54:47.9953927Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:47.9954194Z               "line": 2053
2026-08-28T09:54:47.9954452Z             }
2026-08-28T09:54:47.9954703Z           ]
2026-08-28T09:54:47.9954953Z         }
2026-08-28T09:54:47.9955210Z       }
2026-08-28T09:54:47.9955459Z     },
2026-08-28T09:54:47.9955712Z     {
2026-08-28T09:54:47.9956036Z       "id": "REQ-REGISTRY-REPLAY-BOUNDED",
2026-08-28T09:54:47.9964482Z       "title": "REGISTRY-LIFECYCLE W1 (ADR-0040 decision 4, hertz defect B leg 4, defense-in-depth behind REQ-ONEWAY-STREAM-TERMINAL): a deadline-poisoned one-way (Registry) replay carries a per-stream strike budget; at budget the row retires TERMINAL with loud telemetry (DISPATCH_EV event). Safe by family semantics: a feed is an idempotent snapshot advertisement, the next pump round (~30s) re-advertises — worst-case loss is one advertisement round, already the family freshness unit. Request/reply families keep ADR-0038 Amendment circuit-breaker semantics — terminal-at-budget is ONE-WAY-FAMILY-ONLY (never a revert toward burn-the-claim abandonment for request streams). Gate: impl — strike budget + terminal retire, one-way-scoped; unit — poison strikes accumulate per stream, budget retires terminal + emits, request/reply family unaffected by the budget path; int — poisoned registry replay stops redispatching after budget while fresh feeds keep serving.",
2026-08-28T09:54:47.9964911Z       "requiredStages": [
2026-08-28T09:54:47.9965215Z         "impl",
2026-08-28T09:54:47.9965542Z         "unit",
2026-08-28T09:54:47.9965799Z         "int"
2026-08-28T09:54:47.9966053Z       ],
2026-08-28T09:54:47.9966320Z       "stages": {
2026-08-28T09:54:47.9966577Z         "doc": {
2026-08-28T09:54:47.9966863Z           "complete": false,
2026-08-28T09:54:47.9967134Z           "evidence": []
2026-08-28T09:54:47.9967387Z         },
2026-08-28T09:54:47.9967658Z         "impl": {
2026-08-28T09:54:47.9967950Z           "complete": true,
2026-08-28T09:54:47.9968230Z           "evidence": [
2026-08-28T09:54:47.9968480Z             {
2026-08-28T09:54:47.9968863Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9969224Z               "line": 456
2026-08-28T09:54:47.9969483Z             },
2026-08-28T09:54:47.9969735Z             {
2026-08-28T09:54:47.9970103Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9970370Z               "line": 481
2026-08-28T09:54:47.9970630Z             },
2026-08-28T09:54:47.9970880Z             {
2026-08-28T09:54:47.9971257Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9971524Z               "line": 788
2026-08-28T09:54:47.9971777Z             }
2026-08-28T09:54:47.9972035Z           ]
2026-08-28T09:54:47.9972292Z         },
2026-08-28T09:54:47.9972554Z         "int": {
2026-08-28T09:54:47.9972840Z           "complete": true,
2026-08-28T09:54:47.9973121Z           "evidence": [
2026-08-28T09:54:47.9973459Z             {
2026-08-28T09:54:47.9973893Z               "path": "crates/spt-daemon/tests/registry_lifecycle.rs",
2026-08-28T09:54:47.9974164Z               "line": 633
2026-08-28T09:54:47.9974417Z             }
2026-08-28T09:54:47.9974675Z           ]
2026-08-28T09:54:47.9974928Z         },
2026-08-28T09:54:47.9975196Z         "unit": {
2026-08-28T09:54:47.9975476Z           "complete": true,
2026-08-28T09:54:47.9975751Z           "evidence": [
2026-08-28T09:54:47.9976012Z             {
2026-08-28T09:54:47.9976387Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:47.9976726Z               "line": 2948
2026-08-28T09:54:47.9976974Z             }
2026-08-28T09:54:47.9977228Z           ]
2026-08-28T09:54:47.9977481Z         }
2026-08-28T09:54:47.9977899Z       }
2026-08-28T09:54:47.9978153Z     },
2026-08-28T09:54:47.9978402Z     {
2026-08-28T09:54:47.9978685Z       "id": "REQ-REL-1",
2026-08-28T09:54:47.9983448Z       "title": "HISTORICAL (superseded by ADR-0036 / REQ-RELEASE-CHANNEL-PRIVATE + REQ-DOCS-LOCAL-SERVER): spt-releases publish-target repo — README public face, licensing split, Pages docs at the ADR-0014 canonical URL. The Pages pipeline retired at THE-FORKENING (docs-publish.yml deleted W2, xtask site() deleted W3); the licensing-split artifacts (releases-repo/LICENSE-*) remain in-repo and the repo-topology story lives in CONTEXT §Project infrastructure. doc stage retained as the historical record on ADR-0014.",
2026-08-28T09:54:47.9983753Z       "requiredStages": [
2026-08-28T09:54:47.9984019Z         "doc"
2026-08-28T09:54:47.9984268Z       ],
2026-08-28T09:54:47.9984544Z       "stages": {
2026-08-28T09:54:47.9984797Z         "doc": {
2026-08-28T09:54:47.9985083Z           "complete": true,
2026-08-28T09:54:47.9985387Z           "evidence": [
2026-08-28T09:54:47.9985722Z             {
2026-08-28T09:54:47.9986402Z               "path": "docs/adr/0014-publish-target-repo-and-lapse-proof-canonical-url.md",
2026-08-28T09:54:47.9986886Z               "line": 3
2026-08-28T09:54:47.9987144Z             }
2026-08-28T09:54:47.9987402Z           ]
2026-08-28T09:54:47.9987654Z         },
2026-08-28T09:54:47.9987915Z         "impl": {
2026-08-28T09:54:47.9988193Z           "complete": false,
2026-08-28T09:54:47.9988469Z           "evidence": []
2026-08-28T09:54:47.9988727Z         },
2026-08-28T09:54:47.9989056Z         "int": {
2026-08-28T09:54:47.9989345Z           "complete": false,
2026-08-28T09:54:47.9989615Z           "evidence": []
2026-08-28T09:54:47.9989868Z         },
2026-08-28T09:54:47.9990192Z         "unit": {
2026-08-28T09:54:47.9990473Z           "complete": false,
2026-08-28T09:54:47.9990755Z           "evidence": []
2026-08-28T09:54:47.9991003Z         }
2026-08-28T09:54:47.9991261Z       }
2026-08-28T09:54:47.9991510Z     },
2026-08-28T09:54:47.9991764Z     {
2026-08-28T09:54:47.9992034Z       "id": "REQ-REL-2",
2026-08-28T09:54:47.9993617Z       "title": "Release asset set consumable by the self-updater: platform binaries, SHA256SUMS, SignedRelease metadata, manifest schema, mock-adapter zip; tag-triggered cross-repo pipeline",
2026-08-28T09:54:47.9993917Z       "requiredStages": [
2026-08-28T09:54:47.9994171Z         "impl",
2026-08-28T09:54:47.9994429Z         "int"
2026-08-28T09:54:47.9994679Z       ],
2026-08-28T09:54:47.9994941Z       "stages": {
2026-08-28T09:54:47.9995190Z         "doc": {
2026-08-28T09:54:47.9995476Z           "complete": true,
2026-08-28T09:54:47.9995743Z           "evidence": [
2026-08-28T09:54:47.9995996Z             {
2026-08-28T09:54:47.9996330Z               "path": "docs/RELEASE-RUNBOOK.md",
2026-08-28T09:54:47.9996591Z               "line": 6
2026-08-28T09:54:47.9996848Z             }
2026-08-28T09:54:47.9997099Z           ]
2026-08-28T09:54:47.9997357Z         },
2026-08-28T09:54:47.9997614Z         "impl": {
2026-08-28T09:54:47.9997895Z           "complete": true,
2026-08-28T09:54:47.9998170Z           "evidence": [
2026-08-28T09:54:47.9998424Z             {
2026-08-28T09:54:47.9998772Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:47.9999183Z               "line": 16
2026-08-28T09:54:47.9999444Z             },
2026-08-28T09:54:47.9999692Z             {
2026-08-28T09:54:48.0000018Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0000286Z               "line": 1130
2026-08-28T09:54:48.0000538Z             },
2026-08-28T09:54:48.0000791Z             {
2026-08-28T09:54:48.0001115Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0001391Z               "line": 1204
2026-08-28T09:54:48.0001649Z             },
2026-08-28T09:54:48.0001901Z             {
2026-08-28T09:54:48.0002277Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0002547Z               "line": 1396
2026-08-28T09:54:48.0002800Z             },
2026-08-28T09:54:48.0003057Z             {
2026-08-28T09:54:48.0003391Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0003663Z               "line": 1567
2026-08-28T09:54:48.0003924Z             }
2026-08-28T09:54:48.0004182Z           ]
2026-08-28T09:54:48.0004435Z         },
2026-08-28T09:54:48.0004684Z         "int": {
2026-08-28T09:54:48.0004965Z           "complete": true,
2026-08-28T09:54:48.0005229Z           "evidence": [
2026-08-28T09:54:48.0005482Z             {
2026-08-28T09:54:48.0005864Z               "path": "crates/spt/tests/release_verify_e2e.rs",
2026-08-28T09:54:48.0006135Z               "line": 20
2026-08-28T09:54:48.0006384Z             }
2026-08-28T09:54:48.0006633Z           ]
2026-08-28T09:54:48.0006890Z         },
2026-08-28T09:54:48.0007142Z         "unit": {
2026-08-28T09:54:48.0007436Z           "complete": false,
2026-08-28T09:54:48.0007706Z           "evidence": []
2026-08-28T09:54:48.0007960Z         }
2026-08-28T09:54:48.0008212Z       }
2026-08-28T09:54:48.0008469Z     },
2026-08-28T09:54:48.0008726Z     {
2026-08-28T09:54:48.0009084Z       "id": "REQ-REL-3",
2026-08-28T09:54:48.0010493Z       "title": "Two-key release-signing trust anchor: primary + offline never-used recovery, both pubkeys embedded in the binary's trusted set, manual local signing (ADR-0015)",
2026-08-28T09:54:48.0010850Z       "requiredStages": [
2026-08-28T09:54:48.0011113Z         "impl",
2026-08-28T09:54:48.0011361Z         "unit"
2026-08-28T09:54:48.0011617Z       ],
2026-08-28T09:54:48.0011880Z       "stages": {
2026-08-28T09:54:48.0012137Z         "doc": {
2026-08-28T09:54:48.0012424Z           "complete": false,
2026-08-28T09:54:48.0012691Z           "evidence": []
2026-08-28T09:54:48.0012947Z         },
2026-08-28T09:54:48.0013264Z         "impl": {
2026-08-28T09:54:48.0013545Z           "complete": true,
2026-08-28T09:54:48.0013817Z           "evidence": [
2026-08-28T09:54:48.0014070Z             {
2026-08-28T09:54:48.0014442Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.0014709Z               "line": 324
2026-08-28T09:54:48.0014962Z             },
2026-08-28T09:54:48.0015215Z             {
2026-08-28T09:54:48.0015583Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.0015848Z               "line": 376
2026-08-28T09:54:48.0016105Z             },
2026-08-28T09:54:48.0016352Z             {
2026-08-28T09:54:48.0016681Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0016954Z               "line": 1107
2026-08-28T09:54:48.0017207Z             },
2026-08-28T09:54:48.0017460Z             {
2026-08-28T09:54:48.0017775Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0018049Z               "line": 1131
2026-08-28T09:54:48.0018309Z             },
2026-08-28T09:54:48.0018566Z             {
2026-08-28T09:54:48.0018881Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0019238Z               "line": 1172
2026-08-28T09:54:48.0019497Z             }
2026-08-28T09:54:48.0019750Z           ]
2026-08-28T09:54:48.0020008Z         },
2026-08-28T09:54:48.0020259Z         "int": {
2026-08-28T09:54:48.0020546Z           "complete": false,
2026-08-28T09:54:48.0020821Z           "evidence": []
2026-08-28T09:54:48.0021162Z         },
2026-08-28T09:54:48.0021420Z         "unit": {
2026-08-28T09:54:48.0021701Z           "complete": true,
2026-08-28T09:54:48.0021973Z           "evidence": [
2026-08-28T09:54:48.0022226Z             {
2026-08-28T09:54:48.0022594Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.0022855Z               "line": 1240
2026-08-28T09:54:48.0023103Z             },
2026-08-28T09:54:48.0023350Z             {
2026-08-28T09:54:48.0023729Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.0024025Z               "line": 1299
2026-08-28T09:54:48.0024334Z             }
2026-08-28T09:54:48.0024592Z           ]
2026-08-28T09:54:48.0024840Z         }
2026-08-28T09:54:48.0025093Z       }
2026-08-28T09:54:48.0025336Z     },
2026-08-28T09:54:48.0025583Z     {
2026-08-28T09:54:48.0025917Z       "id": "REQ-RELAY-DEATH-CONVERGENCE",
2026-08-28T09:54:48.0043894Z       "title": "A dead harness relay MUST converge the endpoint's projection — an endpoint whose relay process is provably gone cannot keep rendering `ONLINE - HARNESS ONLY` with ready=true alive=true and a registered address merely because the owner parent is still alive. RE-PROVEN PRESENT on 0.44.0 (hertz W0 item 2, 2026-07-27, fresh isolated build sha-prefix 00e15f): relay pid 38764 killed 06:21:01Z, owner pid 12156 live; 148s later info.json still pid=38764 status=online, list JSON ready=true alive=true address=127.0.0.1:57709, TCP to that address unreachable, human list `ONLINE - HARNESS ONLY`. Sibling probes: live-relay sibling's socket reachable and `send` -> SENT with the EVENT received (the rig CAN see delivery); clean `endpoint stop` sibling rendered status=offline ready=false alive=false (the rig CAN see convergence). FIX SHAPE: relay-death convergence — a dead/unreachable relay clears the ready/address/liveness projection for its endpoint within a bounded window, in ONE authority: the verdict MUST route through the shipped custody/process-identity predicate (KH 2.5 — liveness authority lives in one resolver, never re-derived beside it; Unproven never kills). Kin: the Athenaeum stale-ALIVE generator (HOSTING_AUTHORITY_DEMOTED demote-to-no-claim arm, REQ-LISTEN-PRESERVES-HOSTING-TOPOLOGY — the demote-vs-offline fork needs the same identity predicate), SHELL-STALE-ONLINE (same lying-signal class, shell flavor), REQ-MSG-INJECT-LEG-DROP-VISIBLE (the observability face of the same wedge). TITLE ADDENDUM 2026-07-27 (doyle ruling, todlando build): THE VERDICT FIRES ONLY WHERE THE RECORDED PID WAS A **HOLDER** (pid_role=relay, REQ-PID-ROLE-EVIDENCE). The shipped branch asks the oracle about whatever pid the record carries, and `info.pid` means two different things by write path — a holding `api listen` relay, or an `api bind` announcer that exits within seconds. Measured on HFENDULEAM 2026-07-27: todlando 22588, doyle 45160, deployah 29176 all DEAD-and-online (binder pids) against hertz 11216 / mobile-gw 46152 alive (relay pids), so an unrole-gated verdict would have offlined three live agents. A row with no role stamp (legacy) is NO KNOWLEDGE and never converges; it heals at its next re-bind.",
2026-08-28T09:54:48.0044423Z       "requiredStages": [
2026-08-28T09:54:48.0044680Z         "impl",
2026-08-28T09:54:48.0044945Z         "unit",
2026-08-28T09:54:48.0045202Z         "int"
2026-08-28T09:54:48.0045459Z       ],
2026-08-28T09:54:48.0045727Z       "stages": {
2026-08-28T09:54:48.0046027Z         "doc": {
2026-08-28T09:54:48.0046309Z           "complete": false,
2026-08-28T09:54:48.0046591Z           "evidence": []
2026-08-28T09:54:48.0046862Z         },
2026-08-28T09:54:48.0047124Z         "impl": {
2026-08-28T09:54:48.0047423Z           "complete": true,
2026-08-28T09:54:48.0047690Z           "evidence": [
2026-08-28T09:54:48.0047943Z             {
2026-08-28T09:54:48.0048310Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0048587Z               "line": 739
2026-08-28T09:54:48.0048840Z             },
2026-08-28T09:54:48.0049188Z             {
2026-08-28T09:54:48.0049531Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0049867Z               "line": 352
2026-08-28T09:54:48.0050123Z             },
2026-08-28T09:54:48.0050375Z             {
2026-08-28T09:54:48.0050725Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0050991Z               "line": 577
2026-08-28T09:54:48.0051244Z             },
2026-08-28T09:54:48.0051492Z             {
2026-08-28T09:54:48.0051859Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:48.0052130Z               "line": 217
2026-08-28T09:54:48.0052380Z             },
2026-08-28T09:54:48.0052687Z             {
2026-08-28T09:54:48.0053039Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.0053306Z               "line": 665
2026-08-28T09:54:48.0053553Z             }
2026-08-28T09:54:48.0053805Z           ]
2026-08-28T09:54:48.0054053Z         },
2026-08-28T09:54:48.0054312Z         "int": {
2026-08-28T09:54:48.0054603Z           "complete": true,
2026-08-28T09:54:48.0054870Z           "evidence": [
2026-08-28T09:54:48.0055125Z             {
2026-08-28T09:54:48.0055572Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:48.0055843Z               "line": 268
2026-08-28T09:54:48.0056096Z             }
2026-08-28T09:54:48.0056348Z           ]
2026-08-28T09:54:48.0056596Z         },
2026-08-28T09:54:48.0056860Z         "unit": {
2026-08-28T09:54:48.0057136Z           "complete": true,
2026-08-28T09:54:48.0057403Z           "evidence": [
2026-08-28T09:54:48.0057665Z             {
2026-08-28T09:54:48.0058025Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0058302Z               "line": 1912
2026-08-28T09:54:48.0058551Z             },
2026-08-28T09:54:48.0058799Z             {
2026-08-28T09:54:48.0059227Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0059499Z               "line": 1418
2026-08-28T09:54:48.0059866Z             },
2026-08-28T09:54:48.0060114Z             {
2026-08-28T09:54:48.0060512Z               "path": "crates/spt-store/src/liveness.rs",
2026-08-28T09:54:48.0060793Z               "line": 412
2026-08-28T09:54:48.0061047Z             },
2026-08-28T09:54:48.0061299Z             {
2026-08-28T09:54:48.0061638Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:48.0061909Z               "line": 778
2026-08-28T09:54:48.0062156Z             }
2026-08-28T09:54:48.0062409Z           ]
2026-08-28T09:54:48.0062658Z         }
2026-08-28T09:54:48.0062907Z       }
2026-08-28T09:54:48.0063233Z     },
2026-08-28T09:54:48.0063503Z     {
2026-08-28T09:54:48.0063822Z       "id": "REQ-RELAY-NO-BUSY-DELIVER",
2026-08-28T09:54:48.0073599Z       "title": "MSG-IDENTITY W4 (operator self-send probe 2026-07-09, companion leg): the relay/idle-inject carrier MUST NOT fire for an ACTIVE endpoint — the daemon already guards send-time (daemon.stderr.log: 'ENDPOINT_INJECT: endpoint ACTIVE -> spool (deferred hint), not injected') yet the field row ended taken_leg='idle-inject' for a message sent while the endpoint was ACTIVE, so the guard is bypassed somewhere on the busy-to-idle EDGE (the parked-drain idle-injects rows that arrived during busy without re-checking whether a poll is concurrently draining them — the edge itself is when BOTH carriers are plausibly live). RCA-FIRST with REQ-CARRIER-CLAIM-EXCLUSIVE (same rig, same instrument); if the exclusive claim alone closes the double-delivery this leg may reduce to an ordering assertion — rule at RCA lock, don't build blind. Gate: unit — the idle-edge drain re-verifies activity (or defers to the claim) before idle-injecting; a row taken by a poll is never idle-injected. Kin REQ-IDLE-PARKED-DELIVERY (the drain this guards), REQ-MSG-IDLE-EDGE-DRAIN, F-023 anti-starvation gate (do NOT break the already-idle delivery class).",
2026-08-28T09:54:48.0073939Z       "requiredStages": [
2026-08-28T09:54:48.0074192Z         "unit"
2026-08-28T09:54:48.0074440Z       ],
2026-08-28T09:54:48.0074712Z       "stages": {
2026-08-28T09:54:48.0075036Z         "doc": {
2026-08-28T09:54:48.0075317Z           "complete": false,
2026-08-28T09:54:48.0075589Z           "evidence": []
2026-08-28T09:54:48.0075850Z         },
2026-08-28T09:54:48.0076109Z         "impl": {
2026-08-28T09:54:48.0076393Z           "complete": false,
2026-08-28T09:54:48.0076672Z           "evidence": []
2026-08-28T09:54:48.0076925Z         },
2026-08-28T09:54:48.0077182Z         "int": {
2026-08-28T09:54:48.0077464Z           "complete": false,
2026-08-28T09:54:48.0077735Z           "evidence": []
2026-08-28T09:54:48.0077994Z         },
2026-08-28T09:54:48.0078256Z         "unit": {
2026-08-28T09:54:48.0078595Z           "complete": true,
2026-08-28T09:54:48.0078863Z           "evidence": [
2026-08-28T09:54:48.0079189Z             {
2026-08-28T09:54:48.0079523Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.0079799Z               "line": 1621
2026-08-28T09:54:48.0080052Z             }
2026-08-28T09:54:48.0080305Z           ]
2026-08-28T09:54:48.0080554Z         }
2026-08-28T09:54:48.0080811Z       }
2026-08-28T09:54:48.0081054Z     },
2026-08-28T09:54:48.0081315Z     {
2026-08-28T09:54:48.0081637Z       "id": "REQ-RELEASE-CHANNEL-PRIVATE",
2026-08-28T09:54:48.0087905Z       "title": "THE-FORKENING W2 (ADR-0036 §2): the publish pipeline targets `BigscreenVR/spt-bs-releases` — release.yml assemble/draft/flip retargeted (draft lands on the bs releases repo, untagged, per the existing spt-releases pattern); docs-publish.yml RETIRED (no public docs, ADR-0014 superseded) with the mdbook build folded into ci.yml as the drift gate (CLAUDE.md mandate: doc generation stays CI-gated); counter + signing key + update-set format CONTINUE unchanged (trust anchor is the continuity, carrier is not). Gate: impl — workflow retarget + drift-gate fold; int — a full release dry-run assembles binaries + docs asset + signed update-set against the private channel. Kin REQ-DOCS-RELEASE-ASSET, REQ-UPDATE-GH-TRANSPORT, ADR-0036.",
2026-08-28T09:54:48.0088287Z       "requiredStages": [
2026-08-28T09:54:48.0088554Z         "impl",
2026-08-28T09:54:48.0088808Z         "int"
2026-08-28T09:54:48.0089179Z       ],
2026-08-28T09:54:48.0089442Z       "stages": {
2026-08-28T09:54:48.0089701Z         "doc": {
2026-08-28T09:54:48.0089982Z           "complete": false,
2026-08-28T09:54:48.0090255Z           "evidence": []
2026-08-28T09:54:48.0090508Z         },
2026-08-28T09:54:48.0090771Z         "impl": {
2026-08-28T09:54:48.0091056Z           "complete": true,
2026-08-28T09:54:48.0091323Z           "evidence": [
2026-08-28T09:54:48.0091642Z             {
2026-08-28T09:54:48.0091990Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.0092268Z               "line": 574
2026-08-28T09:54:48.0092521Z             },
2026-08-28T09:54:48.0092779Z             {
2026-08-28T09:54:48.0093122Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:48.0093389Z               "line": 17
2026-08-28T09:54:48.0093652Z             },
2026-08-28T09:54:48.0093905Z             {
2026-08-28T09:54:48.0094253Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:48.0094515Z               "line": 223
2026-08-28T09:54:48.0094776Z             }
2026-08-28T09:54:48.0095021Z           ]
2026-08-28T09:54:48.0095274Z         },
2026-08-28T09:54:48.0095512Z         "int": {
2026-08-28T09:54:48.0095788Z           "complete": true,
2026-08-28T09:54:48.0096065Z           "evidence": [
2026-08-28T09:54:48.0096313Z             {
2026-08-28T09:54:48.0096656Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:48.0096928Z               "line": 225
2026-08-28T09:54:48.0097191Z             }
2026-08-28T09:54:48.0097442Z           ]
2026-08-28T09:54:48.0097697Z         },
2026-08-28T09:54:48.0097955Z         "unit": {
2026-08-28T09:54:48.0098237Z           "complete": false,
2026-08-28T09:54:48.0098513Z           "evidence": []
2026-08-28T09:54:48.0098761Z         }
2026-08-28T09:54:48.0099086Z       }
2026-08-28T09:54:48.0099338Z     },
2026-08-28T09:54:48.0099590Z     {
2026-08-28T09:54:48.0099978Z       "id": "REQ-RELEASE-MUSL-ARTIFACT",
2026-08-28T09:54:48.0107370Z       "title": "MUSL-TIER W3 (CI build + signed release + update-set publish + self-update E2E): release.yml gains a musl matrix entry (build on kitsubito; install musl-tools+cmake+target in-job, CC_x86_64_unknown_linux_musl=musl-gcc); the assemble job includes spt-x86_64-linux-musl in SHA256SUMS + the release upload; release-publish (xtask) signs the musl artifact; the update-set carries its artifact entry. This closes the field gap: a musl binary today fetches fine but ends UPDATE_FETCH_REJECTED:NoArtifactForPlatform('unknown'). Gate (release-pipeline touch -> real E2E): cut a draft/test release with the musl artifact; a static musl binary on a sub-2.39-glibc box runs spt update fetch -> gets the musl artifact (no NoArtifactForPlatform), verifies SHA256+signature over the musl bytes, applies, self-updates. musl is ADDITIVE — gnu stays the default Linux artifact.",
2026-08-28T09:54:48.0107729Z       "requiredStages": [
2026-08-28T09:54:48.0107988Z         "impl",
2026-08-28T09:54:48.0108252Z         "unit",
2026-08-28T09:54:48.0108515Z         "int"
2026-08-28T09:54:48.0108768Z       ],
2026-08-28T09:54:48.0109116Z       "stages": {
2026-08-28T09:54:48.0109369Z         "doc": {
2026-08-28T09:54:48.0109655Z           "complete": false,
2026-08-28T09:54:48.0109923Z           "evidence": []
2026-08-28T09:54:48.0110174Z         },
2026-08-28T09:54:48.0110437Z         "impl": {
2026-08-28T09:54:48.0110717Z           "complete": true,
2026-08-28T09:54:48.0110999Z           "evidence": [
2026-08-28T09:54:48.0111261Z             {
2026-08-28T09:54:48.0111614Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:48.0111876Z               "line": 33
2026-08-28T09:54:48.0112129Z             },
2026-08-28T09:54:48.0112381Z             {
2026-08-28T09:54:48.0112729Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:48.0113057Z               "line": 172
2026-08-28T09:54:48.0113312Z             }
2026-08-28T09:54:48.0113576Z           ]
2026-08-28T09:54:48.0113824Z         },
2026-08-28T09:54:48.0114081Z         "int": {
2026-08-28T09:54:48.0114352Z           "complete": true,
2026-08-28T09:54:48.0114628Z           "evidence": [
2026-08-28T09:54:48.0114882Z             {
2026-08-28T09:54:48.0115258Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:48.0115524Z               "line": 174
2026-08-28T09:54:48.0115774Z             }
2026-08-28T09:54:48.0116029Z           ]
2026-08-28T09:54:48.0116438Z         },
2026-08-28T09:54:48.0116700Z         "unit": {
2026-08-28T09:54:48.0116981Z           "complete": true,
2026-08-28T09:54:48.0117248Z           "evidence": [
2026-08-28T09:54:48.0117500Z             {
2026-08-28T09:54:48.0117824Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.0118091Z               "line": 2178
2026-08-28T09:54:48.0118354Z             }
2026-08-28T09:54:48.0118615Z           ]
2026-08-28T09:54:48.0118861Z         }
2026-08-28T09:54:48.0119204Z       }
2026-08-28T09:54:48.0119452Z     },
2026-08-28T09:54:48.0119704Z     {
2026-08-28T09:54:48.0120052Z       "id": "REQ-RELEASE-VERSION-TAG-ASSERT",
2026-08-28T09:54:48.0139404Z       "title": "releases#106: the release workflow REFUSES to publish a release whose built binary disagrees with the tag. `.github/workflows/release.yml` already guards the CHANGELOG against the tag (`ver=\"${GITHUB_REF_NAME#v}\"`, `::error::` + `exit 1`) but nothing proves the ARTIFACT carries that version — a tag pushed without bumping `[workspace.package] version` (and the first-party `spt-*` lines in `Cargo.lock`) ships a binary that self-reports the previous release. Shape: after the platform builds and BEFORE `gh release create`, execute the freshly built binary FOR THE RUNNER'S OWN PLATFORM with `--version`, compare to `${GITHUB_REF_NAME#v}`, and on mismatch fail with a named error stating BOTH values and naming the fix. SCOPE CONSTRAINT, load-bearing: a cross-compiled `matrix.target` artifact CANNOT be executed on the runner, so the assert must sit where a natively-runnable artifact is in scope — the native (non-`matrix.target`) leg, or the notes job after artifact download if the native asset is fetchable there. The assert lands in the RELEASE workflow, never as a new CI window (two-runs-per-sha ruling). SHIPPED SITE: the `assemble` job after `download-artifact` and before the docs bundle and `gh release create` — the one place the whole asset set exists at once on a box that can natively execute part of it, and the bytes there are the ones about to be published rather than a build-tree lookalike. The two Linux assets are covered; the WINDOWS asset is not, stated rather than glossed — no Linux runner can execute it, and a matching Linux artifact is evidence the workspace version was bumped, not evidence the Windows leg built from that tree. VERIFICATION STANCE, recorded at mint and honored: the workflow is tag-triggered and cannot be run locally, so no green is claimed for it. Instead the logic was EXTRACTED to `.github/ci/release-version-assert.sh` (the repo's own convention for CI logic, beside `ci-notify.sh` and the reap-census pair) precisely so it stops being unrehearsable, and its selftest runs on every golden Linux leg. Gate: impl — the script plus release.yml calling it; unit — `release-version-assert-selftest.sh`, 12 assertions, over half of them negative controls (stale binary, binary ahead of tag, missing artifact, unrunnable binary, empty asset list, absent tag).",
2026-08-28T09:54:48.0139899Z       "requiredStages": [
2026-08-28T09:54:48.0140172Z         "impl",
2026-08-28T09:54:48.0140434Z         "unit"
2026-08-28T09:54:48.0140697Z       ],
2026-08-28T09:54:48.0140959Z       "stages": {
2026-08-28T09:54:48.0141226Z         "doc": {
2026-08-28T09:54:48.0141516Z           "complete": false,
2026-08-28T09:54:48.0141798Z           "evidence": []
2026-08-28T09:54:48.0142050Z         },
2026-08-28T09:54:48.0142309Z         "impl": {
2026-08-28T09:54:48.0142651Z           "complete": true,
2026-08-28T09:54:48.0142933Z           "evidence": [
2026-08-28T09:54:48.0143194Z             {
2026-08-28T09:54:48.0143609Z               "path": ".github/ci/release-version-assert.sh",
2026-08-28T09:54:48.0143887Z               "line": 34
2026-08-28T09:54:48.0144139Z             },
2026-08-28T09:54:48.0144400Z             {
2026-08-28T09:54:48.0144751Z               "path": ".github/workflows/release.yml",
2026-08-28T09:54:48.0145017Z               "line": 151
2026-08-28T09:54:48.0145274Z             }
2026-08-28T09:54:48.0145580Z           ]
2026-08-28T09:54:48.0145837Z         },
2026-08-28T09:54:48.0146171Z         "int": {
2026-08-28T09:54:48.0146457Z           "complete": false,
2026-08-28T09:54:48.0146725Z           "evidence": []
2026-08-28T09:54:48.0146981Z         },
2026-08-28T09:54:48.0147244Z         "unit": {
2026-08-28T09:54:48.0147520Z           "complete": true,
2026-08-28T09:54:48.0147789Z           "evidence": [
2026-08-28T09:54:48.0148046Z             {
2026-08-28T09:54:48.0148508Z               "path": ".github/ci/release-version-assert-selftest.sh",
2026-08-28T09:54:48.0148781Z               "line": 22
2026-08-28T09:54:48.0149119Z             },
2026-08-28T09:54:48.0149377Z             {
2026-08-28T09:54:48.0149729Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.0149997Z               "line": 321
2026-08-28T09:54:48.0150248Z             }
2026-08-28T09:54:48.0150503Z           ]
2026-08-28T09:54:48.0150756Z         }
2026-08-28T09:54:48.0151009Z       }
2026-08-28T09:54:48.0151257Z     },
2026-08-28T09:54:48.0151510Z     {
2026-08-28T09:54:48.0151814Z       "id": "REQ-RESIDENT-SERVICE",
2026-08-28T09:54:48.0337327Z       "title": "ResidentService substrate (ADR-0049, design ratified 2026-07-26): a daemon-supervised binary an adapter declares via a `[service]` manifest section — core-owned from birth, NO perch/identity/address. SPAWN: the daemon launches it job-neutrally (detached_no_inherit + the cold-start ladder posture), so it is never a shell's child (`/T` tree-kill cannot reach it; the shell-descendant hazard class of REQ-SHELL-ADAPTER-OWNED-DETACHED-SERVICE never arises) and never inside a launching terminal's Job Object (the REQ-SHELL-CLI-SPAWN-JOB-EXPOSURE service half closes by construction). START TRIGGER declared in the manifest: start = 'boot' or start = 'bind'; supervised identically once running, with the wake-watcher scaffolding (backoff, give-up latch, one-per-instance lock, orphan-kill, brain-side reconcile) minus the offline-only flip. 'boot' is DESIRED-STATE-RUNNING, not an event: the supervisor reconciles a boot service toward running at EVERY opportunity — daemon boot, ADAPTER REGISTRATION while the daemon is live (operator addition 2026-07-26: installing or registering an adapter whose manifest declares a boot service starts it THEN — spt itself is never restarted to bring a new adapter's service up), update-hold release, and first shell bind as the defensive ensure. 'bind' starts only at the adapter's first shell bind. CARDINALITY: one supervised instance per registered adapter-option `<adapter>[:profile]` (consumer-confirmed as COHERENT TARGET SHAPE — flynn's precision, 2026-07-26: not exercisable by the first consumer until per-option config dirs exist; alchemy today has one config dir and daemon.toml carries exactly one guild_id); the adapter may keep its own kernel file lock as a private double-start guard — core neither reads nor depends on it. PER-OPTION IDENTITY IS THREADED (flynn's gap, accepted): the supervisor passes the adapter-option name and the per-option runtime dir into the service's spawn environment, so an adapter can scope its private guard AND its config per option — the mechanism that makes two-options-two-services deliverable rather than merely permitted. Without it, two options resolving one adapter config dir produce the silent flap flynn derived: instance two exits immediately on the kernel lock, core sees only start-then-die, and crash-relaunch backoff is CORRECT behavior against that observation — two correct components disagreeing about the unit. UPDATE IS A FIRST-CLASS SUPERVISOR OPERATION WITH AN EXPLICIT HOLD: quiesce -> hold (stopped and NEVER relaunched while held) -> bits swap -> start new bits -> release; adapter update-apply performs this ordered operation; crash-relaunch with backoff applies ONLY when not held. The forcing case is structural, not advisory (flynn, argued against their own convenience): an eager relaunch during a swap re-pins the OLD exe mid-deploy (Windows exe lock), converting a diagnosable os-error-5 into an unwinnable race — if delivery must sequence, the hold ships FIRST and a dead service stays dead until told otherwise (the STALE-ONLINE no-spontaneous-relaunch ruling, same reason, one layer down). FAST-EXIT IS A CONFIGURATION FAULT, NOT A CRASH: consecutive immediate exits (exit within a startup threshold, N in a row) trip the give-up latch EARLY with a distinct loud STARTUP_FAULT diagnostic carrying the captured early stderr — a double-start lock conflict then reads as the configuration fault it is, never as a silently flapping service ground through backoff. QUIESCE IS COOPERATIVE EXIT + DEADLINE: the supervisor places a stop-request marker (a file in the service's runtime dir — polling services observe it on their next cycle; no inbox exists or is added); the service exits WHEN SAFE and the kernel-observed exit IS the ack — 'not ready' is expressed by not-yet-exiting, so no busy record exists to go stale in either direction; a manifest-declared grace deadline (default ~30s) bounds the wait, then force-kill. Delay possible, veto never. An OPTIONAL advisory status line may surface in service status display — never consulted for decisions. LIVENESS IS DERIVED, NEVER RECORDED: the supervisor is the parent and holds the child handle (exit is kernel-observed); no supervisor-maintained running-record exists (the v0.43.0 stale-online lesson applied one layer down — flynn's condition, structural here). Any status/version identity surface keeps the locked-file split lesson: never require reading a file the service holds an exclusive OS lock on (Windows). CLI INVOCATION CAPABILITY (consumer-blocking, non-negotiable per flynn): the supervisor threads the environment so the service can invoke the spt CLI (`spt send` et al., identityless cli@node from-label, durable spooling per ADR-0002) — if a supervised Hub cannot shell out to spt send, node-wide Watch delivery dies silently. ADDRESSING: none — a service needing a two-way agent-facing surface has one at its adapter's endpoint/shell layer (the alchemy layering argument that re-scoped ADR-0023's faceless-service rejection); AlwaysOnEndpoint (REQ-EP-8) = this substrate + the addressable front. Gate at activation (all legs against a MOCK service adapter — the gate never depends on the first consumer being the boot specimen): int — a manifest [service start='boot'] binary rises with the daemon job-neutrally, a registration of that manifest against an ALREADY-LIVE daemon starts the service without any restart, survives a shell teardown of the same adapter (tree-kill does not reach it), a held update swaps bits with zero relaunch races (hold observed under a concurrent crash), quiesce marker -> cooperative exit within grace, deadline -> force-kill on a wedged mock, a mock that exits instantly N consecutive times surfaces STARTUP_FAULT (not a backoff flap), and the service successfully invokes spt send from its supervised environment. ACTIVATED FOR W1 2026-07-26 WITH THE FOLLOWING BUILD RULINGS FOLDED IN (doyle; constraints live in the artifact, not the dispatch thread). VERB SURFACE: the operator-facing verbs are `spt adapter service list` (all registered options + derived state) and `spt adapter service status <adapter[:profile]>`, nested under the ADAPTER group — NOT a bare `spt service`. Reason: 'service' is ALREADY public surface carrying an unrelated meaning — the platform daemon-service abstraction (REQ-DAEMON-6/-8, `crates/spt-daemon/src/service.rs`: the systemd user unit vs the Windows at-logon task) surfaces in `spt daemon` help as 'registered OS service' / 'managed service' / 'the managing service label'. Ownership-scoping separates the two meanings permanently: the OS-service is the DAEMON's and lives under `spt daemon`; the resident service is the ADAPTER's and lives under `spt adapter`. ADR-0049's 'service status display' means `spt adapter service status`; the W1 PR carries a one-line ADR errata note. GIVE-UP LATCH SCOPE: the latch suppresses relaunch grinding until something plausibly changed — it is NOT a durable verdict. Cleared by exactly three events: (1) DAEMON BOOT — desired-state-running enumerates boot as a reconcile opportunity with NO latch exception, and the re-trip is bounded (N fast exits) and LOUD (STARTUP_FAULT re-fires each boot); an in-memory per-daemon-lifetime latch is an acceptable implementation, and if the durable-marker scaffolding is reused then boot clears the marker; (2) ADAPTER RE-REGISTRATION — declared intent that manifest/config changed, reconciling immediately; (3) UPDATE-HOLD RELEASE — new bits invalidate the fault evidence. NOT cleared by the first-shell-bind ensure: a bind changes nothing about the service's config, so the bind-time reconcile SKIPS latched services — otherwise ordinary shell use converts the latch into the very flap it exists to stop. The REJECTED alternative is recorded deliberately: a durable latch with explicit-clear-only leaves an operator's already-fixed config fault sitting behind a service that stays dead and quiet forever — loud-bounded beats quiet-permanent (the heal-assigns-owner-never-closes shape one layer down). SANCTIONED BUT NOT W1-REQUIRED: `spt adapter service restart <adapter[:profile]>` as the explicit manual clear+reconcile — take it into W1 only if cheap once the verb group exists; the three automatic clears ARE the requirement. REGISTRATION-TIME START IS A WIRE OP: `registry::register` runs in the CLI PROCESS (`crates/spt/src/cli.rs`, the adapter-add and adapter-update call sites), so it cannot itself start anything in the daemon — registration-starts-the-service structurally requires ONE new adapter-scoped daemon IPC op, semantically `AdapterServiceReconcile { adapter }` (exact spelling matched to house op style where it lands), which the CLI calls after a SUCCESSFUL register on BOTH paths when the daemon is reachable. The daemon handler runs THE SAME reconcile code path as boot / hold-release / bind — ONE reconcile function taking an opportunity discriminant, never a second start authority. The response is a per-option outcome list (started / already-running / held / latched / bind-deferred / startup-fault) so the CLI prints honest per-option text. Daemon NOT reachable: registration STILL SUCCEEDS — never a refusal — and the CLI prints a REQUIRED notice that the service is declared, the daemon is not running, and it will come up at the next daemon boot. That notice is CONTRACT, not courtesy. RUNTIME-DIR ENCODING: cardinality is per adapter-option, so the option name becomes a PATH component and `:` is illegal in a Windows path. Core NEVER uses the raw option string as a path component — every construction site goes through ONE shared encoder, and that encoding MUST BE INJECTIVE (a lossless escape, never a strip/replace that can collide). Two distinct options mapping to one runtime dir means two services sharing a quiesce-marker namespace: the silent flap one layer down. The unit gate MUST include a collision-adversarial pair (e.g. if `:` maps to `_`, then `a:b` and `a_b` must remain distinct). MODULE PLACEMENT: the supervisor lands as `servicehost.rs` (the established `*host` convention — shellhost, harnesshost, linkhost, applyhost); `service.rs` is untouched and BOTH module headers cross-reference the other meaning of 'service'. INSTALL-DIR RESOLUTION RIDES W1 (operator-requested via flynn, ruled in after code verification): the `[service]` spawn resolves its binary through the EXISTING REQ-INSTALL-11 helper — the same primitive, NO parallel resolution path — and the same wiring lands at the two shell-family fill sites, which today resolve NEITHER the install-dir program token NOR `{adapter_dir}`. Without it a `--release`-installed shell adapter registers but cannot spawn (bare token → os error 2; `{adapter_dir}/x` → 'no value for substitution key'), released shell adapters need a hand-maintained per-node manifest, `spt adapter update` on them is a permanent no-op, and THIS req's hold/swap/start ceremony would be exercisable by MOCK ONLY — never by the named first consumer. Site census discharged BEFORE build (authoritative grep, cfg(test) excluded, accepted by doyle): the production template-fill sites are `shellhost.rs::fill_spawn_command` and `shellwake.rs::fill_wake_command` (both targets — threading not shape, since the wake caller already holds `AdapterRecord.source_dir`, which IS the install dir), plus `harnesshost.rs` session `role.command`, which is OUT OF SCOPE and already resolves correctly through `resolve_program_in_dir`. Scope guard: shell spawn/wake + `[service]` ONLY — this does NOT expand into the `[session.self]`/`[history]` follow-on sites. FAULT COUNTERS ARE TWO, NOT ONE (ruled 2026-07-26 after the builder surfaced the reading): (1) the FAST-EXIT counter increments ONLY on exits whose uptime is UNDER the startup threshold, and RESETS the moment any run EXCEEDS that threshold. Without the reset the latch mislabels slow-crash decay as a configuration fault — the latch lying about cause, which is worse than no latch. STARTUP_FAULT is reserved for THIS path alone. (2) The ORDINARY consecutive-crash give-up (the shell wake-watcher scaffolding's `give_up_after` = 6, deliberately UPTIME-BLIND) sits BEHIND it UNCHANGED in W1 and keeps its existing diagnostic label — no silent behavior fork from the shell watcher. (3) BOTH counters reset on the latch-clear events above (daemon boot, adapter re-registration, update-hold release): a clear that left either counter primed would relatch on the first post-clear crash and thereby defeat the clear. (4) NOTED-OPEN, deliberately NOT W1 and NOT a promise: the ordinary counter's uptime-blindness means a service that crashes once a day gives up after six days and then stays down until a clear event. Whether that decay behavior is right for SERVICES (as opposed to the shell watchers it was designed for) is a future ruling; it is recorded here as open so the next builder inherits the question rather than rediscovering it in the field. ORPHAN ADOPTION IS IMAGE-VERIFIED, AND ITS PLATFORM GAP IS RECORDED-OPEN (ruled 2026-07-26 after the builder surfaced the trade): a fresh daemon kills a dead daemon's parked orphan ONLY by path-verified identity — a live pid whose image path cannot be READ classifies `Unverifiable` and BLOCKS adoption, i.e. the start refuses loudly rather than proceeding. Loud-blocked over quietly-double-started is this design's whole posture (a bare-pid kill is the recycled-pid class, and a double-start is the silent flap the cardinality rule exists to prevent). RECORDED-OPEN consequence, NOT debt owed by W1: the image oracle is `/proc` on unix, so a unix WITHOUT `/proc` (macOS/BSD) would block on every live orphan until that pid dies. This is theoretical for every platform we ship — win, linux-gnu, musl — and no macOS/BSD asset exists; a future builder adding one inherits the question here rather than rediscovering it in the field. SUPERVISOR PLACEMENT IS BROKER-SIDE (ruled 2026-07-26): the supervised set, its boot sweep and the reconcile control socket live in the BROKER process, beside the digest/drive/tunnel hubs — NOT in the restartable brain child that hosts shellwake. Two reasons, both structural. (a) A supervisor owns LIVE CHILD HANDLES and, from the update ceremony on, an in-memory HOLD: that is a daemon-lifetime continuity resource, which is the ADR-0018 Q2/Q5 broker-side test; the Q5 exception that put shellwake in the brain reads 'a pure disk-reconciler' and this is not one. (b) A brain restart is the ROUTINE UPDATE PATH (StartReason::Update exists precisely for it), so brain-hosting would bounce every resident service through the orphan-adoption path with no quiesce, no grace and no hold — the ungoverned bounce this req's ordered update operation exists to replace — and would lose the hold mid-swap. Broker-hosting is also what makes the wire op possible at all: all control sockets are broker-served because a CLI cannot reach brain memory (stated in drivehub.rs's module header and obeyed by every hub). NO PERIODIC SWEEP — CHOSEN, NOT OMITTED (ruled 2026-07-26): the supervisor host runs the boot sweep and then parks; there is deliberately no timer re-sweeping on a cadence. The four ruled opportunities are all EVENTS, each with a caller that enters the one reconcile function directly, so a timer would be a FIFTH start authority nobody ruled in — and its only distinctive work would be silently healing a failed registration nudge, converting a diagnosable defect into invisible behavior. The REQUIRED daemon-unreachable notice is the honest answer to that case; machinery that papers over its own failure class is refused (the same instrument-soundness razor as the rest of this design). A SUPERVISOR WHOSE DECLARATION DISAPPEARS RECONCILES TOWARD STOPPED (ruled into W1 2026-07-26): every sweep runs a STOP side before its start side — an option whose adapter is soft-deregistered, hard-removed, or whose manifest no longer declares a [service] is torn down through the handle that names its child. This is the symmetric half of desired-state-running, not an addition to it: without it a deregistered adapter's binary outlives its own registration until the daemon dies, which is exactly the ungoverned-lifetime shape this req abolishes. TREE TEARDOWN ON EVERY SUPERVISOR-INITIATED KILL (ruled 2026-07-26): the force-kill deadline is where the unconditional-kill promise is WRITTEN, but it is not the boundary of the problem — a supervised service's descendants are torn down on every kill the supervisor initiates, including daemon-shutdown stop_all and the stop-side sweep teardown. Descendants outliving THOSE paths are strictly worse off than ones outliving a force-kill, because the next daemon's orphan sweep is structurally blind to them: it knows one parked pid and holds no handle to anything below it. Windows reaches the tree through a SUPERVISOR-OWNED Job Object assigned at birth (CREATE_SUSPENDED -> AssignProcessToJobObject -> resume, so no descendant is ever spawned outside the job; KILL_ON_JOB_CLOSE deliberately OFF, so a dying supervisor is never an unannounced service outage); unix through the process group setsid already establishes. Job-NEUTRALITY is not contradicted: that invariant governs OTHER people's jobs reaching our processes, which CREATE_BREAKAWAY_FROM_JOB still handles at birth. A job the OS refuses is a LOUD DEGRADE, never a refusal to start: the process still dies on demand and only its descendants become unreachable, which is exactly where this path stood before the job existed — refusing the spawn would convert a bounded descendant leak into a total outage over a failure in an OS facility rather than in anything the adapter declared. THE TREE PROMISE STATES ITS EDGE (ruled 2026-08-03, IR-16): a teardown whose TREE reach FAILS — as distinct from a job never acquired — does not silently wear the unconditional promise. It announces `SERVICE_TREE_KILL_INCOMPLETE`, naming the LOSS (the tree claim was not honored; descendants may still be running and nothing holds a handle to them) rather than the syscall, alongside the pid, the failed reach and the OS error; the process kill proceeds regardless, so this is a NAMED EXCEPTION to tree-teardown-on-every-kill and never a refusal to kill. It is the kill-time twin of `SERVICE_JOB_UNAVAILABLE` — ONE loss, one vocabulary, both ends of the lifetime, each code naming the other so grepping either finds both. THE SPAWN-SIDE DEGRADE RULING ABOVE MUST NOT BE CITED FOR THIS ARM: it rests on refusal costing a total outage, which is true at spawn and false at kill, where the process kill proceeds either way and refusing the tree claim costs the caller nothing — the two share a noun and not an argument. THE QUIET ARMS ARE A WHITELIST, so an unforeseen failure announces rather than being swallowed: on unix `ESRCH` ALONE is quiet (MEASURED 2026-08-03, Linux 6.8.0-124: `kill(-pgid, SIGKILL)` returns 0 for a live group AND for a group whose only member is an unreaped zombie, and `ESRCH` only once the group is gone and reaped — and since this path never reaps first, `ESRCH` means something else already did, which is the path where the supervisor took its exited branch and never called the teardown at all); on Windows the DIRECT-PROCESS return is not checked at ALL (MEASURED 2026-08-03, Win 11 Pro 10.0.26200: `TerminateProcess` against a handle to an already-exited process returns 0 with `GetLastError` 5 `ERROR_ACCESS_DENIED`, so a check there would fire on the ordinary path), because that arm already carries the strictly stronger downstream liveness confirm behind `SERVICE_KILL_UNCONFIRMED` and a second weaker rule beside a working one is refused. A FALLBACK PROCESS-TABLE TREE-WALK WAS CONSIDERED AND REFUSED as the degraded arm — the ceiling is chosen, not missed: live `(pid, ppid)` descent breaks at the middle hop the teardown itself kills, returning an empty set in exactly the failure case it would exist to detect (a silent loss upgraded to a false clean), and it would kill by bare pid, reintroducing product-side the recycled-pid class. Growing this into an image-authenticated population sweep stays open as its own instrument. DISCRIMINATION: a teardown failure WITH this code is this arm; WITHOUT it, a survivor is a victim of a bare-pid mis-kill — the two must not be blurred by wording. THE STATUS SURFACE IS DAEMON-ANSWERED OR IT SAYS NOTHING (ruled 2026-07-26, the leg-D companion of the tree-teardown ruling): the CLI NEVER derives service state from the pid file. Either the daemon answers `spt adapter service list|status` over the control socket, or the CLI prints that the daemon is not running — verbatim, and with no fallback read. The pid file is a KILL HANDLE for the NEXT daemon, and reading it as liveness in a display surface is the v0.43.0 STALE-ONLINE class one layer down: a record answering a question the record cannot know. Three properties follow and are requirements, not implementation taste. (a) The status op is a PROJECTION over the live supervised set — the supervision threads, the hold flags and the stand-down records — plus the registry; it starts, stops, holds and kills nothing, because a diagnostic that converges the thing it measures is a start authority wearing a diagnostic's clothes. (b) A row reports its EVIDENCE: a latch surfaces with the captured startup output behind it, since a fault reported without its cause is the instrument failing at its one job. (c) An option SUPERVISED WITHOUT A DECLARATION behind it is reported as exactly that rather than hidden — with no periodic sweep, a deregistered adapter's supervisor lives until the next opportunity's stop side reaches it, and that window is precisely when an operator asks what is running. THE ADVISORY STATUS LINE IS DISPLAY-ONLY AND BOUNDED: the service may write one line into its runtime dir (named in docs/MANIFEST.md beside the stop-request marker, so it is implementable); core reads the FIRST line under a byte cap, treats an unreadable file as simply no advisory (the locked-file split rule holds), and consults it for NO decision — core deciding on it would put a least-trusted binary's self-report in the control path, and a service that stopped updating it would silently become whatever it last claimed. WIRE LENIENCY IS PLACED, NOT SPRINKLED: fields a reader BRANCHES on stay typed with a `#[serde(other)]` unknown arm (KH-2.3), while a field only ever ECHOED carries the daemon's label verbatim — re-deriving a lenient copy of the manifest's validated `start` vocabulary for the wire would weaken the one place strictness matters (registration). An op an older daemon predates HANGS UP rather than reading the request and answering nothing: a server that silently ignores an unknown kind leaves the caller blocked on a reply that never comes, so an older daemon would WEDGE a newer CLI instead of failing it.",
2026-08-28T09:54:48.0339844Z       "requiredStages": [
2026-08-28T09:54:48.0340122Z         "doc",
2026-08-28T09:54:48.0340393Z         "impl",
2026-08-28T09:54:48.0340652Z         "unit",
2026-08-28T09:54:48.0340905Z         "int"
2026-08-28T09:54:48.0341162Z       ],
2026-08-28T09:54:48.0341426Z       "stages": {
2026-08-28T09:54:48.0341683Z         "doc": {
2026-08-28T09:54:48.0346627Z           "complete": true,
2026-08-28T09:54:48.0346932Z           "evidence": [
2026-08-28T09:54:48.0347200Z             {
2026-08-28T09:54:48.0347509Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:48.0347887Z               "line": 415
2026-08-28T09:54:48.0348143Z             }
2026-08-28T09:54:48.0348409Z           ]
2026-08-28T09:54:48.0348670Z         },
2026-08-28T09:54:48.0348927Z         "impl": {
2026-08-28T09:54:48.0349305Z           "complete": true,
2026-08-28T09:54:48.0349576Z           "evidence": [
2026-08-28T09:54:48.0349833Z             {
2026-08-28T09:54:48.0350201Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.0350486Z               "line": 5404
2026-08-28T09:54:48.0350743Z             },
2026-08-28T09:54:48.0350999Z             {
2026-08-28T09:54:48.0351361Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.0351632Z               "line": 9491
2026-08-28T09:54:48.0351886Z             },
2026-08-28T09:54:48.0352138Z             {
2026-08-28T09:54:48.0352501Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.0352772Z               "line": 9593
2026-08-28T09:54:48.0353039Z             },
2026-08-28T09:54:48.0353301Z             {
2026-08-28T09:54:48.0353653Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0353930Z               "line": 351
2026-08-28T09:54:48.0354320Z             },
2026-08-28T09:54:48.0354620Z             {
2026-08-28T09:54:48.0355007Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0355279Z               "line": 1053
2026-08-28T09:54:48.0355526Z             },
2026-08-28T09:54:48.0355803Z             {
2026-08-28T09:54:48.0356276Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0356549Z               "line": 1303
2026-08-28T09:54:48.0356801Z             },
2026-08-28T09:54:48.0357054Z             {
2026-08-28T09:54:48.0357403Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0357674Z               "line": 1418
2026-08-28T09:54:48.0357928Z             },
2026-08-28T09:54:48.0358179Z             {
2026-08-28T09:54:48.0358538Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0358817Z               "line": 1548
2026-08-28T09:54:48.0359235Z             },
2026-08-28T09:54:48.0359521Z             {
2026-08-28T09:54:48.0359874Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0360145Z               "line": 1564
2026-08-28T09:54:48.0360393Z             },
2026-08-28T09:54:48.0360650Z             {
2026-08-28T09:54:48.0361014Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0361294Z               "line": 1680
2026-08-28T09:54:48.0361550Z             },
2026-08-28T09:54:48.0361907Z             {
2026-08-28T09:54:48.0362288Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0362560Z               "line": 1721
2026-08-28T09:54:48.0362808Z             },
2026-08-28T09:54:48.0363056Z             {
2026-08-28T09:54:48.0363414Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0363682Z               "line": 1733
2026-08-28T09:54:48.0363943Z             },
2026-08-28T09:54:48.0364213Z             {
2026-08-28T09:54:48.0364566Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0364837Z               "line": 1846
2026-08-28T09:54:48.0365101Z             },
2026-08-28T09:54:48.0365597Z             {
2026-08-28T09:54:48.0365964Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:48.0366221Z               "line": 72
2026-08-28T09:54:48.0366606Z             },
2026-08-28T09:54:48.0366861Z             {
2026-08-28T09:54:48.0367286Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0367577Z               "line": 125
2026-08-28T09:54:48.0367825Z             },
2026-08-28T09:54:48.0368076Z             {
2026-08-28T09:54:48.0368478Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0368754Z               "line": 137
2026-08-28T09:54:48.0369127Z             },
2026-08-28T09:54:48.0369386Z             {
2026-08-28T09:54:48.0369771Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0370111Z               "line": 155
2026-08-28T09:54:48.0370396Z             },
2026-08-28T09:54:48.0370653Z             {
2026-08-28T09:54:48.0371055Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0371331Z               "line": 205
2026-08-28T09:54:48.0371588Z             },
2026-08-28T09:54:48.0371850Z             {
2026-08-28T09:54:48.0372232Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0372510Z               "line": 252
2026-08-28T09:54:48.0372762Z             },
2026-08-28T09:54:48.0373015Z             {
2026-08-28T09:54:48.0373401Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0373678Z               "line": 309
2026-08-28T09:54:48.0373932Z             },
2026-08-28T09:54:48.0374188Z             {
2026-08-28T09:54:48.0374571Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0374840Z               "line": 436
2026-08-28T09:54:48.0375097Z             },
2026-08-28T09:54:48.0375346Z             {
2026-08-28T09:54:48.0375731Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0375999Z               "line": 457
2026-08-28T09:54:48.0376262Z             },
2026-08-28T09:54:48.0376519Z             {
2026-08-28T09:54:48.0376906Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0377180Z               "line": 467
2026-08-28T09:54:48.0377436Z             },
2026-08-28T09:54:48.0377769Z             {
2026-08-28T09:54:48.0378341Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0378641Z               "line": 501
2026-08-28T09:54:48.0378890Z             },
2026-08-28T09:54:48.0379252Z             {
2026-08-28T09:54:48.0379663Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0379928Z               "line": 633
2026-08-28T09:54:48.0380188Z             },
2026-08-28T09:54:48.0380437Z             {
2026-08-28T09:54:48.0380822Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0381165Z               "line": 733
2026-08-28T09:54:48.0381433Z             },
2026-08-28T09:54:48.0381681Z             {
2026-08-28T09:54:48.0382061Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0382334Z               "line": 997
2026-08-28T09:54:48.0382610Z             },
2026-08-28T09:54:48.0382893Z             {
2026-08-28T09:54:48.0383285Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0383566Z               "line": 1020
2026-08-28T09:54:48.0383823Z             },
2026-08-28T09:54:48.0384099Z             {
2026-08-28T09:54:48.0384482Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0384748Z               "line": 1028
2026-08-28T09:54:48.0385010Z             },
2026-08-28T09:54:48.0385262Z             {
2026-08-28T09:54:48.0385648Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0385930Z               "line": 1038
2026-08-28T09:54:48.0386188Z             },
2026-08-28T09:54:48.0386440Z             {
2026-08-28T09:54:48.0386831Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0387108Z               "line": 1072
2026-08-28T09:54:48.0387366Z             },
2026-08-28T09:54:48.0387626Z             {
2026-08-28T09:54:48.0388005Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0388339Z               "line": 1085
2026-08-28T09:54:48.0388596Z             },
2026-08-28T09:54:48.0388858Z             {
2026-08-28T09:54:48.0389336Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0389618Z               "line": 1092
2026-08-28T09:54:48.0389875Z             },
2026-08-28T09:54:48.0390127Z             {
2026-08-28T09:54:48.0390511Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0390781Z               "line": 1100
2026-08-28T09:54:48.0391039Z             },
2026-08-28T09:54:48.0391354Z             {
2026-08-28T09:54:48.0391739Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0392017Z               "line": 1108
2026-08-28T09:54:48.0392274Z             },
2026-08-28T09:54:48.0392538Z             {
2026-08-28T09:54:48.0392918Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0393198Z               "line": 1147
2026-08-28T09:54:48.0393453Z             },
2026-08-28T09:54:48.0393710Z             {
2026-08-28T09:54:48.0394093Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0394369Z               "line": 1247
2026-08-28T09:54:48.0394631Z             },
2026-08-28T09:54:48.0394917Z             {
2026-08-28T09:54:48.0395285Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0395551Z               "line": 1368
2026-08-28T09:54:48.0395794Z             },
2026-08-28T09:54:48.0396051Z             {
2026-08-28T09:54:48.0396452Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0396728Z               "line": 1397
2026-08-28T09:54:48.0397024Z             },
2026-08-28T09:54:48.0397410Z             {
2026-08-28T09:54:48.0397988Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0398277Z               "line": 1451
2026-08-28T09:54:48.0398536Z             },
2026-08-28T09:54:48.0398798Z             {
2026-08-28T09:54:48.0399291Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0399662Z               "line": 1513
2026-08-28T09:54:48.0399920Z             },
2026-08-28T09:54:48.0400169Z             {
2026-08-28T09:54:48.0400559Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0400831Z               "line": 1554
2026-08-28T09:54:48.0401091Z             },
2026-08-28T09:54:48.0401346Z             {
2026-08-28T09:54:48.0401732Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0401994Z               "line": 1671
2026-08-28T09:54:48.0402262Z             },
2026-08-28T09:54:48.0402573Z             {
2026-08-28T09:54:48.0402948Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0403220Z               "line": 1717
2026-08-28T09:54:48.0403474Z             },
2026-08-28T09:54:48.0403730Z             {
2026-08-28T09:54:48.0404115Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0404400Z               "line": 1799
2026-08-28T09:54:48.0404653Z             },
2026-08-28T09:54:48.0404909Z             {
2026-08-28T09:54:48.0405292Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0405563Z               "line": 1932
2026-08-28T09:54:48.0405820Z             },
2026-08-28T09:54:48.0406068Z             {
2026-08-28T09:54:48.0406454Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0406730Z               "line": 1963
2026-08-28T09:54:48.0406988Z             },
2026-08-28T09:54:48.0407251Z             {
2026-08-28T09:54:48.0407617Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.0407890Z               "line": 76
2026-08-28T09:54:48.0408147Z             },
2026-08-28T09:54:48.0408399Z             {
2026-08-28T09:54:48.0408770Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.0409135Z               "line": 620
2026-08-28T09:54:48.0409387Z             },
2026-08-28T09:54:48.0409702Z             {
2026-08-28T09:54:48.0410075Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.0410351Z               "line": 1168
2026-08-28T09:54:48.0410660Z             },
2026-08-28T09:54:48.0410990Z             {
2026-08-28T09:54:48.0411353Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.0411627Z               "line": 433
2026-08-28T09:54:48.0411883Z             },
2026-08-28T09:54:48.0412136Z             {
2026-08-28T09:54:48.0412484Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.0412832Z               "line": 473
2026-08-28T09:54:48.0413089Z             },
2026-08-28T09:54:48.0413357Z             {
2026-08-28T09:54:48.0413710Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.0413987Z               "line": 480
2026-08-28T09:54:48.0414242Z             },
2026-08-28T09:54:48.0414502Z             {
2026-08-28T09:54:48.0414840Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:48.0415112Z               "line": 471
2026-08-28T09:54:48.0415504Z             },
2026-08-28T09:54:48.0415761Z             {
2026-08-28T09:54:48.0416085Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0416343Z               "line": 20609
2026-08-28T09:54:48.0416619Z             },
2026-08-28T09:54:48.0416873Z             {
2026-08-28T09:54:48.0417196Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0417482Z               "line": 20980
2026-08-28T09:54:48.0417739Z             },
2026-08-28T09:54:48.0418010Z             {
2026-08-28T09:54:48.0418330Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0418611Z               "line": 21084
2026-08-28T09:54:48.0418868Z             },
2026-08-28T09:54:48.0419212Z             {
2026-08-28T09:54:48.0419519Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0419791Z               "line": 21703
2026-08-28T09:54:48.0420048Z             }
2026-08-28T09:54:48.0420301Z           ]
2026-08-28T09:54:48.0420553Z         },
2026-08-28T09:54:48.0420887Z         "int": {
2026-08-28T09:54:48.0421168Z           "complete": true,
2026-08-28T09:54:48.0421435Z           "evidence": [
2026-08-28T09:54:48.0421693Z             {
2026-08-28T09:54:48.0422207Z               "path": "crates/spt-daemon/tests/servicehost_supervision_e2e.rs",
2026-08-28T09:54:48.0422476Z               "line": 25
2026-08-28T09:54:48.0422724Z             },
2026-08-28T09:54:48.0422973Z             {
2026-08-28T09:54:48.0423473Z               "path": "crates/spt-daemon/tests/servicehost_supervision_e2e.rs",
2026-08-28T09:54:48.0423749Z               "line": 166
2026-08-28T09:54:48.0424064Z             },
2026-08-28T09:54:48.0424317Z             {
2026-08-28T09:54:48.0424817Z               "path": "crates/spt-daemon/tests/servicehost_supervision_e2e.rs",
2026-08-28T09:54:48.0425086Z               "line": 241
2026-08-28T09:54:48.0425348Z             },
2026-08-28T09:54:48.0425606Z             {
2026-08-28T09:54:48.0426102Z               "path": "crates/spt-daemon/tests/servicehost_supervision_e2e.rs",
2026-08-28T09:54:48.0426378Z               "line": 322
2026-08-28T09:54:48.0426621Z             },
2026-08-28T09:54:48.0426873Z             {
2026-08-28T09:54:48.0427376Z               "path": "crates/spt-daemon/tests/servicehost_supervision_e2e.rs",
2026-08-28T09:54:48.0427660Z               "line": 394
2026-08-28T09:54:48.0427931Z             },
2026-08-28T09:54:48.0428184Z             {
2026-08-28T09:54:48.0428585Z               "path": "crates/spt/tests/resident_service_e2e.rs",
2026-08-28T09:54:48.0428851Z               "line": 33
2026-08-28T09:54:48.0429185Z             }
2026-08-28T09:54:48.0429443Z           ]
2026-08-28T09:54:48.0429696Z         },
2026-08-28T09:54:48.0429952Z         "unit": {
2026-08-28T09:54:48.0430236Z           "complete": true,
2026-08-28T09:54:48.0430512Z           "evidence": [
2026-08-28T09:54:48.0430770Z             {
2026-08-28T09:54:48.0431128Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0431457Z               "line": 2297
2026-08-28T09:54:48.0431714Z             },
2026-08-28T09:54:48.0431972Z             {
2026-08-28T09:54:48.0432334Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0432606Z               "line": 2631
2026-08-28T09:54:48.0432862Z             },
2026-08-28T09:54:48.0433122Z             {
2026-08-28T09:54:48.0433471Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0433752Z               "line": 2835
2026-08-28T09:54:48.0434004Z             },
2026-08-28T09:54:48.0434319Z             {
2026-08-28T09:54:48.0434672Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0434944Z               "line": 2881
2026-08-28T09:54:48.0435196Z             },
2026-08-28T09:54:48.0435471Z             {
2026-08-28T09:54:48.0435851Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0436118Z               "line": 2927
2026-08-28T09:54:48.0436376Z             },
2026-08-28T09:54:48.0436629Z             {
2026-08-28T09:54:48.0437001Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.0437273Z               "line": 2950
2026-08-28T09:54:48.0437534Z             },
2026-08-28T09:54:48.0437782Z             {
2026-08-28T09:54:48.0438182Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0438463Z               "line": 1982
2026-08-28T09:54:48.0438717Z             },
2026-08-28T09:54:48.0439064Z             {
2026-08-28T09:54:48.0439455Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0439736Z               "line": 2014
2026-08-28T09:54:48.0439988Z             },
2026-08-28T09:54:48.0440247Z             {
2026-08-28T09:54:48.0440630Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0440902Z               "line": 2034
2026-08-28T09:54:48.0441164Z             },
2026-08-28T09:54:48.0441416Z             {
2026-08-28T09:54:48.0441808Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0442170Z               "line": 2055
2026-08-28T09:54:48.0442428Z             },
2026-08-28T09:54:48.0442680Z             {
2026-08-28T09:54:48.0443058Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0443332Z               "line": 2065
2026-08-28T09:54:48.0443582Z             },
2026-08-28T09:54:48.0443844Z             {
2026-08-28T09:54:48.0444221Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0444493Z               "line": 2105
2026-08-28T09:54:48.0444746Z             },
2026-08-28T09:54:48.0445000Z             {
2026-08-28T09:54:48.0445442Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0445723Z               "line": 2134
2026-08-28T09:54:48.0445984Z             },
2026-08-28T09:54:48.0446317Z             {
2026-08-28T09:54:48.0446693Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0446960Z               "line": 2152
2026-08-28T09:54:48.0447214Z             },
2026-08-28T09:54:48.0447465Z             {
2026-08-28T09:54:48.0447843Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0448109Z               "line": 2208
2026-08-28T09:54:48.0448381Z             },
2026-08-28T09:54:48.0448766Z             {
2026-08-28T09:54:48.0449258Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0449548Z               "line": 2298
2026-08-28T09:54:48.0449811Z             },
2026-08-28T09:54:48.0450073Z             {
2026-08-28T09:54:48.0450455Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0450732Z               "line": 2330
2026-08-28T09:54:48.0450991Z             },
2026-08-28T09:54:48.0451247Z             {
2026-08-28T09:54:48.0451637Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0451904Z               "line": 2344
2026-08-28T09:54:48.0452158Z             },
2026-08-28T09:54:48.0452487Z             {
2026-08-28T09:54:48.0452882Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0453150Z               "line": 2374
2026-08-28T09:54:48.0453407Z             },
2026-08-28T09:54:48.0453666Z             {
2026-08-28T09:54:48.0454044Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0454315Z               "line": 2441
2026-08-28T09:54:48.0454567Z             },
2026-08-28T09:54:48.0454829Z             {
2026-08-28T09:54:48.0455206Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0455541Z               "line": 2470
2026-08-28T09:54:48.0455792Z             },
2026-08-28T09:54:48.0456050Z             {
2026-08-28T09:54:48.0456434Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0456709Z               "line": 2493
2026-08-28T09:54:48.0456962Z             },
2026-08-28T09:54:48.0457220Z             {
2026-08-28T09:54:48.0457596Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0457868Z               "line": 2536
2026-08-28T09:54:48.0458131Z             },
2026-08-28T09:54:48.0458384Z             {
2026-08-28T09:54:48.0458766Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0459109Z               "line": 2553
2026-08-28T09:54:48.0459374Z             },
2026-08-28T09:54:48.0459650Z             {
2026-08-28T09:54:48.0460028Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0460299Z               "line": 2596
2026-08-28T09:54:48.0460560Z             },
2026-08-28T09:54:48.0460828Z             {
2026-08-28T09:54:48.0461200Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0461480Z               "line": 2634
2026-08-28T09:54:48.0461746Z             },
2026-08-28T09:54:48.0461994Z             {
2026-08-28T09:54:48.0462380Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0462647Z               "line": 2685
2026-08-28T09:54:48.0462909Z             },
2026-08-28T09:54:48.0463161Z             {
2026-08-28T09:54:48.0463624Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0463901Z               "line": 2733
2026-08-28T09:54:48.0464154Z             },
2026-08-28T09:54:48.0464414Z             {
2026-08-28T09:54:48.0464794Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0465070Z               "line": 2914
2026-08-28T09:54:48.0465322Z             },
2026-08-28T09:54:48.0465586Z             {
2026-08-28T09:54:48.0465966Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0466242Z               "line": 2960
2026-08-28T09:54:48.0466557Z             },
2026-08-28T09:54:48.0466806Z             {
2026-08-28T09:54:48.0467189Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0467461Z               "line": 2991
2026-08-28T09:54:48.0467709Z             },
2026-08-28T09:54:48.0467960Z             {
2026-08-28T09:54:48.0468348Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0468619Z               "line": 3061
2026-08-28T09:54:48.0468871Z             },
2026-08-28T09:54:48.0469206Z             {
2026-08-28T09:54:48.0469583Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0469857Z               "line": 3139
2026-08-28T09:54:48.0470110Z             },
2026-08-28T09:54:48.0470368Z             {
2026-08-28T09:54:48.0470744Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0471021Z               "line": 3222
2026-08-28T09:54:48.0471289Z             },
2026-08-28T09:54:48.0471542Z             {
2026-08-28T09:54:48.0471923Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0472193Z               "line": 3261
2026-08-28T09:54:48.0472453Z             },
2026-08-28T09:54:48.0472705Z             {
2026-08-28T09:54:48.0473092Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0473421Z               "line": 3326
2026-08-28T09:54:48.0473682Z             },
2026-08-28T09:54:48.0473941Z             {
2026-08-28T09:54:48.0474312Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0474589Z               "line": 3365
2026-08-28T09:54:48.0474842Z             },
2026-08-28T09:54:48.0475098Z             {
2026-08-28T09:54:48.0475483Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0475760Z               "line": 3417
2026-08-28T09:54:48.0476008Z             },
2026-08-28T09:54:48.0476269Z             {
2026-08-28T09:54:48.0476718Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0476995Z               "line": 3469
2026-08-28T09:54:48.0477247Z             },
2026-08-28T09:54:48.0477503Z             {
2026-08-28T09:54:48.0477896Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0478259Z               "line": 3515
2026-08-28T09:54:48.0478516Z             },
2026-08-28T09:54:48.0478778Z             {
2026-08-28T09:54:48.0479242Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0479514Z               "line": 3579
2026-08-28T09:54:48.0479766Z             },
2026-08-28T09:54:48.0480023Z             {
2026-08-28T09:54:48.0480394Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0480666Z               "line": 3652
2026-08-28T09:54:48.0480919Z             },
2026-08-28T09:54:48.0481177Z             {
2026-08-28T09:54:48.0481567Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0481834Z               "line": 3694
2026-08-28T09:54:48.0482102Z             },
2026-08-28T09:54:48.0482358Z             {
2026-08-28T09:54:48.0482749Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0483022Z               "line": 3731
2026-08-28T09:54:48.0483279Z             },
2026-08-28T09:54:48.0483533Z             {
2026-08-28T09:54:48.0483919Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0484281Z               "line": 3764
2026-08-28T09:54:48.0484525Z             },
2026-08-28T09:54:48.0484777Z             {
2026-08-28T09:54:48.0485154Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0485454Z               "line": 3798
2026-08-28T09:54:48.0485700Z             },
2026-08-28T09:54:48.0485947Z             {
2026-08-28T09:54:48.0486320Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0486596Z               "line": 3833
2026-08-28T09:54:48.0486848Z             },
2026-08-28T09:54:48.0487096Z             {
2026-08-28T09:54:48.0487536Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0487788Z               "line": 3867
2026-08-28T09:54:48.0488049Z             },
2026-08-28T09:54:48.0488300Z             {
2026-08-28T09:54:48.0488675Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0489028Z               "line": 3896
2026-08-28T09:54:48.0489282Z             },
2026-08-28T09:54:48.0489549Z             {
2026-08-28T09:54:48.0489916Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0490178Z               "line": 3929
2026-08-28T09:54:48.0490427Z             },
2026-08-28T09:54:48.0490684Z             {
2026-08-28T09:54:48.0491064Z               "path": "crates/spt-daemon/src/servicehost.rs",
2026-08-28T09:54:48.0491340Z               "line": 3964
2026-08-28T09:54:48.0491597Z             },
2026-08-28T09:54:48.0491851Z             {
2026-08-28T09:54:48.0492231Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.0492499Z               "line": 1792
2026-08-28T09:54:48.0492752Z             },
2026-08-28T09:54:48.0493001Z             {
2026-08-28T09:54:48.0493365Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.0493636Z               "line": 1840
2026-08-28T09:54:48.0493898Z             },
2026-08-28T09:54:48.0494155Z             {
2026-08-28T09:54:48.0494566Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.0494846Z               "line": 1370
2026-08-28T09:54:48.0495099Z             },
2026-08-28T09:54:48.0495385Z             {
2026-08-28T09:54:48.0495719Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.0495995Z               "line": 1410
2026-08-28T09:54:48.0496251Z             },
2026-08-28T09:54:48.0496493Z             {
2026-08-28T09:54:48.0496851Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.0497118Z               "line": 1442
2026-08-28T09:54:48.0497427Z             },
2026-08-28T09:54:48.0497689Z             {
2026-08-28T09:54:48.0498004Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0498266Z               "line": 31222
2026-08-28T09:54:48.0498515Z             },
2026-08-28T09:54:48.0498775Z             {
2026-08-28T09:54:48.0499166Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0499437Z               "line": 31380
2026-08-28T09:54:48.0499695Z             },
2026-08-28T09:54:48.0499951Z             {
2026-08-28T09:54:48.0500276Z               "path": "docs/INFRA-REGISTER.md",
2026-08-28T09:54:48.0500551Z               "line": 2084
2026-08-28T09:54:48.0500799Z             }
2026-08-28T09:54:48.0501058Z           ]
2026-08-28T09:54:48.0501316Z         }
2026-08-28T09:54:48.0501576Z       }
2026-08-28T09:54:48.0501828Z     },
2026-08-28T09:54:48.0502082Z     {
2026-08-28T09:54:48.0502434Z       "id": "REQ-RESIZE-INPUT-MODE-INTEGRITY",
2026-08-28T09:54:48.0527563Z       "title": "RESCOPED 2026-07-22 by ADR-0047 Amendment 2 + KNOWN-HAZARDS 7.55 (doyle-ratified), on the measurement rather than on the supposition. FIELD EVIDENCE IS REAL: hertz's second ENLYZEAM capture shows the operator's keystrokes as isolated one-byte OUTPUT records in the child->broker RAW DRAIN — server-side, upstream of any client console, so independent of the 7.56 presentation root that explains the other half of the /c/config line. LOCAL SEAM MEASURES CLEAN: a probe child under a real ConPTY, clamped raw at startup and resized 24x80->60x131 live, reports an IDENTICAL input mode word at four sample points (boot / before-resize / after-resize / before-write, all in=0x000001f0 echo=0 line=0), and typed bytes do not come back as output; a seeded capability probe moves BOTH observables, so the absence is earned, not vacuous. Amendment 1's addendum supposed the resize path re-enables console echo — on this box and portable_pty/ConPTY version it does NOT. TRIGGER UNPINNED. OPEN CANDIDATE (hertz field question, deliberately NOT built against): the pseudoconsole BOOTS with ENABLE_ECHO_INPUT/ENABLE_LINE_INPUT ON (in=0x000001f7 measured) and the CHILD clamps them off, so any UNCLAMPED WINDOW (startup, or a re-clamp after a TUI state transition) echoes by default with no seam re-enabling anything — reframing the question from who turns echo back on to whether there is a window where nobody has turned it off yet. NO impl STAGE, for a structural reason and not a scheduling one: the hosted child's console handles belong to the pseudoconsole it is attached to and the daemon holds only the master end, so the daemon can neither OBSERVE nor SET those modes — instrumenting spt-term's resize seam would probe a console that is not the one in question, and a server-side clamp is equally impossible. Shipping instrumentation that measures the wrong console is manufactured confidence (doyle, declined explicitly); the RIG is the instrument, and the probe-child pattern ships as a debug tool if the field ever needs live diagnosis. The restore-placement question (spt-term seam vs broker write_input) is MOOT, not answered: there is nothing to restore when the mode is preserved. WHAT THIS REQ OWNS: unit — the probe protocol contract (the verdict travels in the stdout protocol line because under a ConPTY the child's stderr is interleaved into the same re-rendered stream and arrives shredded, so a refused SetConsoleMode could otherwise read as a measurement); int — the four-sample measurement, the typed-bytes-do-not-echo symptom leg (which survives being wrong about the mechanism), and the seeded capability probe. Rig-craft pinned in the rig and transferable: a probe that never clamps raw sits at the very default the seam is suspected of restoring and cannot tell reset from never-changed; and ConPTY's post-resize REPAINT re-emits earlier output, impersonating a fresh reply to any rig that matches loosely. Kin REQ-RC-NEWLINE-PRESENTATION-TRUTH (7.56, the presentation half, FIXED) and REQ-ATTACH-RESIZE-REPAINT (7.54, rescoped the same honest way).",
2026-08-28T09:54:48.0528231Z       "requiredStages": [
2026-08-28T09:54:48.0528474Z         "doc",
2026-08-28T09:54:48.0528740Z         "unit",
2026-08-28T09:54:48.0529055Z         "int"
2026-08-28T09:54:48.0529313Z       ],
2026-08-28T09:54:48.0529580Z       "stages": {
2026-08-28T09:54:48.0529838Z         "doc": {
2026-08-28T09:54:48.0530111Z           "complete": true,
2026-08-28T09:54:48.0530399Z           "evidence": [
2026-08-28T09:54:48.0530682Z             {
2026-08-28T09:54:48.0531007Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:48.0531283Z               "line": 862
2026-08-28T09:54:48.0531541Z             },
2026-08-28T09:54:48.0531803Z             {
2026-08-28T09:54:48.0532300Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:48.0532571Z               "line": 218
2026-08-28T09:54:48.0532828Z             }
2026-08-28T09:54:48.0533090Z           ]
2026-08-28T09:54:48.0533348Z         },
2026-08-28T09:54:48.0533619Z         "impl": {
2026-08-28T09:54:48.0533900Z           "complete": false,
2026-08-28T09:54:48.0534186Z           "evidence": []
2026-08-28T09:54:48.0534448Z         },
2026-08-28T09:54:48.0534702Z         "int": {
2026-08-28T09:54:48.0534979Z           "complete": true,
2026-08-28T09:54:48.0535246Z           "evidence": [
2026-08-28T09:54:48.0535501Z             {
2026-08-28T09:54:48.0536000Z               "path": "crates/spt-term/tests/resize_console_mode_integrity.rs",
2026-08-28T09:54:48.0536276Z               "line": 166
2026-08-28T09:54:48.0536605Z             },
2026-08-28T09:54:48.0536868Z             {
2026-08-28T09:54:48.0537382Z               "path": "crates/spt-term/tests/resize_console_mode_integrity.rs",
2026-08-28T09:54:48.0537654Z               "line": 230
2026-08-28T09:54:48.0537916Z             },
2026-08-28T09:54:48.0538170Z             {
2026-08-28T09:54:48.0538685Z               "path": "crates/spt-term/tests/resize_console_mode_integrity.rs",
2026-08-28T09:54:48.0539034Z               "line": 270
2026-08-28T09:54:48.0539286Z             }
2026-08-28T09:54:48.0539549Z           ]
2026-08-28T09:54:48.0539901Z         },
2026-08-28T09:54:48.0540163Z         "unit": {
2026-08-28T09:54:48.0540454Z           "complete": true,
2026-08-28T09:54:48.0540732Z           "evidence": [
2026-08-28T09:54:48.0540988Z             {
2026-08-28T09:54:48.0541495Z               "path": "crates/spt-term/tests/resize_console_mode_integrity.rs",
2026-08-28T09:54:48.0541767Z               "line": 328
2026-08-28T09:54:48.0542025Z             }
2026-08-28T09:54:48.0542283Z           ]
2026-08-28T09:54:48.0542535Z         }
2026-08-28T09:54:48.0542788Z       }
2026-08-28T09:54:48.0543040Z     },
2026-08-28T09:54:48.0543289Z     {
2026-08-28T09:54:48.0543609Z       "id": "REQ-REST-TERMINAL-NORMALIZE",
2026-08-28T09:54:48.0553234Z       "title": "REGISTRY-LIFECYCLE W2 (ADR-0041 decision 3, rest-normalize P0): definitive hosted-session loss normalizes TERMINALLY and ATOMICALLY — one store-level mutation writes status=offline + rest_state=suspended + clears dormant_since_ms in the SAME info.json write, invoked at authoritative broker-session-loss/liveness-reap + cmd_stop. NOT daemon_rest_event(Suspend) (no edge when effective already Suspended — raw Active intent survives); NOT reader-side blanket offline-implies-suspended (destroys explicit-Wake semantics: wake writes intent first, reconcile consumes). Graceful shutdown keeps echo-before-teardown. Kills the zombie WAKE_RESUME loop (perri field: repeated cross-generation resumes of a dead session). Gate: impl — atomic terminal-normalize mutation + call sites; unit — store-level atomic pair never mixed + endpoint_stop covers already-offline/raw-Active input; int — session vanish means offline+suspended and the NEXT reconcile emits NO WAKE_RESUME, explicit suspended/offline->Wake->Active launches EXACTLY once, RefuseLivePid-then-valid-bind custody race leaves the revived seat unsuspended; doc — ADR-0041.",
2026-08-28T09:54:48.0553643Z       "requiredStages": [
2026-08-28T09:54:48.0553905Z         "doc",
2026-08-28T09:54:48.0554220Z         "impl",
2026-08-28T09:54:48.0554487Z         "unit",
2026-08-28T09:54:48.0554749Z         "int"
2026-08-28T09:54:48.0555001Z       ],
2026-08-28T09:54:48.0555268Z       "stages": {
2026-08-28T09:54:48.0555522Z         "doc": {
2026-08-28T09:54:48.0555817Z           "complete": true,
2026-08-28T09:54:48.0556094Z           "evidence": [
2026-08-28T09:54:48.0556353Z             {
2026-08-28T09:54:48.0556773Z               "path": "docs/adr/0041-endpoint-lifecycle-truth.md",
2026-08-28T09:54:48.0557049Z               "line": 51
2026-08-28T09:54:48.0557302Z             }
2026-08-28T09:54:48.0557558Z           ]
2026-08-28T09:54:48.0557806Z         },
2026-08-28T09:54:48.0558069Z         "impl": {
2026-08-28T09:54:48.0558345Z           "complete": true,
2026-08-28T09:54:48.0558618Z           "evidence": [
2026-08-28T09:54:48.0558876Z             {
2026-08-28T09:54:48.0559351Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.0559631Z               "line": 849
2026-08-28T09:54:48.0559892Z             },
2026-08-28T09:54:48.0560149Z             {
2026-08-28T09:54:48.0560512Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.0560788Z               "line": 1842
2026-08-28T09:54:48.0561040Z             },
2026-08-28T09:54:48.0561298Z             {
2026-08-28T09:54:48.0561670Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0561941Z               "line": 921
2026-08-28T09:54:48.0562202Z             },
2026-08-28T09:54:48.0562527Z             {
2026-08-28T09:54:48.0562902Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0563169Z               "line": 971
2026-08-28T09:54:48.0563427Z             },
2026-08-28T09:54:48.0563680Z             {
2026-08-28T09:54:48.0564014Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0564290Z               "line": 541
2026-08-28T09:54:48.0564542Z             },
2026-08-28T09:54:48.0564799Z             {
2026-08-28T09:54:48.0565137Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0565466Z               "line": 578
2026-08-28T09:54:48.0565714Z             },
2026-08-28T09:54:48.0565978Z             {
2026-08-28T09:54:48.0566288Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0566569Z               "line": 12094
2026-08-28T09:54:48.0566830Z             }
2026-08-28T09:54:48.0567082Z           ]
2026-08-28T09:54:48.0567337Z         },
2026-08-28T09:54:48.0567585Z         "int": {
2026-08-28T09:54:48.0567881Z           "complete": true,
2026-08-28T09:54:48.0568157Z           "evidence": [
2026-08-28T09:54:48.0568414Z             {
2026-08-28T09:54:48.0568850Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:48.0569211Z               "line": 708
2026-08-28T09:54:48.0569475Z             }
2026-08-28T09:54:48.0569732Z           ]
2026-08-28T09:54:48.0569991Z         },
2026-08-28T09:54:48.0570247Z         "unit": {
2026-08-28T09:54:48.0570534Z           "complete": true,
2026-08-28T09:54:48.0570806Z           "evidence": [
2026-08-28T09:54:48.0571064Z             {
2026-08-28T09:54:48.0571449Z               "path": "crates/spt-daemon/tests/daemon_e2e.rs",
2026-08-28T09:54:48.0571721Z               "line": 350
2026-08-28T09:54:48.0571978Z             },
2026-08-28T09:54:48.0572231Z             {
2026-08-28T09:54:48.0577609Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0578002Z               "line": 1356
2026-08-28T09:54:48.0578259Z             },
2026-08-28T09:54:48.0578512Z             {
2026-08-28T09:54:48.0578866Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0579223Z               "line": 1391
2026-08-28T09:54:48.0579480Z             },
2026-08-28T09:54:48.0579729Z             {
2026-08-28T09:54:48.0580049Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0580325Z               "line": 26114
2026-08-28T09:54:48.0580575Z             }
2026-08-28T09:54:48.0580831Z           ]
2026-08-28T09:54:48.0581150Z         }
2026-08-28T09:54:48.0581409Z       }
2026-08-28T09:54:48.0581671Z     },
2026-08-28T09:54:48.0581918Z     {
2026-08-28T09:54:48.0582238Z       "id": "REQ-REST-VERB-ROUTING",
2026-08-28T09:54:48.0602370Z       "title": "A-3 (REMOTE-TRUTH triage §A + Q3 operator-law): a BARE-id rest verb (spt wake/suspend <id>) routes across the subnet like send's fallback instead of failing local-only. ROOT (certain): cmd_rest (cli.rs:3296) gates the remote arm on id.contains('@'|':'); a bare id falls to the local-only arm (cli.rs:3340) → daemon_rest_event → info::read_info miss (resting.rs:248) → 'WOKE_FAIL:{id}: info.json absent or unreadable — not a hosted perch'. cmd_send (cli.rs:5142) DOES fall back on a local miss; cmd_rest's remote arm (cli.rs:3307, wan_rest) already handles every WanRestOutcome — it is simply never reached on a bare-id local miss. Contradicts CONTEXT:286 'a wake must route'. Q3 SUBSTRATE GAP: resolve_across_visible (registry.rs:971) filters only by Status::routable() and its Ambiguity payload is node-hexes-only — it CANNOT express the Q3 status rule; per-candidate (node,status) comes from SubnetRegistry::instances(id). FIX: a NEW pure select_rest_target helper (status-aware, isolated from resolve_across_visible which cmd_send keeps) applying GOAL-SATISFACTION semantics (ADR/triage addendum @188d269, NOT naive verb symmetry — the mixed case breaks symmetry): wake is an ∃-goal (satisfied when ANY instance Active), suspend is a ∀-goal (satisfied when ALL instances Suspended); one helper parameterized by the verb's satisfaction predicate — 0 candidates→NotFound; goal already satisfied→NoOp naming the satisfying node(s); exactly 1 ACTIONABLE (not-at-target) instance→Act(node); >1 actionable→Ambiguous(copy-paste id@node list). Edge rulings: wake with >1 Active = NoOp naming ALL active nodes (NOT Ambiguous — nothing actionable); suspend mixed (X suspended + Y active, NOT ∀-satisfied) = Act(Y) if exactly one active / Ambiguous if several active. Candidate status is ADVERTISED/gossiped (post-A-1 shared-derivation, may be STALE) so a NoOp verdict is ADVISORY and the qualified id@node path is the operator override (noted in the helper doc-comment). cmd_rest's bare-id local miss loads snapshots → instances(id) → select_rest_target → dispatches (Act→wan_rest to the node / NoOp naming node(s) / Ambiguous render_refusal copy-paste id@node list / NotFound NO_ENDPOINT), all F-1 public language from day one. Qualified id@node path unchanged; shutdown leg-2 stays LOCAL_ONLY. Red-first: a bare id present ONLY in a remote registry snapshot routes to that node instead of WOKE_FAIL.",
2026-08-28T09:54:48.0602966Z       "requiredStages": [
2026-08-28T09:54:48.0603229Z         "impl",
2026-08-28T09:54:48.0603496Z         "unit",
2026-08-28T09:54:48.0603745Z         "int"
2026-08-28T09:54:48.0604003Z       ],
2026-08-28T09:54:48.0604257Z       "stages": {
2026-08-28T09:54:48.0604518Z         "doc": {
2026-08-28T09:54:48.0604804Z           "complete": false,
2026-08-28T09:54:48.0605086Z           "evidence": []
2026-08-28T09:54:48.0605348Z         },
2026-08-28T09:54:48.0605611Z         "impl": {
2026-08-28T09:54:48.0605896Z           "complete": true,
2026-08-28T09:54:48.0606163Z           "evidence": [
2026-08-28T09:54:48.0606416Z             {
2026-08-28T09:54:48.0606788Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:48.0607063Z               "line": 585
2026-08-28T09:54:48.0607317Z             },
2026-08-28T09:54:48.0607579Z             {
2026-08-28T09:54:48.0607965Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.0608232Z               "line": 1144
2026-08-28T09:54:48.0608485Z             },
2026-08-28T09:54:48.0608722Z             {
2026-08-28T09:54:48.0609114Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0609380Z               "line": 7549
2026-08-28T09:54:48.0609635Z             }
2026-08-28T09:54:48.0609889Z           ]
2026-08-28T09:54:48.0610155Z         },
2026-08-28T09:54:48.0610418Z         "int": {
2026-08-28T09:54:48.0610751Z           "complete": true,
2026-08-28T09:54:48.0611027Z           "evidence": [
2026-08-28T09:54:48.0611279Z             {
2026-08-28T09:54:48.0611652Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.0611918Z               "line": 1303
2026-08-28T09:54:48.0612185Z             },
2026-08-28T09:54:48.0612436Z             {
2026-08-28T09:54:48.0612807Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.0613084Z               "line": 2441
2026-08-28T09:54:48.0613398Z             }
2026-08-28T09:54:48.0613657Z           ]
2026-08-28T09:54:48.0613904Z         },
2026-08-28T09:54:48.0614171Z         "unit": {
2026-08-28T09:54:48.0614457Z           "complete": true,
2026-08-28T09:54:48.0614742Z           "evidence": [
2026-08-28T09:54:48.0614999Z             {
2026-08-28T09:54:48.0615369Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:48.0615641Z               "line": 619
2026-08-28T09:54:48.0615890Z             },
2026-08-28T09:54:48.0616152Z             {
2026-08-28T09:54:48.0616519Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:48.0616786Z               "line": 699
2026-08-28T09:54:48.0617038Z             },
2026-08-28T09:54:48.0617295Z             {
2026-08-28T09:54:48.0617662Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.0617933Z               "line": 2605
2026-08-28T09:54:48.0618196Z             },
2026-08-28T09:54:48.0618445Z             {
2026-08-28T09:54:48.0618816Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.0619183Z               "line": 2652
2026-08-28T09:54:48.0619440Z             },
2026-08-28T09:54:48.0619689Z             {
2026-08-28T09:54:48.0620063Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.0620338Z               "line": 2687
2026-08-28T09:54:48.0620590Z             },
2026-08-28T09:54:48.0620848Z             {
2026-08-28T09:54:48.0621177Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.0621454Z               "line": 2049
2026-08-28T09:54:48.0621773Z             }
2026-08-28T09:54:48.0622026Z           ]
2026-08-28T09:54:48.0622275Z         }
2026-08-28T09:54:48.0622532Z       }
2026-08-28T09:54:48.0622783Z     },
2026-08-28T09:54:48.0623034Z     {
2026-08-28T09:54:48.0623391Z       "id": "REQ-RESUME-ADAPTER-FOLLOWS-SESSION",
2026-08-28T09:54:48.0641032Z       "title": "D-2 (REMOTE-TRUTH triage §D-2 + operator Q5 @c248afc): a resume-from-history restores the RECORDED session adapter (REQ-SESSION-ADAPTER-RECORDED) — the resumed harness is the one the session ran under, re-stamped onto the endpoint PRE-SPAWN, and an unregistered recorded adapter refuses LOUDLY before launching anything. ROOT: the picker's resume_outcome (model.rs:1285) bakes adapter=ep.adapter_profile from the selected ENDPOINT, ignoring the ledger row — so a resume always uses the endpoint's CURRENT adapter even when the session ran under a different one; and the endpoint's info.adapter is never re-stamped to the row's on the resume path (cli.rs:1962 skeleton writer early-returns for an existing perch — adapter immutable, carried by bind's stamp_creation_fields). FIX (doyle fork ruling): ResumeRow (model.rs:199) gains adapter: Option<String> threaded from SessionEntry.adapter in picker/data.rs; the row title (model.rs:228) renders [{adapter}] when Some ({head} [{adapter}] - {time} (…{id5})); resume_outcome bakes the ROW's adapter with an endpoint fallback (row.adapter.unwrap_or(ep.adapter_profile)) — None → the endpoint's current stamp (benign degrade). The pre-spawn RE-STAMP + refusal ride the picker resume dispatch (mod.rs:360 Run arm, resume.is_some()) reusing the hazard-guarded mutate_info seam (write_adapter_change/mod.rs:336), NEVER the bind path: order = read current info.adapter → if the baked adapter DIFFERS (a real replace; a None-row bakes the endpoint's own → equals current → NO write) → registered-check via resolve_option (Err(NotRegistered) → loud F-1 refusal naming the adapter + `spt adapter add`, NO stamp, NO spawn) → write_adapter_change re-stamp → spawn. ONE adapter write path (the mutate_info seam); REQ-HAZARD-ADAPTER-PROFILE-STAMP-CLOBBER's bind/hook path (stamp_creation_fields, home.rs) UNTOUCHED — both its guard tests stay green as the gate condition. Red-first: a resume row adapter=\"claude-spt\" over an endpoint stamped \"claude-spt:ccs\" → the baked Outcome.adapter == \"claude-spt\" (the deliberate replace) and the pre-spawn stamp writes it.",
2026-08-28T09:54:48.0641564Z       "requiredStages": [
2026-08-28T09:54:48.0641821Z         "impl",
2026-08-28T09:54:48.0642083Z         "unit"
2026-08-28T09:54:48.0642335Z       ],
2026-08-28T09:54:48.0642612Z       "stages": {
2026-08-28T09:54:48.0642880Z         "doc": {
2026-08-28T09:54:48.0643170Z           "complete": false,
2026-08-28T09:54:48.0643442Z           "evidence": []
2026-08-28T09:54:48.0643696Z         },
2026-08-28T09:54:48.0643965Z         "impl": {
2026-08-28T09:54:48.0644248Z           "complete": true,
2026-08-28T09:54:48.0644549Z           "evidence": [
2026-08-28T09:54:48.0644812Z             {
2026-08-28T09:54:48.0645159Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.0645432Z               "line": 549
2026-08-28T09:54:48.0645685Z             },
2026-08-28T09:54:48.0645943Z             {
2026-08-28T09:54:48.0646334Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:48.0646604Z               "line": 458
2026-08-28T09:54:48.0646854Z             }
2026-08-28T09:54:48.0647111Z           ]
2026-08-28T09:54:48.0647365Z         },
2026-08-28T09:54:48.0647627Z         "int": {
2026-08-28T09:54:48.0647908Z           "complete": false,
2026-08-28T09:54:48.0648176Z           "evidence": []
2026-08-28T09:54:48.0648437Z         },
2026-08-28T09:54:48.0648690Z         "unit": {
2026-08-28T09:54:48.0649067Z           "complete": true,
2026-08-28T09:54:48.0649428Z           "evidence": [
2026-08-28T09:54:48.0649815Z             {
2026-08-28T09:54:48.0650272Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.0650638Z               "line": 2246
2026-08-28T09:54:48.0650902Z             },
2026-08-28T09:54:48.0651150Z             {
2026-08-28T09:54:48.0651502Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.0651763Z               "line": 2757
2026-08-28T09:54:48.0652023Z             }
2026-08-28T09:54:48.0652266Z           ]
2026-08-28T09:54:48.0652677Z         }
2026-08-28T09:54:48.0652924Z       }
2026-08-28T09:54:48.0653176Z     },
2026-08-28T09:54:48.0653440Z     {
2026-08-28T09:54:48.0653758Z       "id": "REQ-RESUME-CONTEXT-PULL",
2026-08-28T09:54:48.0686789Z       "title": "Adapter-callable resume-context pull verb + not-yet-synthesized commune/signoff drop append (legacy-SPT parity, operator-directed 2026-06-24). GAP: spt-core exposes NO verb for a harness adapter's SessionStart hook to pull an agent's resume context — `resume::download_psyche_context` (spt-live/src/resume.rs:88, composes <live-role>+<live-context>+<project-context> from the durable two-tier store) is INTERNAL with ZERO spt callers and no ApiCmd verb (api/mod.rs ApiCmd enum has none); resume.rs:9 documents the intended 'adapter pulls it in its SessionStart hook' path but it was NEVER wired. Result: a harness adapter cannot inject the agent's durable mind on resume at all (claude-spt today runs only `api boundary` session-rotation + an identity brief — the agent resumes WITHOUT its mind). TIER-1 SCOPE (operator-approved; Tier-2 = drift-stamp/<current>/drift-directive + <memformat> + Pulse-Log DEFERRED to a separate parity item, NOT v0.15.0 — the legacy download_payload [claude_skill_owl context.rs:344] is richer but memformat is roadmap-deferred + drift-stamp is an orthogonal cross-machine-drift feature). TWO PARTS: (1) EXPOSE `spt api psyche-download <id> [--session-id <sid>]` -> stdout = the composed brief, project_id resolved from the endpoint's bound cwd (info::read_info -> cwd -> project derive; NO --project arg), auth-gated like sibling id-scoped verbs (the `gated(&id,&auth,…)` pattern); empty store -> NO-CONTEXT on stderr (mirror legacy). The adapter SessionStart hook runs it + injects stdout as additionalContext. (2) APPEND any commune/signoff drop NOT YET SYNTHESIZED into the durable tiers as a distinct <pending-commune>/<pending-signoff> slice AFTER the durable slices. GATING (operator ruling): append while NOT-YET-SYNTHESIZED, NOT merely 'while the raw file is on disk' — in today's synchronous ingest (ingest_drops route_two_slice writes durable THEN deletes the file, lifecycle.rs:466 @ DEFAULT_PULSE_PERIOD 5s) the two coincide (a watched-dir drop IS pre-synthesis), so the v1 realization reads the manifest-declared session.commune_dir/signoff_dir (manifest.rs:208/210) for a present <id>-commune.md/<id>-signoff.md (COMMUNE_SUFFIX/SIGNOFF_SUFFIX, ingest.rs); the CONTRACT keys on synthesis-state so it stays correct when async Psyche synthesis lands (a consumed-but-not-yet-committed drop stays appended via a pending-synthesis staging set — forward hook). The agent-checkpoint trigger sentinel CHECKPOINT_SENTINEL=`!!checkpoint!!` (a FIXED spt-core constant — operator-specified, CONTEXT.md §fixed-constants, NOT adapter-configurable) is stripped at BOTH drop-body points via one shared `strip_checkpoint_markers` (remove every token, keep inter-marker text, collapse trivial whitespace): the PRE-synthesis pending-append (resume::append_pending) AND the POST-synthesis durable ingest (ingest::route_slices — the single choke covering route_two_slice + signoff.write_resume_commune; strip-then-empty-filter so a marker-only slice routes nowhere) — else the marker would persist PERMANENTLY in live-context.md once a checkpoint drop synthesizes + re-trigger once the adapter's checkpoint detection is live. PRESENTATION-ONLY: the append NEVER writes the durable store (spt-core remains sole store-writer, REQ-HAZARD-DROP-FILE-SINGLE-WRITER; mirror legacy's read-only/process_file_drop-sole-deleter discipline). SELF-CLEARING: once synthesis commits the <pending-*> slice vanishes — no duplication. CORE-OWNED (not adapter): an adapter-side raw-file read RACES spt-core's ingest-delete (TOCTOU, ingest.rs:161 removes the drop on pulse-consume); the fold MUST live in the single composer all resume pulls flow through. New public CLI verb -> docs-drift gate (xtask gen + reference.md no-internal-codes, cli-command-docs-drift). (v0.15.0 parity wave W5)",
2026-08-28T09:54:48.0687515Z       "requiredStages": [
2026-08-28T09:54:48.0687940Z         "doc",
2026-08-28T09:54:48.0688193Z         "impl",
2026-08-28T09:54:48.0688455Z         "unit",
2026-08-28T09:54:48.0688706Z         "int"
2026-08-28T09:54:48.0689037Z       ],
2026-08-28T09:54:48.0689290Z       "stages": {
2026-08-28T09:54:48.0689562Z         "doc": {
2026-08-28T09:54:48.0689839Z           "complete": true,
2026-08-28T09:54:48.0690125Z           "evidence": [
2026-08-28T09:54:48.0690392Z             {
2026-08-28T09:54:48.0690682Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.0690949Z               "line": 161
2026-08-28T09:54:48.0691211Z             },
2026-08-28T09:54:48.0691479Z             {
2026-08-28T09:54:48.0691774Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.0692055Z               "line": 176
2026-08-28T09:54:48.0692313Z             }
2026-08-28T09:54:48.0692574Z           ]
2026-08-28T09:54:48.0692841Z         },
2026-08-28T09:54:48.0693104Z         "impl": {
2026-08-28T09:54:48.0693385Z           "complete": true,
2026-08-28T09:54:48.0693663Z           "evidence": [
2026-08-28T09:54:48.0693927Z             {
2026-08-28T09:54:48.0694288Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.0694569Z               "line": 101
2026-08-28T09:54:48.0694821Z             },
2026-08-28T09:54:48.0695084Z             {
2026-08-28T09:54:48.0695432Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.0695699Z               "line": 196
2026-08-28T09:54:48.0695961Z             },
2026-08-28T09:54:48.0696215Z             {
2026-08-28T09:54:48.0696558Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:48.0696899Z               "line": 160
2026-08-28T09:54:48.0697164Z             },
2026-08-28T09:54:48.0697417Z             {
2026-08-28T09:54:48.0697761Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:48.0698037Z               "line": 234
2026-08-28T09:54:48.0698290Z             },
2026-08-28T09:54:48.0698547Z             {
2026-08-28T09:54:48.0698894Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:48.0699385Z               "line": 242
2026-08-28T09:54:48.0699640Z             },
2026-08-28T09:54:48.0699888Z             {
2026-08-28T09:54:48.0700293Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.0700584Z               "line": 850
2026-08-28T09:54:48.0700828Z             }
2026-08-28T09:54:48.0701081Z           ]
2026-08-28T09:54:48.0701339Z         },
2026-08-28T09:54:48.0701592Z         "int": {
2026-08-28T09:54:48.0701873Z           "complete": true,
2026-08-28T09:54:48.0702143Z           "evidence": [
2026-08-28T09:54:48.0702396Z             {
2026-08-28T09:54:48.0702786Z               "path": "crates/spt/tests/psyche_download_e2e.rs",
2026-08-28T09:54:48.0703086Z               "line": 68
2026-08-28T09:54:48.0703344Z             }
2026-08-28T09:54:48.0703589Z           ]
2026-08-28T09:54:48.0703846Z         },
2026-08-28T09:54:48.0704098Z         "unit": {
2026-08-28T09:54:48.0704369Z           "complete": true,
2026-08-28T09:54:48.0704643Z           "evidence": [
2026-08-28T09:54:48.0704906Z             {
2026-08-28T09:54:48.0705244Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.0705516Z               "line": 503
2026-08-28T09:54:48.0705774Z             },
2026-08-28T09:54:48.0706025Z             {
2026-08-28T09:54:48.0706374Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.0706641Z               "line": 516
2026-08-28T09:54:48.0706912Z             },
2026-08-28T09:54:48.0707170Z             {
2026-08-28T09:54:48.0707529Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:48.0707848Z               "line": 411
2026-08-28T09:54:48.0708106Z             },
2026-08-28T09:54:48.0708350Z             {
2026-08-28T09:54:48.0708693Z               "path": "crates/spt-live/src/resume.rs",
2026-08-28T09:54:48.0709046Z               "line": 453
2026-08-28T09:54:48.0709342Z             },
2026-08-28T09:54:48.0709600Z             {
2026-08-28T09:54:48.0709988Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.0710263Z               "line": 1170
2026-08-28T09:54:48.0710510Z             }
2026-08-28T09:54:48.0710763Z           ]
2026-08-28T09:54:48.0711021Z         }
2026-08-28T09:54:48.0711269Z       }
2026-08-28T09:54:48.0711527Z     },
2026-08-28T09:54:48.0711779Z     {
2026-08-28T09:54:48.0712108Z       "id": "REQ-RESUME-CUSTODY-IDENTITY",
2026-08-28T09:54:48.0724198Z       "title": "Resume custody is an identity pair (pid + process creation time), never a bare PID. (ADR-0047 decision 1; hertz v0.39.4 field bug 1, RCA accepted 2026-07-22.) TODAY: livehost's restart gate and liveness-reconcile DEFER both consume `read_resume_pid(..).is_some_and(is_process_alive)` — zero identity binding, so a dead wake-resume spawn's pid recycled onto an unrelated process (field: resume.pid=29456 -> cmd.exe) reads as a live resume forever: reconcile defers every tick, the row stays online-authoritative, FALSE-ONLINE with no self-repair. FIX: the custody record stores (pid, creation_time) written atomically at spawn-mint; every consumer tests the PAIR; mismatch = NOT OURS -> the discovering reader DELETES the record and proceeds (self-heal, not error); successful bind and spawn-reap clear custody atomically with their own outcome. Creation time from the process SNAPSHOT, never a retained handle (KH 7.50); platform without a snapshot -> unproven -> defer one tick, never a manufactured verdict. Gate: impl — the paired custody record + both livehost consumers on the pair test; unit — pair mismatch reads NOT-OURS + record deleted, pair match reads OURS, absent-snapshot defers; int — the recycled-pid rig: mint custody, kill the spawn, occupy the pid with an impostor, prove reconcile deletes custody and the row goes honest (the bug-1 field shape, RED-first against the bare-PID gate).",
2026-08-28T09:54:48.0724690Z       "requiredStages": [
2026-08-28T09:54:48.0724957Z         "impl",
2026-08-28T09:54:48.0725218Z         "unit",
2026-08-28T09:54:48.0725489Z         "int"
2026-08-28T09:54:48.0725740Z       ],
2026-08-28T09:54:48.0726073Z       "stages": {
2026-08-28T09:54:48.0726331Z         "doc": {
2026-08-28T09:54:48.0726613Z           "complete": true,
2026-08-28T09:54:48.0726889Z           "evidence": [
2026-08-28T09:54:48.0727151Z             {
2026-08-28T09:54:48.0727665Z               "path": "docs/adr/0047-daemon-lifecycle-custody-authority.md",
2026-08-28T09:54:48.0727957Z               "line": 53
2026-08-28T09:54:48.0728211Z             }
2026-08-28T09:54:48.0728480Z           ]
2026-08-28T09:54:48.0728735Z         },
2026-08-28T09:54:48.0729087Z         "impl": {
2026-08-28T09:54:48.0729364Z           "complete": true,
2026-08-28T09:54:48.0729650Z           "evidence": [
2026-08-28T09:54:48.0729908Z             {
2026-08-28T09:54:48.0730289Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0730566Z               "line": 302
2026-08-28T09:54:48.0730819Z             },
2026-08-28T09:54:48.0731085Z             {
2026-08-28T09:54:48.0731450Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0731727Z               "line": 376
2026-08-28T09:54:48.0731993Z             },
2026-08-28T09:54:48.0732250Z             {
2026-08-28T09:54:48.0732618Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0732889Z               "line": 468
2026-08-28T09:54:48.0733147Z             },
2026-08-28T09:54:48.0733395Z             {
2026-08-28T09:54:48.0733761Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0734024Z               "line": 581
2026-08-28T09:54:48.0734281Z             },
2026-08-28T09:54:48.0734534Z             {
2026-08-28T09:54:48.0734978Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0735250Z               "line": 922
2026-08-28T09:54:48.0735497Z             },
2026-08-28T09:54:48.0735745Z             {
2026-08-28T09:54:48.0736106Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.0736423Z               "line": 978
2026-08-28T09:54:48.0736681Z             },
2026-08-28T09:54:48.0736948Z             {
2026-08-28T09:54:48.0737315Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.0737592Z               "line": 273
2026-08-28T09:54:48.0737878Z             },
2026-08-28T09:54:48.0738155Z             {
2026-08-28T09:54:48.0738545Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.0738841Z               "line": 367
2026-08-28T09:54:48.0739214Z             },
2026-08-28T09:54:48.0739492Z             {
2026-08-28T09:54:48.0739910Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0740215Z               "line": 41
2026-08-28T09:54:48.0740493Z             },
2026-08-28T09:54:48.0740778Z             {
2026-08-28T09:54:48.0741193Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0741488Z               "line": 106
2026-08-28T09:54:48.0741766Z             },
2026-08-28T09:54:48.0742053Z             {
2026-08-28T09:54:48.0742462Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0742763Z               "line": 136
2026-08-28T09:54:48.0743049Z             },
2026-08-28T09:54:48.0743330Z             {
2026-08-28T09:54:48.0743740Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0744031Z               "line": 179
2026-08-28T09:54:48.0744317Z             },
2026-08-28T09:54:48.0744599Z             {
2026-08-28T09:54:48.0745027Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0745389Z               "line": 186
2026-08-28T09:54:48.0745671Z             },
2026-08-28T09:54:48.0745952Z             {
2026-08-28T09:54:48.0746386Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.0746690Z               "line": 1171
2026-08-28T09:54:48.0746969Z             }
2026-08-28T09:54:48.0747250Z           ]
2026-08-28T09:54:48.0747527Z         },
2026-08-28T09:54:48.0747823Z         "int": {
2026-08-28T09:54:48.0748147Z           "complete": true,
2026-08-28T09:54:48.0748509Z           "evidence": [
2026-08-28T09:54:48.0748790Z             {
2026-08-28T09:54:48.0749345Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:48.0749643Z               "line": 805
2026-08-28T09:54:48.0749922Z             },
2026-08-28T09:54:48.0750203Z             {
2026-08-28T09:54:48.0750657Z               "path": "crates/spt-daemon/tests/resume_custody_aba.rs",
2026-08-28T09:54:48.0750958Z               "line": 127
2026-08-28T09:54:48.0751244Z             },
2026-08-28T09:54:48.0751530Z             {
2026-08-28T09:54:48.0751991Z               "path": "crates/spt-daemon/tests/resume_custody_aba.rs",
2026-08-28T09:54:48.0752290Z               "line": 181
2026-08-28T09:54:48.0752570Z             }
2026-08-28T09:54:48.0752852Z           ]
2026-08-28T09:54:48.0753128Z         },
2026-08-28T09:54:48.0753414Z         "unit": {
2026-08-28T09:54:48.0753728Z           "complete": true,
2026-08-28T09:54:48.0754029Z           "evidence": [
2026-08-28T09:54:48.0754310Z             {
2026-08-28T09:54:48.0754678Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:48.0754981Z               "line": 777
2026-08-28T09:54:48.0755263Z             },
2026-08-28T09:54:48.0755544Z             {
2026-08-28T09:54:48.0755959Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0756259Z               "line": 225
2026-08-28T09:54:48.0756546Z             },
2026-08-28T09:54:48.0756822Z             {
2026-08-28T09:54:48.0757250Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0757615Z               "line": 248
2026-08-28T09:54:48.0757901Z             },
2026-08-28T09:54:48.0758172Z             {
2026-08-28T09:54:48.0758594Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0758884Z               "line": 282
2026-08-28T09:54:48.0759251Z             },
2026-08-28T09:54:48.0759514Z             {
2026-08-28T09:54:48.0759952Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0760232Z               "line": 309
2026-08-28T09:54:48.0760487Z             },
2026-08-28T09:54:48.0760739Z             {
2026-08-28T09:54:48.0761122Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0761393Z               "line": 336
2026-08-28T09:54:48.0761646Z             },
2026-08-28T09:54:48.0761894Z             {
2026-08-28T09:54:48.0762280Z               "path": "crates/spt-store/src/resume_custody.rs",
2026-08-28T09:54:48.0762551Z               "line": 359
2026-08-28T09:54:48.0762808Z             }
2026-08-28T09:54:48.0763063Z           ]
2026-08-28T09:54:48.0763316Z         }
2026-08-28T09:54:48.0763568Z       }
2026-08-28T09:54:48.0763822Z     },
2026-08-28T09:54:48.0764075Z     {
2026-08-28T09:54:48.0764413Z       "id": "REQ-RESUME-HARNESS-SESSION-ID",
2026-08-28T09:54:48.0772001Z       "title": "B2 (F028, hall-b diagnosis, verified 0.22.0): respawn/`--resume` feeds the SPT session id to `claude -r`. After the 02:05 daemon bounce respawn built `claude.exe -r 70b5bfa40901b7d4` — an spt session id in claude's OWN session-id namespace -> claude hangs forever at a 'No sessions match' resume-picker while the endpoint reads online. Hits after EVERY daemon bounce + every picker Resume. The HARNESS session id (claude UUID, stamped in sessions.log/info.json by the hooks) is what {session_id} must mean in the adapter's [session.resume] command; the spt sid must not leak. FIX: substitute the HARNESS session id in the resume template (spt-core substitution-key semantics + LIKELY claude-spt manifest coordination — FLAG perri BEFORE touching the manifest, adapter-boundary rule). Int: resume template receives the ledger UUID, not the spt sid. See triage B2.",
2026-08-28T09:54:48.0772397Z       "requiredStages": [
2026-08-28T09:54:48.0772651Z         "impl",
2026-08-28T09:54:48.0772912Z         "unit"
2026-08-28T09:54:48.0773163Z       ],
2026-08-28T09:54:48.0773429Z       "stages": {
2026-08-28T09:54:48.0773686Z         "doc": {
2026-08-28T09:54:48.0774043Z           "complete": false,
2026-08-28T09:54:48.0774315Z           "evidence": []
2026-08-28T09:54:48.0774573Z         },
2026-08-28T09:54:48.0774835Z         "impl": {
2026-08-28T09:54:48.0775111Z           "complete": true,
2026-08-28T09:54:48.0775383Z           "evidence": [
2026-08-28T09:54:48.0775636Z             {
2026-08-28T09:54:48.0775956Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0776222Z               "line": 2856
2026-08-28T09:54:48.0776489Z             },
2026-08-28T09:54:48.0776750Z             {
2026-08-28T09:54:48.0777060Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0777346Z               "line": 2876
2026-08-28T09:54:48.0777594Z             }
2026-08-28T09:54:48.0777853Z           ]
2026-08-28T09:54:48.0778106Z         },
2026-08-28T09:54:48.0778365Z         "int": {
2026-08-28T09:54:48.0778645Z           "complete": false,
2026-08-28T09:54:48.0778926Z           "evidence": []
2026-08-28T09:54:48.0779269Z         },
2026-08-28T09:54:48.0779536Z         "unit": {
2026-08-28T09:54:48.0779813Z           "complete": true,
2026-08-28T09:54:48.0780080Z           "evidence": [
2026-08-28T09:54:48.0780344Z             {
2026-08-28T09:54:48.0780729Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.0781007Z               "line": 449
2026-08-28T09:54:48.0781257Z             },
2026-08-28T09:54:48.0781512Z             {
2026-08-28T09:54:48.0781827Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0782103Z               "line": 4961
2026-08-28T09:54:48.0782366Z             }
2026-08-28T09:54:48.0782685Z           ]
2026-08-28T09:54:48.0782938Z         }
2026-08-28T09:54:48.0783191Z       }
2026-08-28T09:54:48.0783443Z     },
2026-08-28T09:54:48.0783696Z     {
2026-08-28T09:54:48.0784031Z       "id": "REQ-RESUME-REAP-PRIOR-HARNESS",
2026-08-28T09:54:48.0787000Z       "title": "B4 (F028, hall-b diagnosis, verified 0.22.0): `--resume` respawns a SECOND harness onto the SAME session without reaping the first. Observed live: resume of b4421cf9 spawned pid 34432 while gen1 (250376) kept running — two claude.exe stacks, one session id. FIX: resume must reap/refuse when the session already has a live harness. See triage B4.",
2026-08-28T09:54:48.0787359Z       "requiredStages": [
2026-08-28T09:54:48.0787615Z         "impl",
2026-08-28T09:54:48.0787873Z         "unit",
2026-08-28T09:54:48.0788131Z         "int"
2026-08-28T09:54:48.0788385Z       ],
2026-08-28T09:54:48.0788647Z       "stages": {
2026-08-28T09:54:48.0788925Z         "doc": {
2026-08-28T09:54:48.0789291Z           "complete": false,
2026-08-28T09:54:48.0789572Z           "evidence": []
2026-08-28T09:54:48.0789829Z         },
2026-08-28T09:54:48.0790092Z         "impl": {
2026-08-28T09:54:48.0790369Z           "complete": true,
2026-08-28T09:54:48.0790641Z           "evidence": [
2026-08-28T09:54:48.0790889Z             {
2026-08-28T09:54:48.0791204Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0791480Z               "line": 2924
2026-08-28T09:54:48.0791741Z             },
2026-08-28T09:54:48.0791996Z             {
2026-08-28T09:54:48.0792311Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0792583Z               "line": 4540
2026-08-28T09:54:48.0792812Z             }
2026-08-28T09:54:48.0793059Z           ]
2026-08-28T09:54:48.0793298Z         },
2026-08-28T09:54:48.0793560Z         "int": {
2026-08-28T09:54:48.0793884Z           "complete": true,
2026-08-28T09:54:48.0794147Z           "evidence": [
2026-08-28T09:54:48.0794465Z             {
2026-08-28T09:54:48.0794864Z               "path": "crates/spt/tests/run_no_dup_session_e2e.rs",
2026-08-28T09:54:48.0795136Z               "line": 330
2026-08-28T09:54:48.0795389Z             }
2026-08-28T09:54:48.0795645Z           ]
2026-08-28T09:54:48.0795902Z         },
2026-08-28T09:54:48.0796160Z         "unit": {
2026-08-28T09:54:48.0796441Z           "complete": true,
2026-08-28T09:54:48.0796714Z           "evidence": [
2026-08-28T09:54:48.0797038Z             {
2026-08-28T09:54:48.0797347Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0797623Z               "line": 5001
2026-08-28T09:54:48.0797875Z             }
2026-08-28T09:54:48.0798128Z           ]
2026-08-28T09:54:48.0798385Z         }
2026-08-28T09:54:48.0798639Z       }
2026-08-28T09:54:48.0798888Z     },
2026-08-28T09:54:48.0799231Z     {
2026-08-28T09:54:48.0799557Z       "id": "REQ-RESUME-ROW-PER-PROJECT",
2026-08-28T09:54:48.0803333Z       "title": "A5 (F028, operator #6): resume-from-history labels EVERY session with the endpoint's newest project. data.rs:480-496 resume_rows_for clones project_history.first() onto every ResumeRow (line 481/488), so all sessions read as the head project (the ghost). The per-row e.cwd is already carried for launch-into-dir. FIX: derive per-row project_id_for_dir(e.cwd) (owlery-excluded -> fall back to trigger token), rendered through A1's display-name path. See triage A5.",
2026-08-28T09:54:48.0803633Z       "requiredStages": [
2026-08-28T09:54:48.0803896Z         "impl",
2026-08-28T09:54:48.0804148Z         "unit"
2026-08-28T09:54:48.0804407Z       ],
2026-08-28T09:54:48.0804665Z       "stages": {
2026-08-28T09:54:48.0804929Z         "doc": {
2026-08-28T09:54:48.0805208Z           "complete": false,
2026-08-28T09:54:48.0805494Z           "evidence": []
2026-08-28T09:54:48.0805743Z         },
2026-08-28T09:54:48.0805995Z         "impl": {
2026-08-28T09:54:48.0806273Z           "complete": true,
2026-08-28T09:54:48.0806544Z           "evidence": [
2026-08-28T09:54:48.0806796Z             {
2026-08-28T09:54:48.0807149Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.0807489Z               "line": 507
2026-08-28T09:54:48.0807739Z             }
2026-08-28T09:54:48.0807997Z           ]
2026-08-28T09:54:48.0808251Z         },
2026-08-28T09:54:48.0808513Z         "int": {
2026-08-28T09:54:48.0808793Z           "complete": false,
2026-08-28T09:54:48.0809209Z           "evidence": []
2026-08-28T09:54:48.0809467Z         },
2026-08-28T09:54:48.0809733Z         "unit": {
2026-08-28T09:54:48.0810018Z           "complete": true,
2026-08-28T09:54:48.0810282Z           "evidence": [
2026-08-28T09:54:48.0810546Z             {
2026-08-28T09:54:48.0810888Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.0811165Z               "line": 1053
2026-08-28T09:54:48.0811423Z             }
2026-08-28T09:54:48.0811675Z           ]
2026-08-28T09:54:48.0811941Z         }
2026-08-28T09:54:48.0812190Z       }
2026-08-28T09:54:48.0812452Z     },
2026-08-28T09:54:48.0812706Z     {
2026-08-28T09:54:48.0813023Z       "id": "REQ-RESUME-UNBOUND-STAMP",
2026-08-28T09:54:48.0822078Z       "title": "RC-RENDER-TRUTH W1 (ADR-0042 decision 2, operator-spotted second root seam): resume launch transitions an existing offline perch to UNBOUND before/with the broker spawn — UNBOUND semantics are fresh/resume-invariant (broker session exists + harness not bound = UNBOUND); generation/session-safe ROLLBACK to offline on spawn failure or session death; bind owns UNBOUND->ONLINE. Supersedes the rc.rs 'resume gets no UNBOUND stamp — accepted' boundary note (the pre-bind window can be PERMANENT: stuck native resume, SessionStart never fires — field-proven; truthful UNBOUND is the operator-recovery surface that let `spt rc` reach the wedged TUI). Writer-truth complement to REQ-RC-HONEST-SESSION-AUTHORITY — both land, neither substitutes. Gate: impl — UNBOUND stamp at resume spawn + rollback + bind transition; unit — stamp fires on existing-offline perch resume, rollback on spawn-fail restores offline, generation guard refuses a stale rollback over a newer bind; int — resumed-but-never-bound endpoint reads UNBOUND (not offline) and `spt rc` attaches to its live session; doc — ADR-0042.",
2026-08-28T09:54:48.0822487Z       "requiredStages": [
2026-08-28T09:54:48.0822750Z         "doc",
2026-08-28T09:54:48.0823017Z         "impl",
2026-08-28T09:54:48.0823271Z         "unit",
2026-08-28T09:54:48.0823536Z         "int"
2026-08-28T09:54:48.0823790Z       ],
2026-08-28T09:54:48.0824143Z       "stages": {
2026-08-28T09:54:48.0824396Z         "doc": {
2026-08-28T09:54:48.0824682Z           "complete": true,
2026-08-28T09:54:48.0824954Z           "evidence": [
2026-08-28T09:54:48.0825203Z             {
2026-08-28T09:54:48.0825574Z               "path": "docs/adr/0042-rc-attach-truth.md",
2026-08-28T09:54:48.0825837Z               "line": 53
2026-08-28T09:54:48.0826088Z             }
2026-08-28T09:54:48.0826338Z           ]
2026-08-28T09:54:48.0826596Z         },
2026-08-28T09:54:48.0826864Z         "impl": {
2026-08-28T09:54:48.0827140Z           "complete": true,
2026-08-28T09:54:48.0827407Z           "evidence": [
2026-08-28T09:54:48.0827649Z             {
2026-08-28T09:54:48.0828008Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0828284Z               "line": 616
2026-08-28T09:54:48.0828541Z             },
2026-08-28T09:54:48.0828793Z             {
2026-08-28T09:54:48.0829217Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0829489Z               "line": 637
2026-08-28T09:54:48.0829743Z             },
2026-08-28T09:54:48.0829990Z             {
2026-08-28T09:54:48.0830301Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0830578Z               "line": 4642
2026-08-28T09:54:48.0830829Z             },
2026-08-28T09:54:48.0831086Z             {
2026-08-28T09:54:48.0831391Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0831656Z               "line": 4688
2026-08-28T09:54:48.0831904Z             },
2026-08-28T09:54:48.0832195Z             {
2026-08-28T09:54:48.0832576Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0832853Z               "line": 4718
2026-08-28T09:54:48.0833105Z             }
2026-08-28T09:54:48.0833353Z           ]
2026-08-28T09:54:48.0833605Z         },
2026-08-28T09:54:48.0833854Z         "int": {
2026-08-28T09:54:48.0834138Z           "complete": true,
2026-08-28T09:54:48.0834461Z           "evidence": [
2026-08-28T09:54:48.0834718Z             {
2026-08-28T09:54:48.0835091Z               "path": "crates/spt/tests/rc_attach_truth.rs",
2026-08-28T09:54:48.0835357Z               "line": 438
2026-08-28T09:54:48.0835614Z             }
2026-08-28T09:54:48.0835862Z           ]
2026-08-28T09:54:48.0836120Z         },
2026-08-28T09:54:48.0836374Z         "unit": {
2026-08-28T09:54:48.0836648Z           "complete": true,
2026-08-28T09:54:48.0836913Z           "evidence": [
2026-08-28T09:54:48.0837170Z             {
2026-08-28T09:54:48.0837513Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0837795Z               "line": 1454
2026-08-28T09:54:48.0838052Z             },
2026-08-28T09:54:48.0838302Z             {
2026-08-28T09:54:48.0838640Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.0838897Z               "line": 1490
2026-08-28T09:54:48.0839231Z             }
2026-08-28T09:54:48.0839486Z           ]
2026-08-28T09:54:48.0839744Z         }
2026-08-28T09:54:48.0839993Z       }
2026-08-28T09:54:48.0840255Z     },
2026-08-28T09:54:48.0840508Z     {
2026-08-28T09:54:48.0840794Z       "id": "REQ-RING-BLOCKS",
2026-08-28T09:54:48.0878557Z       "title": "`spt ring` BLOCKS until the reply arrives or the wait elapses, in the arms where blocking is the honest behaviour. Ringing is a question, and a verb that returns instantly having only DISPATCHED the question makes the caller invent their own wait — which is the shape the request was filed against (releases#39). THE SCOPE IS BLOCKING ONLY. The wait UNIT and its DEFAULT VALUE are releases#59 and stay OUT of this requirement entirely: they are a separate ratification and folding them in would let one change smuggle a timing default past the gate that ruled on behaviour. THE ARMS ARE MAPPED AND THE MAP IS PART OF THE CONTRACT, recorded here so a later reader does not re-derive it wrongly from the symptom. THE MAP IS STATED BY REPLACEMENT: an earlier three-arm reading of this code (the builder's own, posted to the issue and carried into the dispatch) said flatly that 'a perchless caller already blocks', and that is TRUE ONLY WHEN THE TARGET IS LISTENING AT THAT INSTANT. It is corrected here rather than annotated, because that sentence is what made the report look like it might be about expectations rather than a defect. THE ARM THAT WAS MISSING IS THE ONE THE REQUEST IS ABOUT: a perchless caller takes `Occupancy::Vacant` and builds its ephemeral reply perch, then `deliver` attempts a live send and FALLS BACK TO THE SPOOL whenever that fails — which is not merely the offline case but the ordinary state of a WORKING agent that is mid-turn, the same condition that makes `spt send` report QUEUED. On that path ring used to tear the ephemeral perch down (`remove_dir_all`) and return immediately, DELETING THE ONLY ADDRESS THE REPLY COULD ROUTE BACK TO before any reply could exist. So the reply was unreachable by construction — literally the report's 'a reply can never be processed' — and the same command had opposite semantics for the same caller depending on whether the callee happened to be mid-turn. THE FIX IS THAT A SPOOLED DELIVERY WAITS EXACTLY LIKE A LIVE ONE, entering the same loop, with cleanup still running on every exit. The loop needed no change to cover it: it already drains the perch's SPOOL as well as polling the listener, which is the leg a late reply arrives on. This touches NEITHER ruled constraint — `Vacant` means there was no perch to adopt so the adoption guard is not on this path, and the caller has no live listener to race. THE TIMEOUT OUTCOME MUST SAY WHICH SILENCE IT GOT: a spooled message that was never collected is a different event from a live message that was read and not answered, and a caller told 'did not reply' about mail nobody has picked up draws the wrong conclusion about the peer. The two are therefore SEPARATE OUTCOMES rather than one flag. The superseded `Queued` outcome is KEPT UNCONSTRUCTED rather than deleted: removing it is a public API change with nothing to do with this defect, and the wait-unit request may want exactly that shape back as an explicit no-wait mode. TWO ARMS ARE NON-BLOCKING FOR REASONS THAT SURVIVE THIS CHANGE, and neither is a defect to close: (1) `Delivered` — the caller HAS a live listener, and blocking in the ringing process would race the listener that is already going to receive the reply, so the reply is delivered where the caller is actually listening rather than to a second waiter competing for it; (2) `PerchExists` / `StaleDir` — these are held by REQ-HAZARD-RING-PERCH-ADOPTION, where adoption once deleted a LIVE endpoint AND its spool. THAT GUARD IS NOT THE BUG AND MUST NOT BE REMOVED TO SATISFY THIS REQUIREMENT — it is named here in as many words because deleting it is the shortest path to a green demo of blocking and it would re-break an invariant already paid for once. ALL THREE NON-BLOCKING ARMS ALREADY PRINT EXPLANATORY STDERR (verified in `cmd_ring` at recon), so this requirement adds no diagnostics and must not be read as asking for any. Gate: impl — the spooled path entering the existing wait with cleanup on every exit, the distinct not-yet-collected timeout outcome, and the adoption guard untouched; unit — a reply arriving inside the wait returns it, a LATE reply on the spooled path (the arm where the reply used to be unreachable) still reaches the caller, a spooled wait that elapses returns the not-yet-collected outcome and is asserted NOT EQUAL to the live timeout outcome so the two cannot be collapsed later, and each non-blocking arm is asserted to STILL not block and to still carry its explanatory stderr (the regression rows that keep a later 'make it always block' from eating the hazard guard); int — the real binary rings a real perch whose peer answers LATE, and the reply reaches stdout, with the elapsed time asserted to show it both waited and stopped waiting on the reply rather than on the deadline.",
2026-08-28T09:54:48.0879401Z       "requiredStages": [
2026-08-28T09:54:48.0879801Z         "impl",
2026-08-28T09:54:48.0880073Z         "unit",
2026-08-28T09:54:48.0880331Z         "int"
2026-08-28T09:54:48.0880722Z       ],
2026-08-28T09:54:48.0881018Z       "stages": {
2026-08-28T09:54:48.0881280Z         "doc": {
2026-08-28T09:54:48.0881557Z           "complete": false,
2026-08-28T09:54:48.0881823Z           "evidence": []
2026-08-28T09:54:48.0882095Z         },
2026-08-28T09:54:48.0882351Z         "impl": {
2026-08-28T09:54:48.0882624Z           "complete": true,
2026-08-28T09:54:48.0882896Z           "evidence": [
2026-08-28T09:54:48.0883139Z             {
2026-08-28T09:54:48.0883478Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:48.0883764Z               "line": 285
2026-08-28T09:54:48.0884062Z             },
2026-08-28T09:54:48.0884323Z             {
2026-08-28T09:54:48.0884662Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:48.0884937Z               "line": 304
2026-08-28T09:54:48.0885190Z             },
2026-08-28T09:54:48.0885444Z             {
2026-08-28T09:54:48.0885743Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0886030Z               "line": 11697
2026-08-28T09:54:48.0886288Z             }
2026-08-28T09:54:48.0886541Z           ]
2026-08-28T09:54:48.0886801Z         },
2026-08-28T09:54:48.0887057Z         "int": {
2026-08-28T09:54:48.0887348Z           "complete": true,
2026-08-28T09:54:48.0887615Z           "evidence": [
2026-08-28T09:54:48.0887872Z             {
2026-08-28T09:54:48.0888240Z               "path": "crates/spt/tests/ring_blocks_e2e.rs",
2026-08-28T09:54:48.0888516Z               "line": 81
2026-08-28T09:54:48.0888778Z             }
2026-08-28T09:54:48.0889118Z           ]
2026-08-28T09:54:48.0889382Z         },
2026-08-28T09:54:48.0889642Z         "unit": {
2026-08-28T09:54:48.0889924Z           "complete": true,
2026-08-28T09:54:48.0890195Z           "evidence": [
2026-08-28T09:54:48.0890459Z             {
2026-08-28T09:54:48.0890792Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:48.0891069Z               "line": 525
2026-08-28T09:54:48.0891398Z             },
2026-08-28T09:54:48.0891655Z             {
2026-08-28T09:54:48.0891999Z               "path": "crates/spt-msg/src/ring.rs",
2026-08-28T09:54:48.0892268Z               "line": 560
2026-08-28T09:54:48.0892530Z             }
2026-08-28T09:54:48.0892784Z           ]
2026-08-28T09:54:48.0893041Z         }
2026-08-28T09:54:48.0893294Z       }
2026-08-28T09:54:48.0893550Z     },
2026-08-28T09:54:48.0893804Z     {
2026-08-28T09:54:48.0894118Z       "id": "REQ-RING-TIMEOUT-MINUTES",
2026-08-28T09:54:48.0911473Z       "title": "`spt ring --timeout` IS DENOMINATED IN MINUTES, DEFAULT 30, WITH AN EXPLICIT SUFFIX STILL ACCEPTED (releases#59, CHANGE; ruled 2026-08-02). A ring is a question put to another agent, and an agent answers on agent time -- a 60-SECOND default expires while the peer is mid-turn, so the verb that exists to WAIT for a reply routinely reported a timeout against a peer that was about to answer. A bare number therefore reads as MINUTES, and the parser ALSO accepts an explicit s or m suffix (90s, 2m) so sub-minute waits remain expressible. Ruled and accepted with the change: callers written against the old second-intent get a longer wait, which is low risk because the failure mode of over-waiting is patience and the failure mode of under-waiting was a false negative about a peer. THE UNIT MUST FOLLOW THE VALUE ALL THE WAY TO THE SURFACES THAT REPORT IT: both no-reply arms -- the timeout arm and the spooled-but-uncollected arm -- state what was ACTUALLY waited, suffix-aware, rather than a hardcoded s, or the same wait gets reported in two units by two outcomes of one command. THE PARSE LIVES IN EXACTLY ONE PLACE, taking the argument from a bare integer to a parsed duration value, because a second parse site is how two spellings of one rule are born; garbage is REFUSED rather than silently defaulted, since a value the caller typed and the tool ignored is a wait nobody chose. IN-REPO CALLERS AND DOCUMENTED EXAMPLES REPIN WITH THE SEMANTICS, and this is required text because the defect it prevents is invisible in review: an existing bare 30 written as a 30-second ceiling becomes a 30-MINUTE one, so the ring end-to-end test loses the very bound it exists to enforce and a red arm parks instead of failing. The help sentence, the argument doc, the how-to example and the generated CLI reference all state the new unit and default; the public-help gate applies to the new wording. Gate: impl -- the single suffix-aware parse, the minutes default, the duration threaded to the wait, and both no-reply arms printing the true wait; unit -- a bare number is minutes, an s suffix is seconds, an m suffix is minutes, garbage is refused, and the no-reply arms render the wait they actually took in the unit the caller expressed.",
2026-08-28T09:54:48.0912007Z       "requiredStages": [
2026-08-28T09:54:48.0912265Z         "doc",
2026-08-28T09:54:48.0912518Z         "impl",
2026-08-28T09:54:48.0912780Z         "unit",
2026-08-28T09:54:48.0913037Z         "int"
2026-08-28T09:54:48.0913293Z       ],
2026-08-28T09:54:48.0913557Z       "stages": {
2026-08-28T09:54:48.0913814Z         "doc": {
2026-08-28T09:54:48.0914095Z           "complete": true,
2026-08-28T09:54:48.0914371Z           "evidence": [
2026-08-28T09:54:48.0914628Z             {
2026-08-28T09:54:48.0915005Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:48.0915277Z               "line": 25
2026-08-28T09:54:48.0915539Z             }
2026-08-28T09:54:48.0915795Z           ]
2026-08-28T09:54:48.0916056Z         },
2026-08-28T09:54:48.0916308Z         "impl": {
2026-08-28T09:54:48.0916613Z           "complete": true,
2026-08-28T09:54:48.0916885Z           "evidence": [
2026-08-28T09:54:48.0917147Z             {
2026-08-28T09:54:48.0917462Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0917734Z               "line": 11604
2026-08-28T09:54:48.0917983Z             },
2026-08-28T09:54:48.0918231Z             {
2026-08-28T09:54:48.0918548Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0918880Z               "line": 11628
2026-08-28T09:54:48.0919214Z             },
2026-08-28T09:54:48.0919470Z             {
2026-08-28T09:54:48.0919795Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0920072Z               "line": 11636
2026-08-28T09:54:48.0920329Z             },
2026-08-28T09:54:48.0920583Z             {
2026-08-28T09:54:48.0920907Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0921181Z               "line": 11661
2026-08-28T09:54:48.0921427Z             }
2026-08-28T09:54:48.0921684Z           ]
2026-08-28T09:54:48.0921947Z         },
2026-08-28T09:54:48.0922200Z         "int": {
2026-08-28T09:54:48.0922486Z           "complete": true,
2026-08-28T09:54:48.0922749Z           "evidence": [
2026-08-28T09:54:48.0923006Z             {
2026-08-28T09:54:48.0923388Z               "path": "crates/spt/tests/ring_blocks_e2e.rs",
2026-08-28T09:54:48.0923655Z               "line": 44
2026-08-28T09:54:48.0923977Z             }
2026-08-28T09:54:48.0928914Z           ]
2026-08-28T09:54:48.0929302Z         },
2026-08-28T09:54:48.0929579Z         "unit": {
2026-08-28T09:54:48.0929865Z           "complete": true,
2026-08-28T09:54:48.0930128Z           "evidence": [
2026-08-28T09:54:48.0930380Z             {
2026-08-28T09:54:48.0930699Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0930975Z               "line": 28466
2026-08-28T09:54:48.0931218Z             },
2026-08-28T09:54:48.0931472Z             {
2026-08-28T09:54:48.0931779Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0932045Z               "line": 28492
2026-08-28T09:54:48.0932389Z             },
2026-08-28T09:54:48.0932646Z             {
2026-08-28T09:54:48.0932976Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.0933246Z               "line": 33256
2026-08-28T09:54:48.0933499Z             }
2026-08-28T09:54:48.0933747Z           ]
2026-08-28T09:54:48.0934001Z         }
2026-08-28T09:54:48.0934249Z       }
2026-08-28T09:54:48.0934504Z     },
2026-08-28T09:54:48.0934748Z     {
2026-08-28T09:54:48.0935076Z       "id": "REQ-ROSTER-SELF-LEASE-HEAL",
2026-08-28T09:54:48.0953083Z       "title": "WAN-TRUTH #40 F1: a node's OWN advertised roster row can never be frozen by a regressed epoch counter. Before authoring a self-entry — at pump boot and on every roster-exchange provider pass — the node consults the fleet-replicated lease it already holds for its own pubkey (RosterStore, the copy peers merged back to it) and fast-forwards its EpochSource strictly past that ceiling, so every self-advertisement out-ranks the copy the fleet holds and merge_entry's strictly-greater rule admits it. Field shape this repairs: HFENDULEAM's counter restarted at 0 after a hard reset (NUL husk, see the twin) while its fleet-replicated self row carried lease 803460 with a Jul-18 port; every later self-advertisement merged Stale on every peer, forever, and the node could not repair its own advertised address by any means short of operator surgery — the defect that makes a rebind (F4) invisible and strands the node symmetrically. The heal is retroactive: it repairs an already-damaged node on its next boot, which is why it, and not counter durability, is the primary fix; the durable epoch write and the loud corrupt-husk log ride along as defense in depth, and atomic.rs stops naming epoch counters as safe-for-non-durable RECONSTRUCTIBLE state (that sentence is now a documented-false invariant). Twin: REQ-HAZARD-SELF-ROW-LEASE-FREEZE. Kin REQ-MESH-2 (the upsert_self authorship site), REQ-HAZARD-REGISTRY-EPOCH-LEASE (the counter's own monotonicity contract, unchanged here). Gate: impl — the fleet-lease ceiling read, the fast-forward, its wiring at boot and at the provider, the durable write and the husk log; unit — a counter below the fleet ceiling fast-forwards strictly past it, a counter already above it is untouched (never a gratuitous jump), a healed node's next self-entry merges Updated (not Stale) against the stale high-lease row, and a NUL husk is distinguished from an absent file in the log; int — a node booting with a regressed counter and a high-lease stale self row re-advertises a self entry the fleet admits, with zero state surgery.",
2026-08-28T09:54:48.0953604Z       "requiredStages": [
2026-08-28T09:54:48.0953871Z         "impl",
2026-08-28T09:54:48.0954129Z         "unit",
2026-08-28T09:54:48.0954386Z         "int"
2026-08-28T09:54:48.0954638Z       ],
2026-08-28T09:54:48.0954905Z       "stages": {
2026-08-28T09:54:48.0955163Z         "doc": {
2026-08-28T09:54:48.0955454Z           "complete": false,
2026-08-28T09:54:48.0955716Z           "evidence": []
2026-08-28T09:54:48.0956011Z         },
2026-08-28T09:54:48.0956277Z         "impl": {
2026-08-28T09:54:48.0956564Z           "complete": true,
2026-08-28T09:54:48.0956836Z           "evidence": [
2026-08-28T09:54:48.0957093Z             {
2026-08-28T09:54:48.0957484Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.0957756Z               "line": 1467
2026-08-28T09:54:48.0958017Z             },
2026-08-28T09:54:48.0958282Z             {
2026-08-28T09:54:48.0958664Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.0959031Z               "line": 1063
2026-08-28T09:54:48.0959284Z             },
2026-08-28T09:54:48.0959532Z             {
2026-08-28T09:54:48.0959932Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.0960219Z               "line": 1110
2026-08-28T09:54:48.0960476Z             },
2026-08-28T09:54:48.0960727Z             {
2026-08-28T09:54:48.0961077Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:48.0961349Z               "line": 52
2026-08-28T09:54:48.0961607Z             },
2026-08-28T09:54:48.0961865Z             {
2026-08-28T09:54:48.0962217Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:48.0962475Z               "line": 88
2026-08-28T09:54:48.0962733Z             },
2026-08-28T09:54:48.0962990Z             {
2026-08-28T09:54:48.0963336Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:48.0963611Z               "line": 128
2026-08-28T09:54:48.0963954Z             },
2026-08-28T09:54:48.0964216Z             {
2026-08-28T09:54:48.0964559Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:48.0964836Z               "line": 255
2026-08-28T09:54:48.0965089Z             }
2026-08-28T09:54:48.0965338Z           ]
2026-08-28T09:54:48.0965586Z         },
2026-08-28T09:54:48.0965838Z         "int": {
2026-08-28T09:54:48.0966137Z           "complete": true,
2026-08-28T09:54:48.0966409Z           "evidence": [
2026-08-28T09:54:48.0966681Z             {
2026-08-28T09:54:48.0967085Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:48.0967414Z               "line": 605
2026-08-28T09:54:48.0967672Z             }
2026-08-28T09:54:48.0967930Z           ]
2026-08-28T09:54:48.0968194Z         },
2026-08-28T09:54:48.0968453Z         "unit": {
2026-08-28T09:54:48.0968741Z           "complete": true,
2026-08-28T09:54:48.0969100Z           "evidence": [
2026-08-28T09:54:48.0969357Z             {
2026-08-28T09:54:48.0969704Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:48.0969986Z               "line": 179
2026-08-28T09:54:48.0970239Z             },
2026-08-28T09:54:48.0970502Z             {
2026-08-28T09:54:48.0970845Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:48.0971108Z               "line": 204
2026-08-28T09:54:48.0971373Z             },
2026-08-28T09:54:48.0971623Z             {
2026-08-28T09:54:48.0971981Z               "path": "crates/spt-store/src/epoch.rs",
2026-08-28T09:54:48.0972247Z               "line": 218
2026-08-28T09:54:48.0972515Z             },
2026-08-28T09:54:48.0972768Z             {
2026-08-28T09:54:48.0973129Z               "path": "crates/spt-store/src/roster.rs",
2026-08-28T09:54:48.0973402Z               "line": 537
2026-08-28T09:54:48.0973651Z             }
2026-08-28T09:54:48.0973911Z           ]
2026-08-28T09:54:48.0974166Z         }
2026-08-28T09:54:48.0974485Z       }
2026-08-28T09:54:48.0974739Z     },
2026-08-28T09:54:48.0975001Z     {
2026-08-28T09:54:48.0975353Z       "id": "REQ-ROUTE-CHAIN-FAILED-ADDR-SKIP",
2026-08-28T09:54:48.0983667Z       "title": "WAN-TRUTH #40 F2 (the ROUTE-CHAIN consumer of REQ-DIAL-FAILED-ADDR-MEMORY): leg 2 of resolve_submit_addr skips a validated roster address that IS the address the last dial failed on, falling through to leg 3 (id-only discovery) — the leg the field incident could never reach. Every other roster address still resolves exactly as today: this is a skip of one known-dead value, NOT a demotion of the roster leg, so a node holding a genuinely fresher roster address still heals connection-free (REQ-PEER-ROUTE-CHAIN's guarantee, re-pinned by intent rather than inverted). Sibling: REQ-RECONCILE-FAILED-ADDR-REFUSE, the same memory read at the reconcile consumer. Gate: impl — the leg-2 skip through the shared helper; unit — a roster address equal to the just-failed one falls through to discovery, a roster address DIFFERING from it still resolves at leg 2 (the strand-heal intent), and with no failure recorded the chain order is unchanged.",
2026-08-28T09:54:48.0984063Z       "requiredStages": [
2026-08-28T09:54:48.0984329Z         "impl",
2026-08-28T09:54:48.0984580Z         "unit"
2026-08-28T09:54:48.0984836Z       ],
2026-08-28T09:54:48.0985098Z       "stages": {
2026-08-28T09:54:48.0985355Z         "doc": {
2026-08-28T09:54:48.0985642Z           "complete": false,
2026-08-28T09:54:48.0985918Z           "evidence": []
2026-08-28T09:54:48.0986167Z         },
2026-08-28T09:54:48.0986439Z         "impl": {
2026-08-28T09:54:48.0986721Z           "complete": true,
2026-08-28T09:54:48.0987001Z           "evidence": [
2026-08-28T09:54:48.0987257Z             {
2026-08-28T09:54:48.0987629Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.0987900Z               "line": 1224
2026-08-28T09:54:48.0988155Z             }
2026-08-28T09:54:48.0988412Z           ]
2026-08-28T09:54:48.0988665Z         },
2026-08-28T09:54:48.0988931Z         "int": {
2026-08-28T09:54:48.0989380Z           "complete": true,
2026-08-28T09:54:48.0989650Z           "evidence": [
2026-08-28T09:54:48.0989910Z             {
2026-08-28T09:54:48.0990306Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:48.0990578Z               "line": 456
2026-08-28T09:54:48.0990830Z             }
2026-08-28T09:54:48.0991087Z           ]
2026-08-28T09:54:48.0991335Z         },
2026-08-28T09:54:48.0991603Z         "unit": {
2026-08-28T09:54:48.0991886Z           "complete": true,
2026-08-28T09:54:48.0992147Z           "evidence": [
2026-08-28T09:54:48.0992398Z             {
2026-08-28T09:54:48.0992810Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.0993091Z               "line": 2411
2026-08-28T09:54:48.0993344Z             }
2026-08-28T09:54:48.0993602Z           ]
2026-08-28T09:54:48.0993850Z         }
2026-08-28T09:54:48.0994109Z       }
2026-08-28T09:54:48.0994365Z     },
2026-08-28T09:54:48.0994618Z     {
2026-08-28T09:54:48.0994931Z       "id": "REQ-RUN-EMPTY-CREATE",
2026-08-28T09:54:48.0998823Z       "title": "`spt endpoint run` / bare `spt` routes a TOTALLY-EMPTY scope straight to the endpoint-creation flow: when gather_endpoints() is empty (nothing attachable, local OR subnet) PickerModel::new opens on Screen::CreateAdapter instead of PickExisting (today it always opens PickExisting + renders a blank list). A node WITH subnet endpoints but no local ones still has things to pick → stays on the picker. Extends REQ-RUN-PICKER. (v0.16.0)",
2026-08-28T09:54:48.0999220Z       "requiredStages": [
2026-08-28T09:54:48.0999482Z         "impl",
2026-08-28T09:54:48.0999739Z         "unit"
2026-08-28T09:54:48.0999996Z       ],
2026-08-28T09:54:48.1000253Z       "stages": {
2026-08-28T09:54:48.1000518Z         "doc": {
2026-08-28T09:54:48.1000804Z           "complete": false,
2026-08-28T09:54:48.1001084Z           "evidence": []
2026-08-28T09:54:48.1001342Z         },
2026-08-28T09:54:48.1001666Z         "impl": {
2026-08-28T09:54:48.1001948Z           "complete": true,
2026-08-28T09:54:48.1002234Z           "evidence": [
2026-08-28T09:54:48.1002488Z             {
2026-08-28T09:54:48.1002840Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1003125Z               "line": 924
2026-08-28T09:54:48.1003380Z             }
2026-08-28T09:54:48.1003642Z           ]
2026-08-28T09:54:48.1003899Z         },
2026-08-28T09:54:48.1004162Z         "int": {
2026-08-28T09:54:48.1004458Z           "complete": false,
2026-08-28T09:54:48.1004735Z           "evidence": []
2026-08-28T09:54:48.1005064Z         },
2026-08-28T09:54:48.1005322Z         "unit": {
2026-08-28T09:54:48.1005620Z           "complete": true,
2026-08-28T09:54:48.1005889Z           "evidence": [
2026-08-28T09:54:48.1006147Z             {
2026-08-28T09:54:48.1006499Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1006771Z               "line": 2281
2026-08-28T09:54:48.1007029Z             }
2026-08-28T09:54:48.1007278Z           ]
2026-08-28T09:54:48.1007536Z         }
2026-08-28T09:54:48.1007782Z       }
2026-08-28T09:54:48.1008045Z     },
2026-08-28T09:54:48.1008297Z     {
2026-08-28T09:54:48.1008617Z       "id": "REQ-RUN-ID-REUSES-ADAPTER",
2026-08-28T09:54:48.1020360Z       "title": "D-1 (REMOTE-TRUTH triage §D-1): `spt endpoint run --id <id>` with NO --adapter, when <id> names an EXISTING perch, REUSES that perch's recorded info.adapter and runs NON-INTERACTIVELY — instead of always falling to the picker as a create-new prefill (an existing endpoint retyping its own adapter, or being sent to a create-new flow, is the operator wart). ROOT (certain, no design tension): the cli `match (adapter,id)` special-cased only (Some,Some)→cmd_endpoint_run; the catch-all routed EVERY lone --id to crate::picker::run as a create-new prefill, never considering an existing endpoint (cli.rs ~1290). FIX: a PURE resolve_run_target(adapter, id, recorded) over the 4 (adapter?,id?) quadrants — (Some,Some)→Direct{a,id}; (None,Some(id))→ recorded adapter present (info.adapter = adapter-chosen-at-creation, spt-store info.rs:167) → Direct{recorded,id}, absent/no-perch → Picker{None,Some(id)} (today's create-new prefill UNCHANGED); (Some,None)/(None,None)→Picker unchanged. The perch lookup (read_info(resolve_perch_path(id,Infer)).adapter) is INJECTED as a closure so the router is pure + testable without a perch on disk; resume threads into BOTH Direct paths. Red-first: (None,Some(id),recorded=Some) → Direct (pre-fix this routed to Picker create-new). int (live run --id on an existing perch reuses its recorded adapter non-interactively) deferred to the rig.",
2026-08-28T09:54:48.1020864Z       "requiredStages": [
2026-08-28T09:54:48.1021126Z         "impl",
2026-08-28T09:54:48.1021382Z         "unit"
2026-08-28T09:54:48.1021643Z       ],
2026-08-28T09:54:48.1021900Z       "stages": {
2026-08-28T09:54:48.1022157Z         "doc": {
2026-08-28T09:54:48.1022449Z           "complete": false,
2026-08-28T09:54:48.1022735Z           "evidence": []
2026-08-28T09:54:48.1022997Z         },
2026-08-28T09:54:48.1023270Z         "impl": {
2026-08-28T09:54:48.1023556Z           "complete": true,
2026-08-28T09:54:48.1023823Z           "evidence": [
2026-08-28T09:54:48.1024078Z             {
2026-08-28T09:54:48.1024390Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1024667Z               "line": 2961
2026-08-28T09:54:48.1024920Z             },
2026-08-28T09:54:48.1025178Z             {
2026-08-28T09:54:48.1025493Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1025760Z               "line": 4022
2026-08-28T09:54:48.1026026Z             }
2026-08-28T09:54:48.1026274Z           ]
2026-08-28T09:54:48.1026532Z         },
2026-08-28T09:54:48.1026788Z         "int": {
2026-08-28T09:54:48.1027072Z           "complete": false,
2026-08-28T09:54:48.1027339Z           "evidence": []
2026-08-28T09:54:48.1027596Z         },
2026-08-28T09:54:48.1027854Z         "unit": {
2026-08-28T09:54:48.1028135Z           "complete": true,
2026-08-28T09:54:48.1028469Z           "evidence": [
2026-08-28T09:54:48.1028727Z             {
2026-08-28T09:54:48.1029126Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1029394Z               "line": 3310
2026-08-28T09:54:48.1029651Z             },
2026-08-28T09:54:48.1029903Z             {
2026-08-28T09:54:48.1030223Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1030494Z               "line": 3504
2026-08-28T09:54:48.1030747Z             }
2026-08-28T09:54:48.1030995Z           ]
2026-08-28T09:54:48.1031235Z         }
2026-08-28T09:54:48.1031550Z       }
2026-08-28T09:54:48.1031795Z     },
2026-08-28T09:54:48.1032050Z     {
2026-08-28T09:54:48.1032365Z       "id": "REQ-RUN-MULTISUBNET-HOME",
2026-08-28T09:54:48.1040240Z       "title": "`spt endpoint run` resolves the home subnet at the skeleton-create step and pre-creates the skeleton perch carrying it, so the harness `bind` inherits home via establish_perch's immutable prior-branch (no hook change, no env injection). Resolution: sole-subnet auto; multi-subnet + no --subnet + NON-interactive terminal -> refuse early with MRU-ordered --subnet guidance (never the silent 25s online-timeout); multi-subnet + no --subnet + INTERACTIVE -> print proposed config (id/project/adapter[:profile]/home=MRU-default) + 'Ok to proceed? Y/n', n -> --subnet guidance; --subnet overrides + validates membership. MRU = ordered move-to-front LISTs at two levels (per-project + always-updated node-global fallback). Home stays IMMUTABLE (ADR-0010). Fixes the LATENT multi-subnet bringup gap (perri, not a regression — HOME_REFUSED established >=0.11.0; exposed by the node crossing 1->2 subnets). (ADR-0026)",
2026-08-28T09:54:48.1040550Z       "requiredStages": [
2026-08-28T09:54:48.1040802Z         "doc",
2026-08-28T09:54:48.1041064Z         "impl",
2026-08-28T09:54:48.1041321Z         "unit",
2026-08-28T09:54:48.1041579Z         "int"
2026-08-28T09:54:48.1041837Z       ],
2026-08-28T09:54:48.1042095Z       "stages": {
2026-08-28T09:54:48.1042364Z         "doc": {
2026-08-28T09:54:48.1042639Z           "complete": true,
2026-08-28T09:54:48.1042991Z           "evidence": [
2026-08-28T09:54:48.1043244Z             {
2026-08-28T09:54:48.1043827Z               "path": "docs/adr/0026-multi-subnet-home-at-endpoint-run-creation.md",
2026-08-28T09:54:48.1044098Z               "line": 11
2026-08-28T09:54:48.1044352Z             }
2026-08-28T09:54:48.1044614Z           ]
2026-08-28T09:54:48.1044866Z         },
2026-08-28T09:54:48.1045142Z         "impl": {
2026-08-28T09:54:48.1045435Z           "complete": true,
2026-08-28T09:54:48.1045721Z           "evidence": [
2026-08-28T09:54:48.1045974Z             {
2026-08-28T09:54:48.1046483Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1046923Z               "line": 16
2026-08-28T09:54:48.1047176Z             },
2026-08-28T09:54:48.1047447Z             {
2026-08-28T09:54:48.1047908Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1048331Z               "line": 42
2026-08-28T09:54:48.1048597Z             },
2026-08-28T09:54:48.1048865Z             {
2026-08-28T09:54:48.1049341Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1049633Z               "line": 50
2026-08-28T09:54:48.1049894Z             },
2026-08-28T09:54:48.1050144Z             {
2026-08-28T09:54:48.1050463Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1050733Z               "line": 4628
2026-08-28T09:54:48.1050990Z             },
2026-08-28T09:54:48.1051242Z             {
2026-08-28T09:54:48.1051557Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1051829Z               "line": 4779
2026-08-28T09:54:48.1052083Z             },
2026-08-28T09:54:48.1052341Z             {
2026-08-28T09:54:48.1052811Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1053095Z               "line": 4801
2026-08-28T09:54:48.1053347Z             },
2026-08-28T09:54:48.1053604Z             {
2026-08-28T09:54:48.1054001Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1054278Z               "line": 4823
2026-08-28T09:54:48.1054534Z             },
2026-08-28T09:54:48.1054787Z             {
2026-08-28T09:54:48.1055092Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1055364Z               "line": 4852
2026-08-28T09:54:48.1055613Z             }
2026-08-28T09:54:48.1055859Z           ]
2026-08-28T09:54:48.1056118Z         },
2026-08-28T09:54:48.1056371Z         "int": {
2026-08-28T09:54:48.1056658Z           "complete": true,
2026-08-28T09:54:48.1056935Z           "evidence": [
2026-08-28T09:54:48.1057249Z             {
2026-08-28T09:54:48.1057678Z               "path": "crates/spt/tests/multi_subnet_bringup_e2e.rs",
2026-08-28T09:54:48.1057954Z               "line": 197
2026-08-28T09:54:48.1058217Z             },
2026-08-28T09:54:48.1058463Z             {
2026-08-28T09:54:48.1058882Z               "path": "crates/spt/tests/multi_subnet_bringup_e2e.rs",
2026-08-28T09:54:48.1059243Z               "line": 295
2026-08-28T09:54:48.1059511Z             },
2026-08-28T09:54:48.1059768Z             {
2026-08-28T09:54:48.1060188Z               "path": "crates/spt/tests/multi_subnet_bringup_e2e.rs",
2026-08-28T09:54:48.1060464Z               "line": 301
2026-08-28T09:54:48.1060718Z             },
2026-08-28T09:54:48.1060981Z             {
2026-08-28T09:54:48.1061394Z               "path": "crates/spt/tests/multi_subnet_bringup_e2e.rs",
2026-08-28T09:54:48.1061675Z               "line": 312
2026-08-28T09:54:48.1061937Z             }
2026-08-28T09:54:48.1062189Z           ]
2026-08-28T09:54:48.1062456Z         },
2026-08-28T09:54:48.1062718Z         "unit": {
2026-08-28T09:54:48.1063005Z           "complete": true,
2026-08-28T09:54:48.1063268Z           "evidence": [
2026-08-28T09:54:48.1063528Z             {
2026-08-28T09:54:48.1063908Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1064170Z               "line": 115
2026-08-28T09:54:48.1064427Z             },
2026-08-28T09:54:48.1064698Z             {
2026-08-28T09:54:48.1065080Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1065534Z               "line": 137
2026-08-28T09:54:48.1065792Z             },
2026-08-28T09:54:48.1066044Z             {
2026-08-28T09:54:48.1066404Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1066688Z               "line": 156
2026-08-28T09:54:48.1066941Z             },
2026-08-28T09:54:48.1067199Z             {
2026-08-28T09:54:48.1067575Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1067847Z               "line": 170
2026-08-28T09:54:48.1068162Z             },
2026-08-28T09:54:48.1068415Z             {
2026-08-28T09:54:48.1068791Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1069141Z               "line": 189
2026-08-28T09:54:48.1069409Z             },
2026-08-28T09:54:48.1069656Z             {
2026-08-28T09:54:48.1070038Z               "path": "crates/spt-store/src/recent_home.rs",
2026-08-28T09:54:48.1070324Z               "line": 198
2026-08-28T09:54:48.1070587Z             },
2026-08-28T09:54:48.1070843Z             {
2026-08-28T09:54:48.1071148Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1071420Z               "line": 5034
2026-08-28T09:54:48.1071672Z             },
2026-08-28T09:54:48.1071930Z             {
2026-08-28T09:54:48.1072245Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1072512Z               "line": 5084
2026-08-28T09:54:48.1072764Z             }
2026-08-28T09:54:48.1073021Z           ]
2026-08-28T09:54:48.1073278Z         }
2026-08-28T09:54:48.1073527Z       }
2026-08-28T09:54:48.1073781Z     },
2026-08-28T09:54:48.1074026Z     {
2026-08-28T09:54:48.1074343Z       "id": "REQ-RUN-NO-DUP-SESSION",
2026-08-28T09:54:48.1081570Z       "title": "B1 (F028, hall-b diagnosis, verified 0.22.0): `endpoint run --id X --create` on an endpoint with a LIVE session mints a silent DUPLICATE session — and attach output can CROSS sessions (second create for diag-hallc minted a new session while the old ran; the new run's attach viewport rendered the OLD session's screen — claude resume-picker UI of pid 84512 while new claude 356020 had no -r). ROOT CLASS of the 0.21.0 attach-stall (zero events in FIRST_EVENT_GRACE rc.rs:1402 = attach bound to dead/wrong same-id slot); also the triplicate `launch --id ball-b` on ENLYZEAM. FIX: (i) run-on-live-session must REFUSE or REATTACH, never silently duplicate; (ii) RCA the attach/output routing that let frames cross same-id sessions (broker session-slot keying, dispatch_adapter vs serve_attach resolution). Int: two sessions one endpoint id -> each attach sees only its own frames. See triage B1.",
2026-08-28T09:54:48.1082028Z       "requiredStages": [
2026-08-28T09:54:48.1082294Z         "impl",
2026-08-28T09:54:48.1082547Z         "unit",
2026-08-28T09:54:48.1082800Z         "int"
2026-08-28T09:54:48.1083048Z       ],
2026-08-28T09:54:48.1083304Z       "stages": {
2026-08-28T09:54:48.1083600Z         "doc": {
2026-08-28T09:54:48.1083877Z           "complete": false,
2026-08-28T09:54:48.1084172Z           "evidence": []
2026-08-28T09:54:48.1084426Z         },
2026-08-28T09:54:48.1084681Z         "impl": {
2026-08-28T09:54:48.1084975Z           "complete": true,
2026-08-28T09:54:48.1085256Z           "evidence": [
2026-08-28T09:54:48.1085513Z             {
2026-08-28T09:54:48.1085823Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1086096Z               "line": 2897
2026-08-28T09:54:48.1086358Z             },
2026-08-28T09:54:48.1086612Z             {
2026-08-28T09:54:48.1086927Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1087203Z               "line": 2923
2026-08-28T09:54:48.1087463Z             },
2026-08-28T09:54:48.1087708Z             {
2026-08-28T09:54:48.1088023Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1088296Z               "line": 4539
2026-08-28T09:54:48.1088549Z             }
2026-08-28T09:54:48.1088801Z           ]
2026-08-28T09:54:48.1089179Z         },
2026-08-28T09:54:48.1089559Z         "int": {
2026-08-28T09:54:48.1089851Z           "complete": true,
2026-08-28T09:54:48.1090130Z           "evidence": [
2026-08-28T09:54:48.1090380Z             {
2026-08-28T09:54:48.1090786Z               "path": "crates/spt/tests/run_no_dup_session_e2e.rs",
2026-08-28T09:54:48.1091058Z               "line": 303
2026-08-28T09:54:48.1091314Z             }
2026-08-28T09:54:48.1091563Z           ]
2026-08-28T09:54:48.1091873Z         },
2026-08-28T09:54:48.1092235Z         "unit": {
2026-08-28T09:54:48.1092531Z           "complete": true,
2026-08-28T09:54:48.1092806Z           "evidence": [
2026-08-28T09:54:48.1093126Z             {
2026-08-28T09:54:48.1093450Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1093722Z               "line": 5001
2026-08-28T09:54:48.1093980Z             }
2026-08-28T09:54:48.1094232Z           ]
2026-08-28T09:54:48.1094485Z         }
2026-08-28T09:54:48.1094742Z       }
2026-08-28T09:54:48.1095000Z     },
2026-08-28T09:54:48.1095256Z     {
2026-08-28T09:54:48.1095555Z       "id": "REQ-RUN-PICKER",
2026-08-28T09:54:48.1109340Z       "title": "Interactive `spt endpoint run` picker (ratatui TUI): bare `spt` on an interactive terminal enters an in-process picker (flags-present = the REQ-HOST-RUN-1 non-interactive path, untouched). Layer 1 picks kind (Create new | Pick existing). Create-new: choose a registered kind=\"harness\" adapter with its shipped+local profiles tree-nested (registry::registered / manifest.profiles / local_profile_names) → enter a charset-validated id → start. Pick-existing: category select (left/right) over [<cwd-project> | Local node | Subnet], endpoints grouped + alphabetically sorted per category, a status square per endpoint (online green ■ / offline gray ▢ — the blue \"attached\" tri-state + Kick are DEFERRED to a broker attach-presence slice, M12-W2-RULING Q1), type-to-filter (`/`, nucleo-matcher), a pinned keybind legend, and a right-half two-pane description (harness adapter:profile · best-effort project history newest→oldest from the contextstore p-<project> branches, empty-if-none · `spt endpoint description`). Confirm layer offers status-dependent options — Attach/Start/View (rc pump / cmd_endpoint_run) · Instantiate-locally (remote) · Change-harness-adapter (offline) · Fork (cmd_fork) · Resume-from-history (offline+LOCAL only; enumerate spt_store::sessions::last_k, titles `<project> @ <ts> (…id5)`, feed session_id → cmd_endpoint_run --resume). A single action enum is the source of truth so a future tap-mode (phone PTY) layers on without re-coupling to keybinds. EVERY terminal action routes through cmd_endpoint_run / existing CLI fns — no second bringup path.",
2026-08-28T09:54:48.1109839Z       "requiredStages": [
2026-08-28T09:54:48.1110103Z         "doc",
2026-08-28T09:54:48.1110360Z         "impl",
2026-08-28T09:54:48.1110618Z         "unit"
2026-08-28T09:54:48.1110876Z       ],
2026-08-28T09:54:48.1111136Z       "stages": {
2026-08-28T09:54:48.1111410Z         "doc": {
2026-08-28T09:54:48.1111687Z           "complete": true,
2026-08-28T09:54:48.1111983Z           "evidence": [
2026-08-28T09:54:48.1112236Z             {
2026-08-28T09:54:48.1112536Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1112808Z               "line": 449
2026-08-28T09:54:48.1113060Z             }
2026-08-28T09:54:48.1113322Z           ]
2026-08-28T09:54:48.1113570Z         },
2026-08-28T09:54:48.1113843Z         "impl": {
2026-08-28T09:54:48.1114127Z           "complete": true,
2026-08-28T09:54:48.1114408Z           "evidence": [
2026-08-28T09:54:48.1114670Z             {
2026-08-28T09:54:48.1114994Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1115276Z               "line": 1988
2026-08-28T09:54:48.1115524Z             },
2026-08-28T09:54:48.1115787Z             {
2026-08-28T09:54:48.1116101Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1116372Z               "line": 1998
2026-08-28T09:54:48.1116622Z             },
2026-08-28T09:54:48.1116884Z             {
2026-08-28T09:54:48.1117222Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.1117566Z               "line": 9
2026-08-28T09:54:48.1117823Z             },
2026-08-28T09:54:48.1118077Z             {
2026-08-28T09:54:48.1118420Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.1118687Z               "line": 102
2026-08-28T09:54:48.1119039Z             },
2026-08-28T09:54:48.1119291Z             {
2026-08-28T09:54:48.1119633Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:48.1119910Z               "line": 16
2026-08-28T09:54:48.1120172Z             },
2026-08-28T09:54:48.1120486Z             {
2026-08-28T09:54:48.1120826Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:48.1121092Z               "line": 188
2026-08-28T09:54:48.1121340Z             },
2026-08-28T09:54:48.1121601Z             {
2026-08-28T09:54:48.1121937Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:48.1122210Z               "line": 503
2026-08-28T09:54:48.1122467Z             },
2026-08-28T09:54:48.1122724Z             {
2026-08-28T09:54:48.1123077Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1123343Z               "line": 11
2026-08-28T09:54:48.1123600Z             },
2026-08-28T09:54:48.1123848Z             {
2026-08-28T09:54:48.1124197Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1124469Z               "line": 177
2026-08-28T09:54:48.1124726Z             },
2026-08-28T09:54:48.1124974Z             {
2026-08-28T09:54:48.1125332Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1125608Z               "line": 1101
2026-08-28T09:54:48.1125860Z             },
2026-08-28T09:54:48.1126113Z             {
2026-08-28T09:54:48.1126451Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1126727Z               "line": 1237
2026-08-28T09:54:48.1126974Z             },
2026-08-28T09:54:48.1127288Z             {
2026-08-28T09:54:48.1127636Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1127912Z               "line": 1361
2026-08-28T09:54:48.1128165Z             },
2026-08-28T09:54:48.1128417Z             {
2026-08-28T09:54:48.1128765Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1129119Z               "line": 1427
2026-08-28T09:54:48.1129381Z             },
2026-08-28T09:54:48.1129632Z             {
2026-08-28T09:54:48.1129983Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1130254Z               "line": 1470
2026-08-28T09:54:48.1130569Z             },
2026-08-28T09:54:48.1130827Z             {
2026-08-28T09:54:48.1131160Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1131437Z               "line": 8
2026-08-28T09:54:48.1131686Z             }
2026-08-28T09:54:48.1131942Z           ]
2026-08-28T09:54:48.1132190Z         },
2026-08-28T09:54:48.1132450Z         "int": {
2026-08-28T09:54:48.1132746Z           "complete": false,
2026-08-28T09:54:48.1133017Z           "evidence": []
2026-08-28T09:54:48.1133274Z         },
2026-08-28T09:54:48.1133570Z         "unit": {
2026-08-28T09:54:48.1133836Z           "complete": true,
2026-08-28T09:54:48.1134109Z           "evidence": [
2026-08-28T09:54:48.1134376Z             {
2026-08-28T09:54:48.1134690Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1134968Z               "line": 28102
2026-08-28T09:54:48.1135233Z             },
2026-08-28T09:54:48.1135490Z             {
2026-08-28T09:54:48.1135805Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1136076Z               "line": 28113
2026-08-28T09:54:48.1136335Z             },
2026-08-28T09:54:48.1136616Z             {
2026-08-28T09:54:48.1136949Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1137213Z               "line": 2194
2026-08-28T09:54:48.1137463Z             },
2026-08-28T09:54:48.1137718Z             {
2026-08-28T09:54:48.1138081Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1138572Z               "line": 2255
2026-08-28T09:54:48.1138830Z             },
2026-08-28T09:54:48.1139168Z             {
2026-08-28T09:54:48.1139506Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1139784Z               "line": 2310
2026-08-28T09:54:48.1140037Z             },
2026-08-28T09:54:48.1140292Z             {
2026-08-28T09:54:48.1140638Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1140914Z               "line": 2319
2026-08-28T09:54:48.1141172Z             },
2026-08-28T09:54:48.1141430Z             {
2026-08-28T09:54:48.1141835Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1142107Z               "line": 2330
2026-08-28T09:54:48.1142364Z             },
2026-08-28T09:54:48.1142614Z             {
2026-08-28T09:54:48.1142964Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1143239Z               "line": 2352
2026-08-28T09:54:48.1143496Z             },
2026-08-28T09:54:48.1143762Z             {
2026-08-28T09:54:48.1144105Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1144382Z               "line": 2371
2026-08-28T09:54:48.1144635Z             },
2026-08-28T09:54:48.1144898Z             {
2026-08-28T09:54:48.1145241Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1145509Z               "line": 2483
2026-08-28T09:54:48.1145769Z             },
2026-08-28T09:54:48.1146017Z             {
2026-08-28T09:54:48.1146365Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1146685Z               "line": 2514
2026-08-28T09:54:48.1146961Z             },
2026-08-28T09:54:48.1147204Z             {
2026-08-28T09:54:48.1147567Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1147843Z               "line": 2641
2026-08-28T09:54:48.1148100Z             },
2026-08-28T09:54:48.1148369Z             {
2026-08-28T09:54:48.1148775Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1149128Z               "line": 2711
2026-08-28T09:54:48.1149385Z             },
2026-08-28T09:54:48.1149643Z             {
2026-08-28T09:54:48.1150006Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1150306Z               "line": 2902
2026-08-28T09:54:48.1150564Z             },
2026-08-28T09:54:48.1150814Z             {
2026-08-28T09:54:48.1151164Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1151470Z               "line": 2918
2026-08-28T09:54:48.1151794Z             },
2026-08-28T09:54:48.1152056Z             {
2026-08-28T09:54:48.1152424Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1152792Z               "line": 1042
2026-08-28T09:54:48.1153179Z             },
2026-08-28T09:54:48.1153515Z             {
2026-08-28T09:54:48.1153876Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1154147Z               "line": 1057
2026-08-28T09:54:48.1154414Z             },
2026-08-28T09:54:48.1154680Z             {
2026-08-28T09:54:48.1155019Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1155291Z               "line": 1094
2026-08-28T09:54:48.1155543Z             },
2026-08-28T09:54:48.1155801Z             {
2026-08-28T09:54:48.1156149Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1156416Z               "line": 1119
2026-08-28T09:54:48.1156673Z             },
2026-08-28T09:54:48.1156935Z             {
2026-08-28T09:54:48.1157288Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1157559Z               "line": 1129
2026-08-28T09:54:48.1157827Z             },
2026-08-28T09:54:48.1158079Z             {
2026-08-28T09:54:48.1158422Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1158688Z               "line": 1285
2026-08-28T09:54:48.1159039Z             }
2026-08-28T09:54:48.1159288Z           ]
2026-08-28T09:54:48.1159545Z         }
2026-08-28T09:54:48.1159807Z       }
2026-08-28T09:54:48.1160145Z     },
2026-08-28T09:54:48.1160407Z     {
2026-08-28T09:54:48.1160712Z       "id": "REQ-RUN-PICKER-HOME",
2026-08-28T09:54:48.1170553Z       "title": "Home-subnet selection LAYER in the `spt endpoint run` ratatui Create-new picker (v0.14.1; the deferred half of REQ-RUN-MULTISUBNET-HOME's interactive path — ADR-0026 §3 'the interactive picker lists subnets MRU-ordered'). On a MULTI-SUBNET node the Create-new flow gains a `CreateHome` screen (CreateAdapter → CreateId → CreateHome → Confirm) that lists the node's MEMBER subnets MRU-ordered (reusing recent_home::mru_preference + order_by_mru), default cursor = MRU head; the chosen subnet rides Outcome::Run{subnet} into cmd_endpoint_run's --subnet, so decide_run_home resolves Home directly and the post-TUI `Ok to proceed? Y/n` confirm NEVER fires for the picker path. Single-subnet / local-only nodes SKIP the layer (assign_home auto-homes; CreateId → Confirm unchanged). The CLI `endpoint create` path KEEPS the decide_run_home Y/n confirm + the non-interactive MULTI_SUBNET_HOME refuse (operator: the confirm stays useful for CLI-only bringup, just not in the TUI). Esc backs CreateHome → CreateId; Enter selects → Confirm. Pure front-end invariant preserved: the layer only collects --subnet, routes through the one bringup core.",
2026-08-28T09:54:48.1170963Z       "requiredStages": [
2026-08-28T09:54:48.1171220Z         "doc",
2026-08-28T09:54:48.1171478Z         "impl",
2026-08-28T09:54:48.1171737Z         "unit"
2026-08-28T09:54:48.1171992Z       ],
2026-08-28T09:54:48.1172266Z       "stages": {
2026-08-28T09:54:48.1172524Z         "doc": {
2026-08-28T09:54:48.1172815Z           "complete": true,
2026-08-28T09:54:48.1173091Z           "evidence": [
2026-08-28T09:54:48.1173345Z             {
2026-08-28T09:54:48.1173640Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1173907Z               "line": 463
2026-08-28T09:54:48.1174159Z             }
2026-08-28T09:54:48.1174406Z           ]
2026-08-28T09:54:48.1174733Z         },
2026-08-28T09:54:48.1175001Z         "impl": {
2026-08-28T09:54:48.1175286Z           "complete": true,
2026-08-28T09:54:48.1175587Z           "evidence": [
2026-08-28T09:54:48.1175830Z             {
2026-08-28T09:54:48.1176188Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.1176449Z               "line": 51
2026-08-28T09:54:48.1176706Z             },
2026-08-28T09:54:48.1176959Z             {
2026-08-28T09:54:48.1177302Z               "path": "crates/spt/src/picker/mod.rs",
2026-08-28T09:54:48.1177575Z               "line": 537
2026-08-28T09:54:48.1177894Z             },
2026-08-28T09:54:48.1178156Z             {
2026-08-28T09:54:48.1178494Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1178767Z               "line": 1059
2026-08-28T09:54:48.1179199Z             },
2026-08-28T09:54:48.1179457Z             {
2026-08-28T09:54:48.1179803Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1180079Z               "line": 1075
2026-08-28T09:54:48.1180331Z             },
2026-08-28T09:54:48.1180578Z             {
2026-08-28T09:54:48.1180927Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1181217Z               "line": 245
2026-08-28T09:54:48.1181475Z             }
2026-08-28T09:54:48.1181723Z           ]
2026-08-28T09:54:48.1181982Z         },
2026-08-28T09:54:48.1182234Z         "int": {
2026-08-28T09:54:48.1182528Z           "complete": false,
2026-08-28T09:54:48.1182811Z           "evidence": []
2026-08-28T09:54:48.1183060Z         },
2026-08-28T09:54:48.1183327Z         "unit": {
2026-08-28T09:54:48.1183600Z           "complete": true,
2026-08-28T09:54:48.1183885Z           "evidence": [
2026-08-28T09:54:48.1184138Z             {
2026-08-28T09:54:48.1184482Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.1184753Z               "line": 1437
2026-08-28T09:54:48.1185009Z             },
2026-08-28T09:54:48.1185265Z             {
2026-08-28T09:54:48.1185641Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1186104Z               "line": 2929
2026-08-28T09:54:48.1186366Z             },
2026-08-28T09:54:48.1186623Z             {
2026-08-28T09:54:48.1186986Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1187257Z               "line": 2956
2026-08-28T09:54:48.1187514Z             },
2026-08-28T09:54:48.1187778Z             {
2026-08-28T09:54:48.1188121Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1188392Z               "line": 2982
2026-08-28T09:54:48.1188654Z             },
2026-08-28T09:54:48.1188906Z             {
2026-08-28T09:54:48.1189440Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.1189717Z               "line": 3005
2026-08-28T09:54:48.1189981Z             },
2026-08-28T09:54:48.1190236Z             {
2026-08-28T09:54:48.1190567Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.1190843Z               "line": 1075
2026-08-28T09:54:48.1191096Z             }
2026-08-28T09:54:48.1191373Z           ]
2026-08-28T09:54:48.1191631Z         }
2026-08-28T09:54:48.1191884Z       }
2026-08-28T09:54:48.1192131Z     },
2026-08-28T09:54:48.1192393Z     {
2026-08-28T09:54:48.1192684Z       "id": "REQ-RUN-SHORTCUT",
2026-08-28T09:54:48.1206163Z       "title": "`<basename>-<id>` launcher shortcut generation (picker `s` keybind, M12-W2-T2.4): from any pre-start options set the picker writes/updates a `<basename>-<id>` launcher at the project root whose body is `spt go <id>` (since U3 it bakes no selection; pre-U3 it baked the non-interactive flags: adapter[:profile] + id + (create|resume) + (start|attach|view); Kick/Instantiate/Change-adapter/Fork are interactive-only, not bakeable). BASENAME IS A PARAMETER (operator rev. 2026-06-14): harness-agnostic spt-core defaults to `spt` (→ `spt-<id>`); an adapter/flow OVERRIDES it (spt-claude-code → `cc`), so spt-core NEVER bakes `cc` (a harness name) into itself. The basename must be a DISTINCT token, never bare `spt` (a `spt.cmd` would shadow the real `spt.exe` only under cmd.exe cwd-first search, silently no-op in PowerShell/Unix, and self-recurse). The script is the CURRENT OS's native form — `.cmd` on Windows (NOT `.ps1`: default PATHEXT excludes `.ps1` so a bare/ext-less name never resolves one; `.cmd` is PATHEXT-resolvable), POSIX `sh` (+chmod +x) on Unix (a single portable form can't be both). The generated header documents the invocation reality (cmd.exe bare `<name>` in the project dir / PowerShell `.\\<name>` / Unix `./<name>`; a truly-bare basename on PATH = a PATH-installed launcher, `/spt:setup`'s job). Overwrite is SENTINEL-guarded: the generator writes + checks a generated-by header marker — it overwrites its own prior output freely, but REFUSES + warns if a same-named file lacks the sentinel (never clobber a user file). Requires the additive `--create` flag on `Run{}` (the default-fresh made explicit; N-1-safe).",
2026-08-28T09:54:48.1206648Z       "requiredStages": [
2026-08-28T09:54:48.1206915Z         "doc",
2026-08-28T09:54:48.1207181Z         "impl",
2026-08-28T09:54:48.1211798Z         "unit"
2026-08-28T09:54:48.1212084Z       ],
2026-08-28T09:54:48.1212365Z       "stages": {
2026-08-28T09:54:48.1212617Z         "doc": {
2026-08-28T09:54:48.1212913Z           "complete": true,
2026-08-28T09:54:48.1213179Z           "evidence": [
2026-08-28T09:54:48.1213432Z             {
2026-08-28T09:54:48.1213728Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1213997Z               "line": 497
2026-08-28T09:54:48.1214266Z             }
2026-08-28T09:54:48.1214530Z           ]
2026-08-28T09:54:48.1214788Z         },
2026-08-28T09:54:48.1215050Z         "impl": {
2026-08-28T09:54:48.1215370Z           "complete": true,
2026-08-28T09:54:48.1215632Z           "evidence": [
2026-08-28T09:54:48.1215891Z             {
2026-08-28T09:54:48.1216276Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1216549Z               "line": 42
2026-08-28T09:54:48.1216808Z             },
2026-08-28T09:54:48.1217068Z             {
2026-08-28T09:54:48.1217556Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1217818Z               "line": 95
2026-08-28T09:54:48.1218070Z             },
2026-08-28T09:54:48.1218323Z             {
2026-08-28T09:54:48.1218685Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1219039Z               "line": 165
2026-08-28T09:54:48.1219310Z             }
2026-08-28T09:54:48.1219566Z           ]
2026-08-28T09:54:48.1219820Z         },
2026-08-28T09:54:48.1220082Z         "int": {
2026-08-28T09:54:48.1220373Z           "complete": false,
2026-08-28T09:54:48.1220721Z           "evidence": []
2026-08-28T09:54:48.1220974Z         },
2026-08-28T09:54:48.1221235Z         "unit": {
2026-08-28T09:54:48.1221507Z           "complete": true,
2026-08-28T09:54:48.1221778Z           "evidence": [
2026-08-28T09:54:48.1222438Z             {
2026-08-28T09:54:48.1223077Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.1224045Z               "line": 3315
2026-08-28T09:54:48.1224688Z             },
2026-08-28T09:54:48.1225259Z             {
2026-08-28T09:54:48.1225944Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1226799Z               "line": 203
2026-08-28T09:54:48.1227426Z             },
2026-08-28T09:54:48.1227996Z             {
2026-08-28T09:54:48.1228665Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1229585Z               "line": 223
2026-08-28T09:54:48.1230212Z             },
2026-08-28T09:54:48.1230775Z             {
2026-08-28T09:54:48.1231442Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1232296Z               "line": 241
2026-08-28T09:54:48.1232923Z             },
2026-08-28T09:54:48.1233481Z             {
2026-08-28T09:54:48.1234148Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.1234987Z               "line": 279
2026-08-28T09:54:48.1235598Z             }
2026-08-28T09:54:48.1236232Z           ]
2026-08-28T09:54:48.1236771Z         }
2026-08-28T09:54:48.1237316Z       }
2026-08-28T09:54:48.1237848Z     },
2026-08-28T09:54:48.1238367Z     {
2026-08-28T09:54:48.1239099Z       "id": "REQ-SCREENGRID-REPAINT-MODE-REPLAY",
2026-08-28T09:54:48.1245942Z       "title": "RC-RENDER-TRUTH W3 (ADR-0043 decision 4, hertz stale-glyphs RCA leg 4 P1): ScreenGrid cold repaint replays EVERY tracked render-affecting mode — DECSTBM scroll margins at minimum — before final cursor placement (today render_repaint omits tracked margins, so client and server grids interpret subsequent raw scrolling against different regions => stale/moved rows after reattach/resize; the trailing-blank omission after ED2 is semantically correct and NOT the bug). Stateful emulator contract: dirty screen + synthesized repaint + next raw frame == server grid. Gate: impl — tracked-mode replay in render_repaint; unit — repaint emits tracked DECSTBM, emulator contract holds for scroll-after-repaint; doc — ADR-0043.",
2026-08-28T09:54:48.1252683Z       "requiredStages": [
2026-08-28T09:54:48.1253332Z         "doc",
2026-08-28T09:54:48.1253899Z         "impl",
2026-08-28T09:54:48.1254462Z         "unit"
2026-08-28T09:54:48.1255020Z       ],
2026-08-28T09:54:48.1255721Z       "stages": {
2026-08-28T09:54:48.1256326Z         "doc": {
2026-08-28T09:54:48.1256948Z           "complete": true,
2026-08-28T09:54:48.1257616Z           "evidence": [
2026-08-28T09:54:48.1258230Z             {
2026-08-28T09:54:48.1259040Z               "path": "docs/adr/0043-terminal-render-lifecycle.md",
2026-08-28T09:54:48.1259963Z               "line": 63
2026-08-28T09:54:48.1260582Z             }
2026-08-28T09:54:48.1261145Z           ]
2026-08-28T09:54:48.1261681Z         },
2026-08-28T09:54:48.1262226Z         "impl": {
2026-08-28T09:54:48.1262822Z           "complete": true,
2026-08-28T09:54:48.1263481Z           "evidence": [
2026-08-28T09:54:48.1264118Z             {
2026-08-28T09:54:48.1264769Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1265604Z               "line": 993
2026-08-28T09:54:48.1266352Z             }
2026-08-28T09:54:48.1267033Z           ]
2026-08-28T09:54:48.1267565Z         },
2026-08-28T09:54:48.1268104Z         "int": {
2026-08-28T09:54:48.1268705Z           "complete": false,
2026-08-28T09:54:48.1269486Z           "evidence": []
2026-08-28T09:54:48.1270108Z         },
2026-08-28T09:54:48.1270652Z         "unit": {
2026-08-28T09:54:48.1271253Z           "complete": true,
2026-08-28T09:54:48.1271907Z           "evidence": [
2026-08-28T09:54:48.1272534Z             {
2026-08-28T09:54:48.1273188Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1274094Z               "line": 1332
2026-08-28T09:54:48.1274731Z             },
2026-08-28T09:54:48.1275291Z             {
2026-08-28T09:54:48.1275949Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1276765Z               "line": 1350
2026-08-28T09:54:48.1277413Z             }
2026-08-28T09:54:48.1277968Z           ]
2026-08-28T09:54:48.1278515Z         }
2026-08-28T09:54:48.1279136Z       }
2026-08-28T09:54:48.1279708Z     },
2026-08-28T09:54:48.1280231Z     {
2026-08-28T09:54:48.1280806Z       "id": "REQ-SCREENGRID-WIDTH",
2026-08-28T09:54:48.1295875Z       "title": "TEARDOWN-AUTHORITY W3 (hertz field RCA 2026-07-19, doyle-confirmed at source): ScreenGrid models every character as ONE display column, so wide characters (CJK, emoji, and other 2-column glyphs) shift subsequent text left and leave stale scraps at the right margin — field repro on the Claude settings UI (left-shifted rows + To/Wh/Es left-margin scraps). SOURCE: spt-term/src/screen.rs Cell { ch: char, pen } (~127) carries NO width datum, and put_char (~327-343) unconditionally advances col += 1, with pending_wrap likewise advancing a single display cell. FIX: give the grid a real display-width model — a wide glyph occupies its leading cell plus a continuation cell that renders nothing and is never independently addressable; cursor motion, wrap, erase, and scroll all reckon in DISPLAY columns. WIDTH POLICY (hertz-proposed, doyle-ratified — pinned so the renderer and the emulator can never disagree): share ratatui's pinned unicode-width 0.2.0 as a WORKSPACE dependency, ambiguous-width = 1, no CJK-context override. A second width authority in the tree is the defect this policy exists to prevent. Gate: doc — the width policy stated where the grid is documented; impl — width-aware Cell/put_char/wrap + display-column reckoning across cursor/erase/scroll; unit — wide-glyph advance + continuation-cell invariants, wrap at the right margin with a wide glyph that cannot fit, erase/overwrite of a continuation cell clears the whole glyph, combining/zero-width marks do not advance; int — regression oracle against an INDEPENDENT emulator's rendering of the same byte stream (the field repro shape: wide glyphs followed by EL and CUP row-addressed redraws must leave no left-shift and no margin scraps).",
2026-08-28T09:54:48.1311131Z       "requiredStages": [
2026-08-28T09:54:48.1311816Z         "doc",
2026-08-28T09:54:48.1312386Z         "impl",
2026-08-28T09:54:48.1312969Z         "unit",
2026-08-28T09:54:48.1313536Z         "int"
2026-08-28T09:54:48.1314099Z       ],
2026-08-28T09:54:48.1314646Z       "stages": {
2026-08-28T09:54:48.1315294Z         "doc": {
2026-08-28T09:54:48.1316025Z           "complete": true,
2026-08-28T09:54:48.1316707Z           "evidence": [
2026-08-28T09:54:48.1317332Z             {
2026-08-28T09:54:48.1317981Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1318814Z               "line": 41
2026-08-28T09:54:48.1319551Z             }
2026-08-28T09:54:48.1320117Z           ]
2026-08-28T09:54:48.1320666Z         },
2026-08-28T09:54:48.1321220Z         "impl": {
2026-08-28T09:54:48.1321802Z           "complete": true,
2026-08-28T09:54:48.1322463Z           "evidence": [
2026-08-28T09:54:48.1323071Z             {
2026-08-28T09:54:48.1323725Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1324548Z               "line": 162
2026-08-28T09:54:48.1325297Z             },
2026-08-28T09:54:48.1326017Z             {
2026-08-28T09:54:48.1326732Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1327631Z               "line": 202
2026-08-28T09:54:48.1328279Z             },
2026-08-28T09:54:48.1328832Z             {
2026-08-28T09:54:48.1329556Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1330365Z               "line": 461
2026-08-28T09:54:48.1330982Z             },
2026-08-28T09:54:48.1331541Z             {
2026-08-28T09:54:48.1332204Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1333098Z               "line": 485
2026-08-28T09:54:48.1333726Z             },
2026-08-28T09:54:48.1334285Z             {
2026-08-28T09:54:48.1334943Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1335852Z               "line": 503
2026-08-28T09:54:48.1336563Z             },
2026-08-28T09:54:48.1337126Z             {
2026-08-28T09:54:48.1337770Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1338581Z               "line": 528
2026-08-28T09:54:48.1339281Z             },
2026-08-28T09:54:48.1339840Z             {
2026-08-28T09:54:48.1340478Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1341310Z               "line": 588
2026-08-28T09:54:48.1341940Z             },
2026-08-28T09:54:48.1342511Z             {
2026-08-28T09:54:48.1343160Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1343987Z               "line": 631
2026-08-28T09:54:48.1344620Z             },
2026-08-28T09:54:48.1345189Z             {
2026-08-28T09:54:48.1346176Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1347200Z               "line": 648
2026-08-28T09:54:48.1347842Z             },
2026-08-28T09:54:48.1348402Z             {
2026-08-28T09:54:48.1349403Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1350429Z               "line": 666
2026-08-28T09:54:48.1351057Z             },
2026-08-28T09:54:48.1351638Z             {
2026-08-28T09:54:48.1352295Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1353129Z               "line": 691
2026-08-28T09:54:48.1353754Z             },
2026-08-28T09:54:48.1354326Z             {
2026-08-28T09:54:48.1354970Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1355791Z               "line": 965
2026-08-28T09:54:48.1356421Z             },
2026-08-28T09:54:48.1356977Z             {
2026-08-28T09:54:48.1357712Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1358541Z               "line": 1071
2026-08-28T09:54:48.1359279Z             }
2026-08-28T09:54:48.1359844Z           ]
2026-08-28T09:54:48.1360382Z         },
2026-08-28T09:54:48.1360922Z         "int": {
2026-08-28T09:54:48.1361519Z           "complete": true,
2026-08-28T09:54:48.1362179Z           "evidence": [
2026-08-28T09:54:48.1362798Z             {
2026-08-28T09:54:48.1363474Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1364300Z               "line": 12124
2026-08-28T09:54:48.1364949Z             },
2026-08-28T09:54:48.1365502Z             {
2026-08-28T09:54:48.1366276Z               "path": "crates/spt-term/tests/screengrid_width_oracle.rs",
2026-08-28T09:54:48.1367210Z               "line": 64
2026-08-28T09:54:48.1367837Z             },
2026-08-28T09:54:48.1368400Z             {
2026-08-28T09:54:48.1369231Z               "path": "crates/spt-term/tests/screengrid_width_oracle.rs",
2026-08-28T09:54:48.1370176Z               "line": 78
2026-08-28T09:54:48.1370796Z             },
2026-08-28T09:54:48.1371358Z             {
2026-08-28T09:54:48.1372112Z               "path": "crates/spt-term/tests/screengrid_width_oracle.rs",
2026-08-28T09:54:48.1373062Z               "line": 89
2026-08-28T09:54:48.1373668Z             },
2026-08-28T09:54:48.1374230Z             {
2026-08-28T09:54:48.1374979Z               "path": "crates/spt-term/tests/screengrid_width_oracle.rs",
2026-08-28T09:54:48.1376067Z               "line": 98
2026-08-28T09:54:48.1376677Z             },
2026-08-28T09:54:48.1377235Z             {
2026-08-28T09:54:48.1378006Z               "path": "crates/spt-term/tests/screengrid_width_oracle.rs",
2026-08-28T09:54:48.1379037Z               "line": 113
2026-08-28T09:54:48.1379662Z             }
2026-08-28T09:54:48.1380223Z           ]
2026-08-28T09:54:48.1380770Z         },
2026-08-28T09:54:48.1381318Z         "unit": {
2026-08-28T09:54:48.1381909Z           "complete": true,
2026-08-28T09:54:48.1382601Z           "evidence": [
2026-08-28T09:54:48.1383214Z             {
2026-08-28T09:54:48.1383923Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1384752Z               "line": 1536
2026-08-28T09:54:48.1385381Z             },
2026-08-28T09:54:48.1385945Z             {
2026-08-28T09:54:48.1386598Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1387415Z               "line": 1561
2026-08-28T09:54:48.1388030Z             },
2026-08-28T09:54:48.1388590Z             {
2026-08-28T09:54:48.1389345Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1390183Z               "line": 1574
2026-08-28T09:54:48.1390802Z             },
2026-08-28T09:54:48.1391367Z             {
2026-08-28T09:54:48.1392016Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1392823Z               "line": 1589
2026-08-28T09:54:48.1393457Z             },
2026-08-28T09:54:48.1394005Z             {
2026-08-28T09:54:48.1394648Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1395451Z               "line": 1604
2026-08-28T09:54:48.1396137Z             },
2026-08-28T09:54:48.1396691Z             {
2026-08-28T09:54:48.1397331Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1398141Z               "line": 1619
2026-08-28T09:54:48.1398766Z             },
2026-08-28T09:54:48.1399403Z             {
2026-08-28T09:54:48.1400133Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1400953Z               "line": 1640
2026-08-28T09:54:48.1401589Z             },
2026-08-28T09:54:48.1402157Z             {
2026-08-28T09:54:48.1402796Z               "path": "crates/spt-term/src/screen.rs",
2026-08-28T09:54:48.1403620Z               "line": 1795
2026-08-28T09:54:48.1404306Z             }
2026-08-28T09:54:48.1404875Z           ]
2026-08-28T09:54:48.1405429Z         }
2026-08-28T09:54:48.1405983Z       }
2026-08-28T09:54:48.1406521Z     },
2026-08-28T09:54:48.1407066Z     {
2026-08-28T09:54:48.1407738Z       "id": "REQ-SEAL-AUTH-BACKEND-SEAM",
2026-08-28T09:54:48.1439028Z       "title": "PLATFORM-AUTHENTICATOR ACCESS IS ONE PER-OS SEAM — ensure-keypair / sign-payload / availability — AND THE SEAM IS THE CONTRACT (#217 anchor 3): the enrollment verb (REQ-SEAL-ENROLL-VERB) and W2's FIDO2 ceremony consume the SEAM, never a backend. AVAILABILITY answers whether a platform authenticator is present and usable for the invoking session — a probe that cannot answer reports unavailable WITH ITS NAMED REASON, never a verdict-shaped guess (the firewall doctrine: bounded probes feed a PURE DECIDER so every decision arm unit-tests hermetically without the OS — the probe/decide split at firewall.rs and the injectable-probe seam of resolve_transport are the two house exemplars). ENSURE-KEYPAIR is the idempotent get-or-create of this node's seal-authenticator keypair, user-verification-gated at creation by the backend (Windows Hello's own prompt); it returns the PUBLIC KEY plus the seam's BACKEND KIND token, and the private key NEVER crosses the seam — no export surface exists, signing is the only use. SIGN-PAYLOAD is the user-verification-gated detached signature over caller-presented bytes — W2's ceremony consumer; W1 lands it behind the seam with the stub/decider arms unit-held and NO production caller. BACKENDS: Windows Hello via the WinRT KEYCREDENTIALMANAGER surface (the `windows` crate, features Foundation + Security_Credentials + Storage_Streams, cfg(windows)-gated). The earlier windows-sys/raw-ncrypt spelling rested on a premise MEASURED FALSE (#222, doyle's 4-arm probe + todlando's independent repro, 2026-08-25: the Microsoft Passport/NGC KSP refuses EVERY plain key name with NTE_INVALID_PARAMETER on open AND create, so the NTE_BAD_KEYSET create cue is unreachable and that route can never enroll on any box). The house rule is therefore the MEASURED one, not the blanket one: windows-sys for Win32 surfaces, the `windows` crate ONLY where the surface is WinRT-only — KCM is the precedent (doyle ruling, 2026-08-25; the crate is already in the graph via netwatch and wmi, so the compile-weight objection is sunk cost). Linux is unchanged; Linux is a NAMED-REFUSAL STUB this milestone — every seam question answers that libfido2 is the named later backend, verbatim, because the honest stub refuses by name while a stub faking availability is a trap (fleet = Windows + one Linux box); any other OS refuses likewise. ENCODINGS: pubkey and signature cross every boundary as LOWERCASE HEX of the backend's raw bytes (the identity.rs / release-keys.json convention — no PEM, no base64, and NO RE-ENCODING BY US: the backend's NATIVE blob rides verbatim as hex, so for `hello-kcm-rs256` the raw bytes ARE the 294-byte DER SubjectPublicKeyInfo the KCM surface returns; `no DER` always meant we never CONVERT INTO DER, never that a backend may not hand us one), and BACKEND KIND is an open string token beside them (the ceremony_kind precedent) so a record names its algorithm family without any consumer parsing key innards; the Hello backend's key algorithm is whatever the platform mints (ES256/RS256 class, NOT ed25519) — the kind token is what keeps that honest, and the cross-node verifier dependency this implies is W2's flagged ruling, not W1's. Gate: doc — the published enrollment page's per-OS backend story; impl — the seam module, the Hello backend, the named-refusal stub; unit — stub arms refuse with the libfido2 name verbatim, pure-decider arms hermetic under injected probes, hex encoding roundtrip, backend-kind token stability (the Hello arm's real OS prompt is field-exercised, stated honestly, not CI-unit-held).",
2026-08-28T09:54:48.1467315Z       "requiredStages": [
2026-08-28T09:54:48.1467959Z         "doc",
2026-08-28T09:54:48.1468532Z         "impl",
2026-08-28T09:54:48.1469190Z         "unit"
2026-08-28T09:54:48.1469748Z       ],
2026-08-28T09:54:48.1470286Z       "stages": {
2026-08-28T09:54:48.1470865Z         "doc": {
2026-08-28T09:54:48.1471456Z           "complete": true,
2026-08-28T09:54:48.1472134Z           "evidence": [
2026-08-28T09:54:48.1472817Z             {
2026-08-28T09:54:48.1473507Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.1474355Z               "line": 336
2026-08-28T09:54:48.1474960Z             }
2026-08-28T09:54:48.1475515Z           ]
2026-08-28T09:54:48.1476054Z         },
2026-08-28T09:54:48.1476606Z         "impl": {
2026-08-28T09:54:48.1477203Z           "complete": true,
2026-08-28T09:54:48.1477880Z           "evidence": [
2026-08-28T09:54:48.1478510Z             {
2026-08-28T09:54:48.1479407Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1480219Z               "line": 50
2026-08-28T09:54:48.1480842Z             },
2026-08-28T09:54:48.1481396Z             {
2026-08-28T09:54:48.1482045Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1482842Z               "line": 334
2026-08-28T09:54:48.1483495Z             },
2026-08-28T09:54:48.1484052Z             {
2026-08-28T09:54:48.1484687Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1485482Z               "line": 350
2026-08-28T09:54:48.1486099Z             },
2026-08-28T09:54:48.1486671Z             {
2026-08-28T09:54:48.1487343Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1488155Z               "line": 366
2026-08-28T09:54:48.1488767Z             }
2026-08-28T09:54:48.1489418Z           ]
2026-08-28T09:54:48.1489962Z         },
2026-08-28T09:54:48.1490506Z         "int": {
2026-08-28T09:54:48.1491192Z           "complete": false,
2026-08-28T09:54:48.1491866Z           "evidence": []
2026-08-28T09:54:48.1492496Z         },
2026-08-28T09:54:48.1493049Z         "unit": {
2026-08-28T09:54:48.1493642Z           "complete": true,
2026-08-28T09:54:48.1494297Z           "evidence": [
2026-08-28T09:54:48.1494932Z             {
2026-08-28T09:54:48.1495557Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1496370Z               "line": 383
2026-08-28T09:54:48.1496997Z             },
2026-08-28T09:54:48.1497565Z             {
2026-08-28T09:54:48.1498199Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1499177Z               "line": 392
2026-08-28T09:54:48.1499803Z             },
2026-08-28T09:54:48.1500361Z             {
2026-08-28T09:54:48.1500986Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1501781Z               "line": 400
2026-08-28T09:54:48.1502398Z             },
2026-08-28T09:54:48.1502975Z             {
2026-08-28T09:54:48.1503600Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1504415Z               "line": 421
2026-08-28T09:54:48.1505024Z             },
2026-08-28T09:54:48.1505582Z             {
2026-08-28T09:54:48.1506216Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1507021Z               "line": 438
2026-08-28T09:54:48.1507648Z             },
2026-08-28T09:54:48.1508206Z             {
2026-08-28T09:54:48.1508826Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1509746Z               "line": 471
2026-08-28T09:54:48.1510373Z             },
2026-08-28T09:54:48.1510941Z             {
2026-08-28T09:54:48.1511565Z               "path": "crates/spt/src/authseam.rs",
2026-08-28T09:54:48.1512369Z               "line": 484
2026-08-28T09:54:48.1513006Z             }
2026-08-28T09:54:48.1513559Z           ]
2026-08-28T09:54:48.1514128Z         }
2026-08-28T09:54:48.1514661Z       }
2026-08-28T09:54:48.1515265Z     },
2026-08-28T09:54:48.1515781Z     {
2026-08-28T09:54:48.1516462Z       "id": "REQ-SEAL-CEREMONY-CONTENT-SHOWN",
2026-08-28T09:54:48.1534144Z       "title": "THE CEREMONY OVERLAY SHOWS THE HUMAN EXACTLY WHAT THEY ARE SEALING: the sealed content VERBATIM plus the BINDING SUBNET NAMED — always the subnet whose member-or-admin code the overlay expects, so the human reaches for the right key (operator ruling 5's overlay clause) — and once W3 wires sealed dispatch, the destination id as well. A blind mint is a consent hole (doyle design-of-record 2026-08-23; releases#7's own sketch shows the content). The content bytes the overlay renders are THE bytes the daemon hashes at mint — same byte buffer end to end (the one-buffer discipline doyle's W1 review carried into this milestone). SIZE IS THE OPERATOR'S THREE-PART SHAPE (ruling 8, 2026-08-23, superseding the provisional refuse-arm): (1) content is CAPPED AT 500 UNICODE SCALAR VALUES at the CEREMONY SEAM ONLY (not a record property) — longer REFUSES with a named reason to the requester (`SEAL_CEREMONY_CONTENT_TOO_LONG`), never truncated; (2) the overlay SUPPORTS SCROLLING — a within-cap content can still overflow a small PTY grid, so the surface adapts and the content never shrinks; (3) SUBMIT IS NEVER GATED on scrolled-to-end. Ceremony content must be VALID UTF-8 (doyle pin under ruling 8): bytes that cannot be displayed verbatim are bytes nobody can consent to, so non-UTF-8 refuses with its own named reason (`SEAL_CEREMONY_CONTENT_NOT_UTF8`). Gate: doc — the CONTEXT.md ceremony clause's content-shown sentence; impl — the overlay rendering (content verbatim + subnet line + scroll window) and the seam's cap + UTF-8 refusals; unit — the overlay's emitted bytes contain the content verbatim and name the binding subnet, the rendered content is byte-identical to the buffer presented for mint, over-cap content refuses by name at the seam (a 500-scalar content passes, 501 refuses — counted in scalars not bytes), non-UTF-8 content refuses by its own name, the overlay windows over-surface content by scroll offset without shrinking it, and submit folds regardless of scroll position.",
2026-08-28T09:54:48.1551009Z       "requiredStages": [
2026-08-28T09:54:48.1556753Z         "doc",
2026-08-28T09:54:48.1557360Z         "impl",
2026-08-28T09:54:48.1557935Z         "unit"
2026-08-28T09:54:48.1558487Z       ],
2026-08-28T09:54:48.1559131Z       "stages": {
2026-08-28T09:54:48.1559703Z         "doc": {
2026-08-28T09:54:48.1560307Z           "complete": true,
2026-08-28T09:54:48.1560974Z           "evidence": [
2026-08-28T09:54:48.1561583Z             {
2026-08-28T09:54:48.1562199Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1563025Z               "line": 1080
2026-08-28T09:54:48.1563649Z             },
2026-08-28T09:54:48.1564217Z             {
2026-08-28T09:54:48.1564895Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.1565773Z               "line": 93
2026-08-28T09:54:48.1566407Z             }
2026-08-28T09:54:48.1566966Z           ]
2026-08-28T09:54:48.1567509Z         },
2026-08-28T09:54:48.1568065Z         "impl": {
2026-08-28T09:54:48.1568657Z           "complete": true,
2026-08-28T09:54:48.1569420Z           "evidence": [
2026-08-28T09:54:48.1570035Z             {
2026-08-28T09:54:48.1570698Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1571543Z               "line": 6532
2026-08-28T09:54:48.1572163Z             },
2026-08-28T09:54:48.1572727Z             {
2026-08-28T09:54:48.1573378Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1574200Z               "line": 376
2026-08-28T09:54:48.1574830Z             },
2026-08-28T09:54:48.1575440Z             {
2026-08-28T09:54:48.1576052Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1576845Z               "line": 1691
2026-08-28T09:54:48.1577484Z             },
2026-08-28T09:54:48.1578060Z             {
2026-08-28T09:54:48.1578697Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1579636Z               "line": 3153
2026-08-28T09:54:48.1580275Z             },
2026-08-28T09:54:48.1580828Z             {
2026-08-28T09:54:48.1581432Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1582184Z               "line": 3203
2026-08-28T09:54:48.1582794Z             }
2026-08-28T09:54:48.1583357Z           ]
2026-08-28T09:54:48.1583895Z         },
2026-08-28T09:54:48.1584436Z         "int": {
2026-08-28T09:54:48.1585027Z           "complete": false,
2026-08-28T09:54:48.1585947Z           "evidence": []
2026-08-28T09:54:48.1586560Z         },
2026-08-28T09:54:48.1587213Z         "unit": {
2026-08-28T09:54:48.1587823Z           "complete": true,
2026-08-28T09:54:48.1588524Z           "evidence": [
2026-08-28T09:54:48.1589219Z             {
2026-08-28T09:54:48.1589867Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1590702Z               "line": 14986
2026-08-28T09:54:48.1591350Z             },
2026-08-28T09:54:48.1591915Z             {
2026-08-28T09:54:48.1592526Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1593312Z               "line": 3423
2026-08-28T09:54:48.1593936Z             },
2026-08-28T09:54:48.1594498Z             {
2026-08-28T09:54:48.1595097Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1595870Z               "line": 3488
2026-08-28T09:54:48.1596507Z             },
2026-08-28T09:54:48.1597060Z             {
2026-08-28T09:54:48.1597664Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1598445Z               "line": 3550
2026-08-28T09:54:48.1599161Z             }
2026-08-28T09:54:48.1599756Z           ]
2026-08-28T09:54:48.1600290Z         }
2026-08-28T09:54:48.1600824Z       }
2026-08-28T09:54:48.1601362Z     },
2026-08-28T09:54:48.1601896Z     {
2026-08-28T09:54:48.1602509Z       "id": "REQ-SEAL-CEREMONY-ESC-CANCEL",
2026-08-28T09:54:48.1614094Z       "title": "ESC (OR CTRL-C) AT THE CEREMONY OVERLAY ABORTS CLEANLY — the releases#19 Esc-cancel ruling, which this requirement satisfies: NO partial seal record exists anywhere (mint_seal is simply never called for a cancelled ceremony — there is no staged record to roll back, by construction), the cancel SPENDS NOTHING on the attempt ledger (a cancel is not a presented guess: Presented::Absent, uncounted), a pending sealed-send is DROPPED, and the INITIATING AGENT receives a clear refusal naming the cancellation — never a silent hang or an ambiguous failure. The same clean-abort arm covers the involuntary endings: controller detach mid-ceremony and requester connection drop abort identically (no partial record, nothing spent, both sides answered). The key grammar is the SHARED fold_code_key kernel — one grammar for every ceremony surface (ADR-0052's overlay-pattern-shared sentence), so no ceremony can drift its own cancel rule. Gate: doc — the CONTEXT.md ceremony clause's Esc sentence; impl — the client cancel arm and the daemon abort arm; unit — Esc and ctrl-c fold to Cancel through the shared kernel, a cancelled ceremony produces no record and no ledger delta, the requester receives the named cancellation refusal, detach-mid-ceremony aborts identically.",
2026-08-28T09:54:48.1625564Z       "requiredStages": [
2026-08-28T09:54:48.1626220Z         "doc",
2026-08-28T09:54:48.1626787Z         "impl",
2026-08-28T09:54:48.1627354Z         "unit"
2026-08-28T09:54:48.1627912Z       ],
2026-08-28T09:54:48.1628465Z       "stages": {
2026-08-28T09:54:48.1629116Z         "doc": {
2026-08-28T09:54:48.1629716Z           "complete": true,
2026-08-28T09:54:48.1630379Z           "evidence": [
2026-08-28T09:54:48.1630999Z             {
2026-08-28T09:54:48.1631604Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1632347Z               "line": 1081
2026-08-28T09:54:48.1632991Z             },
2026-08-28T09:54:48.1633554Z             {
2026-08-28T09:54:48.1634233Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.1635086Z               "line": 109
2026-08-28T09:54:48.1635697Z             }
2026-08-28T09:54:48.1636258Z           ]
2026-08-28T09:54:48.1636931Z         },
2026-08-28T09:54:48.1637489Z         "impl": {
2026-08-28T09:54:48.1638086Z           "complete": true,
2026-08-28T09:54:48.1638748Z           "evidence": [
2026-08-28T09:54:48.1639441Z             {
2026-08-28T09:54:48.1640113Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1640953Z               "line": 6050
2026-08-28T09:54:48.1641577Z             },
2026-08-28T09:54:48.1642135Z             {
2026-08-28T09:54:48.1642803Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1643636Z               "line": 6819
2026-08-28T09:54:48.1644341Z             },
2026-08-28T09:54:48.1644901Z             {
2026-08-28T09:54:48.1645559Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1646408Z               "line": 7540
2026-08-28T09:54:48.1647094Z             },
2026-08-28T09:54:48.1647688Z             {
2026-08-28T09:54:48.1648298Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1649176Z               "line": 1798
2026-08-28T09:54:48.1649799Z             },
2026-08-28T09:54:48.1650358Z             {
2026-08-28T09:54:48.1650974Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1651757Z               "line": 2978
2026-08-28T09:54:48.1652396Z             }
2026-08-28T09:54:48.1652957Z           ]
2026-08-28T09:54:48.1653505Z         },
2026-08-28T09:54:48.1654044Z         "int": {
2026-08-28T09:54:48.1654636Z           "complete": false,
2026-08-28T09:54:48.1655305Z           "evidence": []
2026-08-28T09:54:48.1656139Z         },
2026-08-28T09:54:48.1656687Z         "unit": {
2026-08-28T09:54:48.1657306Z           "complete": true,
2026-08-28T09:54:48.1657980Z           "evidence": [
2026-08-28T09:54:48.1658601Z             {
2026-08-28T09:54:48.1659379Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1660221Z               "line": 15614
2026-08-28T09:54:48.1660857Z             },
2026-08-28T09:54:48.1661425Z             {
2026-08-28T09:54:48.1662093Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1663031Z               "line": 15838
2026-08-28T09:54:48.1663675Z             },
2026-08-28T09:54:48.1664242Z             {
2026-08-28T09:54:48.1664858Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1665589Z               "line": 3578
2026-08-28T09:54:48.1666227Z             }
2026-08-28T09:54:48.1666762Z           ]
2026-08-28T09:54:48.1667323Z         }
2026-08-28T09:54:48.1667853Z       }
2026-08-28T09:54:48.1668381Z     },
2026-08-28T09:54:48.1668912Z     {
2026-08-28T09:54:48.1669609Z       "id": "REQ-SEAL-CEREMONY-FIDO2",
2026-08-28T09:54:48.1693311Z       "title": "AN ENROLLED (node x subnet) OFFERS THE FIDO2 CEREMONY ON THE MINT PATH (#217 anchor 4): when the daemon's OWN node-key short hex x the binding subnet holds an enrollment record, the ceremony open carries the FIDO2 offer plus the PAYLOAD TO SIGN, composed DAEMON-SIDE with minted_at FIXED BEFORE the request ships — the canonical binding tuple, registry-pinned to the exact spelling `spt-seal-fido2-v1\\n{content_hash}\\n{minter}\\n{minted_at}\\n` (versioned domain-separation prefix; UTF-8; trailing newline; field order pinned) — so every FIDO2 record is SELF-AUTHENTICATING from its own fields on any member node (signing content alone would leave minter/time unbound and a rostered rogue node could fabricate a record around a replayed signature). NO signer_node FIELD EXISTS; THE SIGNER IS THE RECORD'S MINTER NODE, and a future signer_node is ADDITIVE-OPTIONAL DEFAULTING TO IT (doyle ruling 2026-08-24: the v1 records are forward-valid by this title — a cross-node signer is a field addition behind a ruling, never a migration). THE REMOTE DEGRADE IS AN OFFER WITHDRAWAL, NOT A FAILURE: the open ships the enrolled node's short hex beside the offer, the client compares it against ITS OWN node and on mismatch renders the ORDINARY TOTP overlay with ZERO error chrome — no doomed sign attempt, nothing in logs or telemetry wearing a defect's costume (doyle rider 1). The client's Hello prompt IS the human-presence ceremony — the seam's sign-payload gains its first production caller — and the client ships the SIGNATURE PROOF, never a verdict: the daemon VERIFIES the proof against the enrolled pubkey (backend-kind dispatch) BEFORE minting, and mints ceremony_kind `fido2` with the additive optional signature_hex (serde default + skip_serializing_if: old records byte-identical, N-1 daemons ignore the unknown field on the seal feed). FAILED-PROOF REFUSALS SPEND NOTHING on the ceremony-gate ledger — a bad signature is not a guess at the shared secret, and charging it would let a broken client shut the gate a human needs (the denial-of-governance direction) — and the overlay FALLS BACK to TOTP code entry on the SAME overlay; a HELLO CANCEL is a fallback-to-TOTP, DISTINGUISHABLE from Esc, which still aborts everything with the TOTP cancel clauses verbatim (nothing spent, nothing minted, requester answered). Gate: doc — the published ceremony page's FIDO2 clause; impl — the offer decision + payload composer + proof-verify + fido2 mint arm; unit — tuple spelling pinned (prefix, field order, trailing newline), offer iff enrolled, proof-verify admits a valid signature and refuses a wrong one without charging the ledger, Hello-cancel falls back while Esc aborts, minted record carries kind fido2 + the signature.",
2026-08-28T09:54:48.1716598Z       "requiredStages": [
2026-08-28T09:54:48.1717257Z         "doc",
2026-08-28T09:54:48.1717825Z         "impl",
2026-08-28T09:54:48.1718394Z         "unit"
2026-08-28T09:54:48.1719033Z       ],
2026-08-28T09:54:48.1719596Z       "stages": {
2026-08-28T09:54:48.1720168Z         "doc": {
2026-08-28T09:54:48.1720788Z           "complete": true,
2026-08-28T09:54:48.1721442Z           "evidence": [
2026-08-28T09:54:48.1722081Z             {
2026-08-28T09:54:48.1722764Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.1723638Z               "line": 129
2026-08-28T09:54:48.1724566Z             }
2026-08-28T09:54:48.1725292Z           ]
2026-08-28T09:54:48.1725859Z         },
2026-08-28T09:54:48.1726520Z         "impl": {
2026-08-28T09:54:48.1727131Z           "complete": true,
2026-08-28T09:54:48.1727793Z           "evidence": [
2026-08-28T09:54:48.1728413Z             {
2026-08-28T09:54:48.1729187Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1730050Z               "line": 4329
2026-08-28T09:54:48.1730684Z             },
2026-08-28T09:54:48.1731242Z             {
2026-08-28T09:54:48.1731911Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1732760Z               "line": 5196
2026-08-28T09:54:48.1733404Z             },
2026-08-28T09:54:48.1734034Z             {
2026-08-28T09:54:48.1734717Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1735537Z               "line": 5229
2026-08-28T09:54:48.1736186Z             },
2026-08-28T09:54:48.1736753Z             {
2026-08-28T09:54:48.1737419Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1738263Z               "line": 6571
2026-08-28T09:54:48.1738906Z             },
2026-08-28T09:54:48.1739547Z             {
2026-08-28T09:54:48.1740214Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1741068Z               "line": 6864
2026-08-28T09:54:48.1741689Z             },
2026-08-28T09:54:48.1742264Z             {
2026-08-28T09:54:48.1742939Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1743782Z               "line": 7159
2026-08-28T09:54:48.1744426Z             },
2026-08-28T09:54:48.1745000Z             {
2026-08-28T09:54:48.1745630Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1746455Z               "line": 413
2026-08-28T09:54:48.1747142Z             },
2026-08-28T09:54:48.1747703Z             {
2026-08-28T09:54:48.1748362Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.1749277Z               "line": 152
2026-08-28T09:54:48.1749909Z             },
2026-08-28T09:54:48.1750536Z             {
2026-08-28T09:54:48.1751180Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.1752005Z               "line": 291
2026-08-28T09:54:48.1752639Z             },
2026-08-28T09:54:48.1753204Z             {
2026-08-28T09:54:48.1753824Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1754605Z               "line": 1662
2026-08-28T09:54:48.1755229Z             },
2026-08-28T09:54:48.1755785Z             {
2026-08-28T09:54:48.1756391Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1757163Z               "line": 3251
2026-08-28T09:54:48.1757858Z             }
2026-08-28T09:54:48.1758124Z           ]
2026-08-28T09:54:48.1758379Z         },
2026-08-28T09:54:48.1758645Z         "int": {
2026-08-28T09:54:48.1758931Z           "complete": false,
2026-08-28T09:54:48.1759289Z           "evidence": []
2026-08-28T09:54:48.1759546Z         },
2026-08-28T09:54:48.1759813Z         "unit": {
2026-08-28T09:54:48.1760098Z           "complete": true,
2026-08-28T09:54:48.1760369Z           "evidence": [
2026-08-28T09:54:48.1760630Z             {
2026-08-28T09:54:48.1760991Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1761264Z               "line": 15319
2026-08-28T09:54:48.1761522Z             },
2026-08-28T09:54:48.1761779Z             {
2026-08-28T09:54:48.1762151Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1762423Z               "line": 15366
2026-08-28T09:54:48.1762680Z             },
2026-08-28T09:54:48.1762932Z             {
2026-08-28T09:54:48.1763298Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1763563Z               "line": 15434
2026-08-28T09:54:48.1763821Z             },
2026-08-28T09:54:48.1764074Z             {
2026-08-28T09:54:48.1764417Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.1764690Z               "line": 460
2026-08-28T09:54:48.1764946Z             },
2026-08-28T09:54:48.1765208Z             {
2026-08-28T09:54:48.1765551Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.1765893Z               "line": 480
2026-08-28T09:54:48.1766153Z             },
2026-08-28T09:54:48.1766398Z             {
2026-08-28T09:54:48.1766698Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1766960Z               "line": 3349
2026-08-28T09:54:48.1767208Z             }
2026-08-28T09:54:48.1767446Z           ]
2026-08-28T09:54:48.1767694Z         }
2026-08-28T09:54:48.1767938Z       }
2026-08-28T09:54:48.1768191Z     },
2026-08-28T09:54:48.1768443Z     {
2026-08-28T09:54:48.1768770Z       "id": "REQ-SEAL-CEREMONY-RC-CLIENT",
2026-08-28T09:54:48.1780672Z       "title": "A REMOTE ATTACHED CONTROLLER RUNS THE CEREMONY CLIENT-SIDE AND SHIPS THE PROOF UP THE RC CHANNEL (CONTEXT.md ratified; the rc-paste client-originated precedent — the daemon has no reach into the operator's terminal or clipboard, so the overlay renders and the code is collected in the rc client process) — AND THE PROOF IS THE PRESENTED CODE, NEVER A CLIENT-SIDE VERDICT: verification, the attempt ledger, and the mint stay daemon-side (REQ-SEAL-CEREMONY-TOTP), because an agent on the box can speak the broker's IPC directly and a client-side decision would be decorative (the bring-up precedent, broker seat-resolver placement rationale). The ceremony records ride the EXISTING attach stream as additive serde variants, so the LOCAL and REMOTE arms are ONE code path — nothing about a remote controller is special except transport latency; N-1 clients are protected by the default-false capability declaration (REQ-SEAL-NO-CEREMONY-SURFACE refuses rather than pushing records an old client cannot decode). Gate: doc — the CONTEXT.md rc-arm sentence; impl — the ceremony AttachRecord variants and the client ceremony mode; unit — the upstream ceremony record carries the presented code and has no verdict field for a client to assert, keys fold through the shared kernel, and a ceremony round-trips over the attach machinery (push, code up, result down).",
2026-08-28T09:54:48.1781086Z       "requiredStages": [
2026-08-28T09:54:48.1781354Z         "doc",
2026-08-28T09:54:48.1781618Z         "impl",
2026-08-28T09:54:48.1781873Z         "unit"
2026-08-28T09:54:48.1782131Z       ],
2026-08-28T09:54:48.1782399Z       "stages": {
2026-08-28T09:54:48.1782652Z         "doc": {
2026-08-28T09:54:48.1782938Z           "complete": true,
2026-08-28T09:54:48.1783214Z           "evidence": [
2026-08-28T09:54:48.1783461Z             {
2026-08-28T09:54:48.1783757Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1784033Z               "line": 1083
2026-08-28T09:54:48.1784352Z             }
2026-08-28T09:54:48.1784609Z           ]
2026-08-28T09:54:48.1784875Z         },
2026-08-28T09:54:48.1785185Z         "impl": {
2026-08-28T09:54:48.1785461Z           "complete": true,
2026-08-28T09:54:48.1785727Z           "evidence": [
2026-08-28T09:54:48.1785999Z             {
2026-08-28T09:54:48.1786367Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.1786643Z               "line": 665
2026-08-28T09:54:48.1786895Z             },
2026-08-28T09:54:48.1787152Z             {
2026-08-28T09:54:48.1787518Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.1787785Z               "line": 740
2026-08-28T09:54:48.1788033Z             },
2026-08-28T09:54:48.1788299Z             {
2026-08-28T09:54:48.1788662Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.1788928Z               "line": 960
2026-08-28T09:54:48.1789273Z             },
2026-08-28T09:54:48.1789525Z             {
2026-08-28T09:54:48.1789876Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1790158Z               "line": 158
2026-08-28T09:54:48.1790416Z             },
2026-08-28T09:54:48.1790673Z             {
2026-08-28T09:54:48.1791026Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1791293Z               "line": 180
2026-08-28T09:54:48.1791547Z             },
2026-08-28T09:54:48.1791808Z             {
2026-08-28T09:54:48.1792154Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1792501Z               "line": 718
2026-08-28T09:54:48.1792762Z             },
2026-08-28T09:54:48.1793011Z             {
2026-08-28T09:54:48.1793358Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1793631Z               "line": 1156
2026-08-28T09:54:48.1793888Z             },
2026-08-28T09:54:48.1794137Z             {
2026-08-28T09:54:48.1794504Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1794776Z               "line": 3611
2026-08-28T09:54:48.1795041Z             },
2026-08-28T09:54:48.1795348Z             {
2026-08-28T09:54:48.1795697Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1795968Z               "line": 420
2026-08-28T09:54:48.1796216Z             },
2026-08-28T09:54:48.1796473Z             {
2026-08-28T09:54:48.1796821Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1797103Z               "line": 1395
2026-08-28T09:54:48.1797362Z             },
2026-08-28T09:54:48.1797617Z             {
2026-08-28T09:54:48.1797992Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.1798259Z               "line": 182
2026-08-28T09:54:48.1798516Z             },
2026-08-28T09:54:48.1798768Z             {
2026-08-28T09:54:48.1799218Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.1799489Z               "line": 222
2026-08-28T09:54:48.1799746Z             },
2026-08-28T09:54:48.1800003Z             {
2026-08-28T09:54:48.1800360Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.1800637Z               "line": 250
2026-08-28T09:54:48.1800890Z             },
2026-08-28T09:54:48.1801148Z             {
2026-08-28T09:54:48.1801448Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1801723Z               "line": 1586
2026-08-28T09:54:48.1801977Z             },
2026-08-28T09:54:48.1802239Z             {
2026-08-28T09:54:48.1802620Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1802894Z               "line": 2935
2026-08-28T09:54:48.1803152Z             },
2026-08-28T09:54:48.1803404Z             {
2026-08-28T09:54:48.1803720Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1803991Z               "line": 2977
2026-08-28T09:54:48.1804248Z             },
2026-08-28T09:54:48.1804501Z             {
2026-08-28T09:54:48.1804810Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.1805083Z               "line": 3301
2026-08-28T09:54:48.1805393Z             }
2026-08-28T09:54:48.1805653Z           ]
2026-08-28T09:54:48.1805908Z         },
2026-08-28T09:54:48.1806170Z         "int": {
2026-08-28T09:54:48.1806452Z           "complete": false,
2026-08-28T09:54:48.1806730Z           "evidence": []
2026-08-28T09:54:48.1806978Z         },
2026-08-28T09:54:48.1807240Z         "unit": {
2026-08-28T09:54:48.1807531Z           "complete": true,
2026-08-28T09:54:48.1807802Z           "evidence": [
2026-08-28T09:54:48.1808063Z             {
2026-08-28T09:54:48.1808423Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.1808699Z               "line": 544
2026-08-28T09:54:48.1809028Z             }
2026-08-28T09:54:48.1809282Z           ]
2026-08-28T09:54:48.1809544Z         }
2026-08-28T09:54:48.1809797Z       }
2026-08-28T09:54:48.1810054Z     },
2026-08-28T09:54:48.1810301Z     {
2026-08-28T09:54:48.1810621Z       "id": "REQ-SEAL-CEREMONY-TOTP",
2026-08-28T09:54:48.1835443Z       "title": "EVERY PRODUCTION SEAL MINT IS GATED BY A TOTP HUMAN-PRESENCE CEREMONY, AND THE WHOLE DECISION RUNS DAEMON-SIDE (write-through-daemon, doyle W1 design-review finding + approval 2026-08-23): the attached controller collects the code and ships the PRESENTED CODE — never a verdict — up the attach channel; the daemon verifies a member-or-admin code of the BINDING subnet locally against SubnetStore seed_bytes/admin_seed_bytes through code_matches_window's plus-minus-one-step window, BOTH seeds tried unconditionally and combined bitwise so the gate's timing cannot name which key admitted (the bring-up pattern; which key admitted is deliberately not distinguished — a seal grants nothing key-specific). The attempt is bounded by ITS OWN persisted ledger `trust/seal-ceremony-gate.json` — the GateLedger shape reused verbatim (one counter, one-second-doubling-to-one-hour backoff, throttle evaluated BEFORE verification so a shut gate is not an oracle, reset on success, survives daemon restarts, loud notification past the third failure) — SEPARATE from the bring-up and empower ledgers per the denial-of-governance rationale: failed seal guesses must not shut the gate a human needs to take the controls back, and vice versa. Only PRESENTED guesses count: Esc-cancel and absent input spend nothing (REQ-SEAL-CEREMONY-ESC-CANCEL owns the cancel arm). Ceremony success is the ONLY production caller of spt_store::seal::mint_seal (ceremony_kind `totp`), and the mint's load-modify-save runs IN THE DAEMON PROCESS under the same SEAL_APPLY serialization as the replication apply arm — a CLI-process minter would race the apply arm last-writer-wins, and a lost LOCAL mint is the one record re-presentation cannot heal (only the minting node ever held it). The record's fully-qualified minter is `subnet:endpoint@node` where the NODE HALF is the daemon's own NODE-KEY SHORT HEX (registry::key_prefix's roster short form — the durable node spelling ADR-0054 payloads carry, already resolvable by the @node grammar) — NEVER the OS hostname (doyle W2 gate ruling 2026-08-23: a hostname is mutable — the advertised label re-derives at daemon startup — and non-unique, so a durable evidence record citing it goes ambiguous between hostname-sharing nodes and orphans on rename; the pubkey remains the identity). A node always has its key by mint time (daemon boot mints node.key), so there is no ordinary no-identity refusal; an unreadable key is an IO anomaly refused fail-closed. Gate: doc — the CONTEXT.md wax-seal entry's ceremony clause; impl — the ceremony IPC verb, the daemon verify + ledger + mint-under-SEAL_APPLY arm, the seal ledger path helper; unit — member code admits, admin code admits, wrong code refuses and counts, throttle-before-verify ordering, in-backoff attempt uncounted, cancel uncounted, ledger file distinct from the bring-up and empower files, mint persisted by the daemon writer with the minter's node half pinned to the node-key short form (8 hex chars, never a hostname), loud threshold.",
2026-08-28T09:54:48.1836058Z       "requiredStages": [
2026-08-28T09:54:48.1836325Z         "doc",
2026-08-28T09:54:48.1836664Z         "impl",
2026-08-28T09:54:48.1836925Z         "unit"
2026-08-28T09:54:48.1837186Z       ],
2026-08-28T09:54:48.1837451Z       "stages": {
2026-08-28T09:54:48.1837709Z         "doc": {
2026-08-28T09:54:48.1837995Z           "complete": true,
2026-08-28T09:54:48.1838267Z           "evidence": [
2026-08-28T09:54:48.1838533Z             {
2026-08-28T09:54:48.1838838Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1839206Z               "line": 1079
2026-08-28T09:54:48.1839468Z             }
2026-08-28T09:54:48.1839725Z           ]
2026-08-28T09:54:48.1839980Z         },
2026-08-28T09:54:48.1840237Z         "impl": {
2026-08-28T09:54:48.1840524Z           "complete": true,
2026-08-28T09:54:48.1840790Z           "evidence": [
2026-08-28T09:54:48.1841043Z             {
2026-08-28T09:54:48.1841400Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1841667Z               "line": 149
2026-08-28T09:54:48.1841929Z             },
2026-08-28T09:54:48.1842188Z             {
2026-08-28T09:54:48.1842545Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1842821Z               "line": 667
2026-08-28T09:54:48.1843078Z             },
2026-08-28T09:54:48.1843330Z             {
2026-08-28T09:54:48.1843688Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.1843964Z               "line": 1146
2026-08-28T09:54:48.1844222Z             },
2026-08-28T09:54:48.1844479Z             {
2026-08-28T09:54:48.1844922Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1845196Z               "line": 4255
2026-08-28T09:54:48.1845454Z             },
2026-08-28T09:54:48.1845712Z             {
2026-08-28T09:54:48.1846074Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1846355Z               "line": 4284
2026-08-28T09:54:48.1846613Z             },
2026-08-28T09:54:48.1846865Z             {
2026-08-28T09:54:48.1847272Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1847543Z               "line": 4360
2026-08-28T09:54:48.1847865Z             },
2026-08-28T09:54:48.1848111Z             {
2026-08-28T09:54:48.1848478Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1848750Z               "line": 5161
2026-08-28T09:54:48.1849093Z             },
2026-08-28T09:54:48.1849355Z             {
2026-08-28T09:54:48.1849709Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1849990Z               "line": 5205
2026-08-28T09:54:48.1850247Z             },
2026-08-28T09:54:48.1850499Z             {
2026-08-28T09:54:48.1850897Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1851174Z               "line": 5762
2026-08-28T09:54:48.1851427Z             },
2026-08-28T09:54:48.1851680Z             {
2026-08-28T09:54:48.1852043Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1852309Z               "line": 6503
2026-08-28T09:54:48.1852566Z             },
2026-08-28T09:54:48.1852823Z             {
2026-08-28T09:54:48.1853185Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1853462Z               "line": 6599
2026-08-28T09:54:48.1853720Z             },
2026-08-28T09:54:48.1853977Z             {
2026-08-28T09:54:48.1854325Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1854602Z               "line": 6818
2026-08-28T09:54:48.1854917Z             },
2026-08-28T09:54:48.1855174Z             {
2026-08-28T09:54:48.1855530Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1855804Z               "line": 6968
2026-08-28T09:54:48.1856057Z             },
2026-08-28T09:54:48.1856305Z             {
2026-08-28T09:54:48.1856663Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1856930Z               "line": 7076
2026-08-28T09:54:48.1857183Z             },
2026-08-28T09:54:48.1857421Z             {
2026-08-28T09:54:48.1857794Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.1858118Z               "line": 1501
2026-08-28T09:54:48.1858377Z             },
2026-08-28T09:54:48.1858628Z             {
2026-08-28T09:54:48.1859058Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1859334Z               "line": 340
2026-08-28T09:54:48.1859591Z             },
2026-08-28T09:54:48.1859854Z             {
2026-08-28T09:54:48.1860187Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1860468Z               "line": 1326
2026-08-28T09:54:48.1860723Z             },
2026-08-28T09:54:48.1860978Z             {
2026-08-28T09:54:48.1861329Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.1861596Z               "line": 1377
2026-08-28T09:54:48.1861858Z             },
2026-08-28T09:54:48.1862106Z             {
2026-08-28T09:54:48.1862449Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.1862716Z               "line": 292
2026-08-28T09:54:48.1862974Z             }
2026-08-28T09:54:48.1863227Z           ]
2026-08-28T09:54:48.1863484Z         },
2026-08-28T09:54:48.1868000Z         "int": {
2026-08-28T09:54:48.1868330Z           "complete": false,
2026-08-28T09:54:48.1868606Z           "evidence": []
2026-08-28T09:54:48.1868862Z         },
2026-08-28T09:54:48.1869231Z         "unit": {
2026-08-28T09:54:48.1869517Z           "complete": true,
2026-08-28T09:54:48.1869790Z           "evidence": [
2026-08-28T09:54:48.1870056Z             {
2026-08-28T09:54:48.1870429Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1870804Z               "line": 14916
2026-08-28T09:54:48.1871062Z             },
2026-08-28T09:54:48.1871311Z             {
2026-08-28T09:54:48.1871680Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1871951Z               "line": 14937
2026-08-28T09:54:48.1872209Z             },
2026-08-28T09:54:48.1872456Z             {
2026-08-28T09:54:48.1872838Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1873119Z               "line": 15614
2026-08-28T09:54:48.1873367Z             },
2026-08-28T09:54:48.1873681Z             {
2026-08-28T09:54:48.1874040Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1874310Z               "line": 15754
2026-08-28T09:54:48.1874558Z             },
2026-08-28T09:54:48.1874816Z             {
2026-08-28T09:54:48.1875169Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.1875445Z               "line": 15789
2026-08-28T09:54:48.1875708Z             }
2026-08-28T09:54:48.1875960Z           ]
2026-08-28T09:54:48.1876212Z         }
2026-08-28T09:54:48.1876465Z       }
2026-08-28T09:54:48.1876717Z     },
2026-08-28T09:54:48.1876958Z     {
2026-08-28T09:54:48.1877263Z       "id": "REQ-SEAL-DESCRIBE",
2026-08-28T09:54:48.1902199Z       "title": "`spt api seal describe <token>` RENDERS THE SEAL RECORD'S FIELDS — token, content hash, fully-qualified minter, mint timestamp, ceremony kind — as the read surface for citing a seal WITHOUT re-presenting its content (the verify verb's complement: describe answers 'what does this token attest', verify answers 'is it THIS content'). Unknown token refuses `SEAL_UNKNOWN_TOKEN`; malformed token refuses at the format seam, distinct (REQ-SEAL-TOKEN-FORMAT). Read-only, no auth gate, answers on any member node of the binding subnet via the replicated store (REQ-SEAL-STORE-REPLICATES-SUBNET-SCOPED). Field rendering is LINE-ORIENTED KEY:VALUE on stdout so an agent citing a seal can quote it verbatim; the describe surface NEVER renders anything that is not in the record — in particular it cannot leak subnet secret material, because the record carries none (the minter address names a subnet; naming is not revealing). Gate: doc — the CONTEXT.md entry's describe clause; impl — the api verb + rendering; unit — field rendering exact over a known record, unknown-vs-malformed refusal distinction, exit codes. #219 (operator, FIELD-SEAL W2): DESCRIBE IS THE HUMAN SURFACE AND ITS BLOCK IS NOT A PARSE TARGET. The MINTER renders with its node half NAMED where this node can name it, in the house `LABEL (prefix…)` convention (REQ-PICKER-4's never-bare-hex rule) — `SPT_DEV:lia@HFENDULEAM (14efb80c…)`; MINTED_AT renders `YYYY-MM-DD HH:MM TZ` in the HOST NODE'S OWN timezone. Both renders are DERIVED — from this node's roster and gossiped registry, and from this node's clock — so TWO NODES MAY LEGITIMATELY RENDER ONE RECORD DIFFERENTLY and that difference is NOT a defect: the machine-readable answer is the record itself, never this text, and nothing derived here reaches verification (the fido2 tuple recomposes from the STORED spellings verbatim, REQ-SEAL-FIDO2-SIG-VERIFY's exactness rider, untouched). THE NAME RESOLVE IS A PREFIX MATCH AND ANSWERS ONLY WHEN UNAMBIGUOUS: a record stores its minter's node as an 8-CHAR KEY PREFIX (`registry::key_prefix` at the mint) while both label directories key on the FULL key, so the candidates are a SET, never a first match (roster_node_hex_resolver's doctrine) — EXACTLY ONE candidate key renders its name; zero (nothing known) and two-or-more (the prefix does not identify a node) BOTH degrade to the stored hex, because a name guessed from an ambiguous prefix attributes a decision seal to a machine the operator never named. An instant the local calendar cannot place degrades to the raw milliseconds rather than inventing a time. THE LABEL DIRECTORY IS AN INJECTED SEAM (the probe/decide split): the verb loads the union of the two existing tables at its edge and hands it to a pure renderer, so every arm of the naming rule unit-tests against a fixture table instead of against whatever the build box gossiped. Gate adds: unit — the naming rule's three arms (unique names, ambiguous degrades, unknown degrades), a minter that does not parse rendered untouched, the stamp's shape and its degrade-to-raw arm.",
2026-08-28T09:54:48.1902819Z       "requiredStages": [
2026-08-28T09:54:48.1903076Z         "doc",
2026-08-28T09:54:48.1903332Z         "impl",
2026-08-28T09:54:48.1903588Z         "unit"
2026-08-28T09:54:48.1903845Z       ],
2026-08-28T09:54:48.1904107Z       "stages": {
2026-08-28T09:54:48.1904422Z         "doc": {
2026-08-28T09:54:48.1904699Z           "complete": true,
2026-08-28T09:54:48.1904971Z           "evidence": [
2026-08-28T09:54:48.1905220Z             {
2026-08-28T09:54:48.1905516Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.1905778Z               "line": 1078
2026-08-28T09:54:48.1906043Z             },
2026-08-28T09:54:48.1906282Z             {
2026-08-28T09:54:48.1906681Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.1906949Z               "line": 240
2026-08-28T09:54:48.1907201Z             }
2026-08-28T09:54:48.1907450Z           ]
2026-08-28T09:54:48.1907699Z         },
2026-08-28T09:54:48.1907960Z         "impl": {
2026-08-28T09:54:48.1908245Z           "complete": true,
2026-08-28T09:54:48.1908524Z           "evidence": [
2026-08-28T09:54:48.1908768Z             {
2026-08-28T09:54:48.1909181Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.1909491Z               "line": 241
2026-08-28T09:54:48.1909745Z             },
2026-08-28T09:54:48.1909998Z             {
2026-08-28T09:54:48.1910323Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.1910589Z               "line": 550
2026-08-28T09:54:48.1910846Z             },
2026-08-28T09:54:48.1911098Z             {
2026-08-28T09:54:48.1911420Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1911753Z               "line": 18
2026-08-28T09:54:48.1912016Z             },
2026-08-28T09:54:48.1912268Z             {
2026-08-28T09:54:48.1912593Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1912861Z               "line": 46
2026-08-28T09:54:48.1913118Z             },
2026-08-28T09:54:48.1913370Z             {
2026-08-28T09:54:48.1913702Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1913967Z               "line": 71
2026-08-28T09:54:48.1914226Z             },
2026-08-28T09:54:48.1914540Z             {
2026-08-28T09:54:48.1914869Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1915140Z               "line": 80
2026-08-28T09:54:48.1915394Z             },
2026-08-28T09:54:48.1915655Z             {
2026-08-28T09:54:48.1915980Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1916252Z               "line": 97
2026-08-28T09:54:48.1916508Z             },
2026-08-28T09:54:48.1916785Z             {
2026-08-28T09:54:48.1917128Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1917400Z               "line": 137
2026-08-28T09:54:48.1917662Z             },
2026-08-28T09:54:48.1917910Z             {
2026-08-28T09:54:48.1918234Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1918500Z               "line": 274
2026-08-28T09:54:48.1918757Z             },
2026-08-28T09:54:48.1919103Z             {
2026-08-28T09:54:48.1919427Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1919699Z               "line": 392
2026-08-28T09:54:48.1919952Z             }
2026-08-28T09:54:48.1920215Z           ]
2026-08-28T09:54:48.1920462Z         },
2026-08-28T09:54:48.1920724Z         "int": {
2026-08-28T09:54:48.1921001Z           "complete": false,
2026-08-28T09:54:48.1921286Z           "evidence": []
2026-08-28T09:54:48.1921555Z         },
2026-08-28T09:54:48.1921810Z         "unit": {
2026-08-28T09:54:48.1922090Z           "complete": true,
2026-08-28T09:54:48.1922365Z           "evidence": [
2026-08-28T09:54:48.1922690Z             {
2026-08-28T09:54:48.1923014Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.1923281Z               "line": 1154
2026-08-28T09:54:48.1923529Z             },
2026-08-28T09:54:48.1923787Z             {
2026-08-28T09:54:48.1924334Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1924612Z               "line": 436
2026-08-28T09:54:48.1924866Z             },
2026-08-28T09:54:48.1925114Z             {
2026-08-28T09:54:48.1925443Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1925710Z               "line": 471
2026-08-28T09:54:48.1926044Z             },
2026-08-28T09:54:48.1926298Z             {
2026-08-28T09:54:48.1926613Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1926884Z               "line": 499
2026-08-28T09:54:48.1927143Z             },
2026-08-28T09:54:48.1927397Z             {
2026-08-28T09:54:48.1927726Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.1928003Z               "line": 507
2026-08-28T09:54:48.1928251Z             }
2026-08-28T09:54:48.1928509Z           ]
2026-08-28T09:54:48.1928755Z         }
2026-08-28T09:54:48.1929104Z       }
2026-08-28T09:54:48.1929355Z     },
2026-08-28T09:54:48.1929602Z     {
2026-08-28T09:54:48.1929992Z       "id": "REQ-SEAL-ENROLL-RECORD-SUBNET-MATERIAL",
2026-08-28T09:54:48.1953726Z       "title": "AN ENROLLMENT RECORD IS DURABLE SUBNET SECURITY MATERIAL, MEMBER-VERIFIABLE BY CONSTRUCTION (#217 anchor 2): `{pubkey_hex, node, subnet, enrolled_at, backend_kind}` — pubkey as lowercase hex of the backend's raw public key bytes, node as THE DAEMON'S OWN NODE-KEY SHORT HEX (the nodeid::load_or_create + registry::key_prefix helper pair, 8 hex chars, the ADR-0054 roster short form — NEVER the hostname, the W2 gate ruling transported verbatim), the subnet name EXPLICIT (unlike a seal record, an enrollment has no minter address to derive scope from — the field is the scope), the mint timestamp in epoch ms, and the backend kind token (REQ-SEAL-AUTH-BACKEND-SEAM's encoding clause). THE STORE IS `trust/enrollments.json` BESIDE THE SEAL STORE — one JSON document, atomic write, a NEW path fn in perch.rs per REQ-HAZARD-SINGLE-PATH-SOURCE, absent/corrupt LOADS EMPTY (the evidence-store degrade polarity: a husk can only LOSE the ability to prove enrollment, never mint false evidence). RECORDS RIDE THE SAME SUBNET-SCOPED REPLICATION FAMILY AS SEAL RECORDS (the dispatch's same-family clause): an ADDITIVE KIND-TAGGED wire record in the Seal stream family's feed (the sealmsg NDJSON discipline — a tagged record an N-1 daemon does not know DROPS CLEANLY per line, never lands as chat, never fails the feed), the emitter re-presenting every enrollment record of the subnet beside its seal records (duplicates free under the join), the pump worker unchanged in cadence. THE APPLY POINT IS INSERT-IF-ABSENT KEYED BY (node, subnet) — records commute, replay no-ops, and the store is a join-semilattice like the seal store; a same-key-different-pubkey arrival is DROPPED WITH THE EXISTING RECORD KEPT and counted as an anomaly, never merged: FIRST-ENROLLED WINS EVERYWHERE, because records are immutable v1 (intake ruling 6) and a conflicting claim for an enrolled slot is either a partition echo or adversarial, and the adversarial copy is harmless only if it can never displace the enrolled key. THE APPLY GATE admits a row only when THIS node is a member of the record's subnet AND the handshake-proven origin node is on that subnet's roster (fail-closed, the REQ-SEAL-STORE-REPLICATES-SUBNET-SCOPED posture verbatim, same NotifPolicy plumbing). Immutable once minted, no expiry and no revocation v1 — a compromised or replaced authenticator is the stop-and-refer case by design. Gate: doc — the published records surface; impl — record struct + store + path fn + wire kind + gate/emit arms; unit — roundtrip persistence, insert-if-absent join (replay no-op, collision-drop-keeps-existing counted as anomaly), gate verdict arms (admitted / non-member-subnet dropped / untrusted-origin dropped), husk-loads-empty, node half is the 8-hex short form never a hostname. int at gate: a record enrolled on one member node readable on another.",
2026-08-28T09:54:48.1954370Z       "requiredStages": [
2026-08-28T09:54:48.1954628Z         "doc",
2026-08-28T09:54:48.1954885Z         "impl",
2026-08-28T09:54:48.1955144Z         "unit",
2026-08-28T09:54:48.1955402Z         "int"
2026-08-28T09:54:48.1955644Z       ],
2026-08-28T09:54:48.1955895Z       "stages": {
2026-08-28T09:54:48.1956161Z         "doc": {
2026-08-28T09:54:48.1956432Z           "complete": true,
2026-08-28T09:54:48.1956761Z           "evidence": [
2026-08-28T09:54:48.1957029Z             {
2026-08-28T09:54:48.1957414Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.1957668Z               "line": 344
2026-08-28T09:54:48.1957925Z             }
2026-08-28T09:54:48.1958177Z           ]
2026-08-28T09:54:48.1958429Z         },
2026-08-28T09:54:48.1958697Z         "impl": {
2026-08-28T09:54:48.1959073Z           "complete": true,
2026-08-28T09:54:48.1959355Z           "evidence": [
2026-08-28T09:54:48.1959607Z             {
2026-08-28T09:54:48.1959983Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.1960261Z               "line": 265
2026-08-28T09:54:48.1960518Z             },
2026-08-28T09:54:48.1960775Z             {
2026-08-28T09:54:48.1961136Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.1961410Z               "line": 1538
2026-08-28T09:54:48.1961663Z             },
2026-08-28T09:54:48.1961926Z             {
2026-08-28T09:54:48.1962292Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.1962570Z               "line": 59
2026-08-28T09:54:48.1962827Z             },
2026-08-28T09:54:48.1963081Z             {
2026-08-28T09:54:48.1963457Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.1963720Z               "line": 130
2026-08-28T09:54:48.1964042Z             },
2026-08-28T09:54:48.1964301Z             {
2026-08-28T09:54:48.1964674Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.1964940Z               "line": 41
2026-08-28T09:54:48.1965202Z             },
2026-08-28T09:54:48.1965465Z             {
2026-08-28T09:54:48.1965822Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1966099Z               "line": 34
2026-08-28T09:54:48.1966353Z             },
2026-08-28T09:54:48.1966618Z             {
2026-08-28T09:54:48.1966964Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1967298Z               "line": 53
2026-08-28T09:54:48.1967556Z             },
2026-08-28T09:54:48.1967817Z             {
2026-08-28T09:54:48.1968170Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1968437Z               "line": 62
2026-08-28T09:54:48.1968704Z             },
2026-08-28T09:54:48.1969042Z             {
2026-08-28T09:54:48.1969408Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1969675Z               "line": 112
2026-08-28T09:54:48.1969934Z             },
2026-08-28T09:54:48.1970187Z             {
2026-08-28T09:54:48.1970539Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1970821Z               "line": 146
2026-08-28T09:54:48.1971074Z             },
2026-08-28T09:54:48.1971331Z             {
2026-08-28T09:54:48.1971682Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1971956Z               "line": 203
2026-08-28T09:54:48.1972214Z             }
2026-08-28T09:54:48.1972467Z           ]
2026-08-28T09:54:48.1972725Z         },
2026-08-28T09:54:48.1972977Z         "int": {
2026-08-28T09:54:48.1973267Z           "complete": true,
2026-08-28T09:54:48.1973549Z           "evidence": [
2026-08-28T09:54:48.1973806Z             {
2026-08-28T09:54:48.1974183Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.1974459Z               "line": 1693
2026-08-28T09:54:48.1974719Z             },
2026-08-28T09:54:48.1975048Z             {
2026-08-28T09:54:48.1975414Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.1975687Z               "line": 1951
2026-08-28T09:54:48.1975949Z             }
2026-08-28T09:54:48.1976198Z           ]
2026-08-28T09:54:48.1976454Z         },
2026-08-28T09:54:48.1976712Z         "unit": {
2026-08-28T09:54:48.1976993Z           "complete": true,
2026-08-28T09:54:48.1977258Z           "evidence": [
2026-08-28T09:54:48.1977514Z             {
2026-08-28T09:54:48.1977882Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.1978206Z               "line": 315
2026-08-28T09:54:48.1978464Z             },
2026-08-28T09:54:48.1978716Z             {
2026-08-28T09:54:48.1979169Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.1979437Z               "line": 359
2026-08-28T09:54:48.1979699Z             },
2026-08-28T09:54:48.1979964Z             {
2026-08-28T09:54:48.1980331Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.1980612Z               "line": 145
2026-08-28T09:54:48.1980865Z             },
2026-08-28T09:54:48.1981122Z             {
2026-08-28T09:54:48.1981471Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1981747Z               "line": 343
2026-08-28T09:54:48.1982001Z             },
2026-08-28T09:54:48.1982261Z             {
2026-08-28T09:54:48.1982607Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1982879Z               "line": 366
2026-08-28T09:54:48.1983136Z             },
2026-08-28T09:54:48.1983389Z             {
2026-08-28T09:54:48.1983746Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1984019Z               "line": 392
2026-08-28T09:54:48.1984281Z             },
2026-08-28T09:54:48.1984530Z             {
2026-08-28T09:54:48.1984883Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1985219Z               "line": 413
2026-08-28T09:54:48.1985474Z             },
2026-08-28T09:54:48.1985736Z             {
2026-08-28T09:54:48.1986090Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1986361Z               "line": 436
2026-08-28T09:54:48.1986613Z             },
2026-08-28T09:54:48.1986876Z             {
2026-08-28T09:54:48.1987238Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.1987515Z               "line": 576
2026-08-28T09:54:48.1987771Z             }
2026-08-28T09:54:48.1988017Z           ]
2026-08-28T09:54:48.1988332Z         }
2026-08-28T09:54:48.1988575Z       }
2026-08-28T09:54:48.1988837Z     },
2026-08-28T09:54:48.1989171Z     {
2026-08-28T09:54:48.1989505Z       "id": "REQ-SEAL-ENROLL-SHORTCUT-E",
2026-08-28T09:54:48.2001690Z       "title": "`E` ON THE TOTP OVERLAY IS ENROLL-AND-SUBMIT, OFFERED IFF (node x subnet) IS NOT ENROLLED (#217 anchor 5): the daemon stamps the offer on the ceremony open (an additive field — an enrolled pair's overlay NEVER shows E, and an N-1 client ignores the field and simply shows the plain overlay); pressing E runs the client-side seam's ensure-keypair (Hello's own prompt) and ships ONE presented code together with the enrollment FACTS (pubkey hex + backend kind) on the upstream code record's additive fields. ON ADMIT THE DAEMON PERFORMS BOTH-OR-NEITHER UNDER THE ONE APPLY LOCK (doyle wire ruling 3): the enrollment record writes AND the pending seal mints, or NEITHER — a failed enrollment mints nothing and a failed mint enrolls nothing, both halves unit-pinned — so one human code entry yields a consistent pair and never a half-state. Every TOTP clause carries unchanged: throttle-before-verify on the same ledger, wrong code counts and re-prompts, Esc cancels everything spending nothing. An old daemon never offers E, so its clients never send enrollment facts it cannot read. Gate: doc — the published page's E clause; impl — the offer stamp + the E client arm + the both-or-neither admit arm; unit — offer iff not enrolled, enrolled overlays never offered, admitted E writes exactly one enrollment and one seal under the lock, the failed-enrollment arm mints nothing, the failed-mint arm enrolls nothing, cancel spends nothing.",
2026-08-28T09:54:48.2002139Z       "requiredStages": [
2026-08-28T09:54:48.2002391Z         "doc",
2026-08-28T09:54:48.2002653Z         "impl",
2026-08-28T09:54:48.2002915Z         "unit"
2026-08-28T09:54:48.2003173Z       ],
2026-08-28T09:54:48.2003429Z       "stages": {
2026-08-28T09:54:48.2003689Z         "doc": {
2026-08-28T09:54:48.2003975Z           "complete": true,
2026-08-28T09:54:48.2004251Z           "evidence": [
2026-08-28T09:54:48.2004566Z             {
2026-08-28T09:54:48.2004948Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2005229Z               "line": 173
2026-08-28T09:54:48.2005477Z             }
2026-08-28T09:54:48.2005735Z           ]
2026-08-28T09:54:48.2005989Z         },
2026-08-28T09:54:48.2006253Z         "impl": {
2026-08-28T09:54:48.2006551Z           "complete": true,
2026-08-28T09:54:48.2006823Z           "evidence": [
2026-08-28T09:54:48.2007076Z             {
2026-08-28T09:54:48.2007438Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2007716Z               "line": 4330
2026-08-28T09:54:48.2007968Z             },
2026-08-28T09:54:48.2008221Z             {
2026-08-28T09:54:48.2008574Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2008849Z               "line": 7050
2026-08-28T09:54:48.2009190Z             },
2026-08-28T09:54:48.2009447Z             {
2026-08-28T09:54:48.2009801Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2010072Z               "line": 7232
2026-08-28T09:54:48.2010329Z             },
2026-08-28T09:54:48.2010578Z             {
2026-08-28T09:54:48.2010891Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2011159Z               "line": 1752
2026-08-28T09:54:48.2011418Z             },
2026-08-28T09:54:48.2011721Z             {
2026-08-28T09:54:48.2012026Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2012312Z               "line": 3011
2026-08-28T09:54:48.2012564Z             },
2026-08-28T09:54:48.2012822Z             {
2026-08-28T09:54:48.2013127Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2013400Z               "line": 3046
2026-08-28T09:54:48.2013654Z             }
2026-08-28T09:54:48.2013908Z           ]
2026-08-28T09:54:48.2014163Z         },
2026-08-28T09:54:48.2014416Z         "int": {
2026-08-28T09:54:48.2014698Z           "complete": false,
2026-08-28T09:54:48.2015027Z           "evidence": []
2026-08-28T09:54:48.2015289Z         },
2026-08-28T09:54:48.2015542Z         "unit": {
2026-08-28T09:54:48.2015818Z           "complete": true,
2026-08-28T09:54:48.2016090Z           "evidence": [
2026-08-28T09:54:48.2016333Z             {
2026-08-28T09:54:48.2016708Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2017044Z               "line": 15193
2026-08-28T09:54:48.2017322Z             },
2026-08-28T09:54:48.2017584Z             {
2026-08-28T09:54:48.2017942Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2018228Z               "line": 15319
2026-08-28T09:54:48.2018481Z             },
2026-08-28T09:54:48.2018739Z             {
2026-08-28T09:54:48.2019177Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2019461Z               "line": 15521
2026-08-28T09:54:48.2019721Z             },
2026-08-28T09:54:48.2019974Z             {
2026-08-28T09:54:48.2020289Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2020555Z               "line": 3383
2026-08-28T09:54:48.2020818Z             }
2026-08-28T09:54:48.2021067Z           ]
2026-08-28T09:54:48.2021324Z         }
2026-08-28T09:54:48.2021576Z       }
2026-08-28T09:54:48.2021833Z     },
2026-08-28T09:54:48.2022086Z     {
2026-08-28T09:54:48.2022382Z       "id": "REQ-SEAL-ENROLL-VERB",
2026-08-28T09:54:48.2053104Z       "title": "`spt seal enroll-authenticator [--subnet <name>]` ENROLLS THIS NODE'S PLATFORM AUTHENTICATOR INTO A SUBNET'S SECURITY MATERIAL, GATED BY THE SHIPPED TOTP CEREMONY (#217 anchor 1). ORDERED SEAM CHECKS, EACH REFUSING BY NAME BEFORE ANY CEREMONY OPENS (no human should present a code for an enrollment that cannot complete): (1) the binding subnet resolves by the house rule's applicable arms — explicit `--subnet` wins but a subnet this endpoint is not a member of refuses fast by name, otherwise the endpoint's anchor subnet, and no anchor refuses by name (REQ-SEAL-SUBNET-BINDING-DEFAULT arms 1-2; enrollment is node x subnet — no destination, so the shared-subnet arm does not exist here); (2) seam availability (REQ-SEAL-AUTH-BACKEND-SEAM) — including the Linux named stub — refuses verbatim; (3) ALREADY-ENROLLED (the node x subnet key holds a record) refuses by name, NAMING THE EXISTING RECORD'S PUBKEY AND ITS IMMUTABILITY: records are immutable v1 (intake ruling 6 transported), re-enrollment/revocation is STOP-AND-REFER, never a lane decision, so the verb neither overwrites nor duplicates. THEN ensure-keypair runs (the backend's own user-verification prompt), and the verb requests the daemon's TOTP ceremony carrying FACTS — the pubkey hex and backend kind — plus, at the code arm, the PRESENTED CODE, never a verdict (write-through-daemon verbatim: verification, throttle and the record write all daemon-side). The ceremony rides the SHIPPED machinery as an additive purpose (the attach-stream additive-variant discipline of REQ-SEAL-CEREMONY-RC-CLIENT), and the overlay shows an ENROLLMENT BRIEF composed DAEMON-SIDE from the request's facts — naming the enrolling node's key short hex, the binding subnet, the backend kind and the enrolled pubkey's SHA-256 FINGERPRINT (64 hex via the one hash helper; the FULL pubkey hex lives in the record — an RSA public blob is ~588 hex chars (294-byte DER SPKI), measured, which no human can compare, and a fingerprint is what consent can actually read) — shown verbatim as ceremony content (the content-shown discipline: the human consents to THIS key for THIS node on THIS subnet), with the brief's own text carrying the ENROLL framing so even a chrome that says seal cannot misrepresent what is consented. THE THROTTLE IS THE EXISTING trust/seal-ceremony-gate.json LEDGER — enrollment mints NO new ledger (the denial-of-governance separation holds; a ruling is the only path to one) — throttle-before-verify, member-or-admin of the binding subnet, both seeds combined bitwise, cancel spends nothing: all inherited by riding the one ceremony-code path. ON ADMIT the daemon writes exactly one enrollment record (REQ-SEAL-ENROLL-RECORD-SUBNET-MATERIAL) under the same apply serialization as seal records and replies the record's fields; the verb prints them line-oriented. EXIT 0 IFF ENROLLED; every non-admit outcome (no-surface, throttled, refused, cancelled, ledger-unwritable) is nonzero carrying the daemon's own token and detail VERBATIM — the CLI never re-words a refusal it did not decide. Gate: doc — the published verb page; impl — the SealVerb variant + verb fn, the daemon enrollment-ceremony purpose arm + record write; unit — subnet-resolution arms (override wins, non-member override refuses by name, anchor default, no-anchor refuses), seam-unavailable refuses before ceremony, already-enrolled refuses before ceremony naming the record, admit writes exactly one record and exits 0, each non-admit outcome nonzero with the daemon detail verbatim, the daemon-composed brief carries node short hex + subnet + backend kind + pubkey hex and the ENROLL framing.",
2026-08-28T09:54:48.2053814Z       "requiredStages": [
2026-08-28T09:54:48.2054072Z         "doc",
2026-08-28T09:54:48.2054344Z         "impl",
2026-08-28T09:54:48.2054601Z         "unit"
2026-08-28T09:54:48.2054853Z       ],
2026-08-28T09:54:48.2055110Z       "stages": {
2026-08-28T09:54:48.2055368Z         "doc": {
2026-08-28T09:54:48.2055650Z           "complete": true,
2026-08-28T09:54:48.2055927Z           "evidence": [
2026-08-28T09:54:48.2056192Z             {
2026-08-28T09:54:48.2056577Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2056910Z               "line": 307
2026-08-28T09:54:48.2057163Z             }
2026-08-28T09:54:48.2057424Z           ]
2026-08-28T09:54:48.2057677Z         },
2026-08-28T09:54:48.2057930Z         "impl": {
2026-08-28T09:54:48.2058221Z           "complete": true,
2026-08-28T09:54:48.2058489Z           "evidence": [
2026-08-28T09:54:48.2058742Z             {
2026-08-28T09:54:48.2059173Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.2059453Z               "line": 747
2026-08-28T09:54:48.2059715Z             },
2026-08-28T09:54:48.2060030Z             {
2026-08-28T09:54:48.2060402Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2060674Z               "line": 5174
2026-08-28T09:54:48.2060930Z             },
2026-08-28T09:54:48.2061183Z             {
2026-08-28T09:54:48.2061549Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2061833Z               "line": 5770
2026-08-28T09:54:48.2062096Z             },
2026-08-28T09:54:48.2062354Z             {
2026-08-28T09:54:48.2062701Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2062978Z               "line": 6717
2026-08-28T09:54:48.2063231Z             },
2026-08-28T09:54:48.2063492Z             {
2026-08-28T09:54:48.2063846Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2064122Z               "line": 6778
2026-08-28T09:54:48.2064379Z             },
2026-08-28T09:54:48.2064632Z             {
2026-08-28T09:54:48.2064998Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2065275Z               "line": 7380
2026-08-28T09:54:48.2065537Z             },
2026-08-28T09:54:48.2065971Z             {
2026-08-28T09:54:48.2066329Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2066595Z               "line": 392
2026-08-28T09:54:48.2066847Z             },
2026-08-28T09:54:48.2067170Z             {
2026-08-28T09:54:48.2067518Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2067799Z               "line": 398
2026-08-28T09:54:48.2068052Z             },
2026-08-28T09:54:48.2068304Z             {
2026-08-28T09:54:48.2068648Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2068929Z               "line": 403
2026-08-28T09:54:48.2069268Z             },
2026-08-28T09:54:48.2069524Z             {
2026-08-28T09:54:48.2069869Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2070203Z               "line": 1354
2026-08-28T09:54:48.2070465Z             },
2026-08-28T09:54:48.2070724Z             {
2026-08-28T09:54:48.2071047Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2071310Z               "line": 461
2026-08-28T09:54:48.2071578Z             },
2026-08-28T09:54:48.2071825Z             {
2026-08-28T09:54:48.2072162Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2072436Z               "line": 294
2026-08-28T09:54:48.2072689Z             },
2026-08-28T09:54:48.2072952Z             {
2026-08-28T09:54:48.2073281Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2073552Z               "line": 323
2026-08-28T09:54:48.2073811Z             }
2026-08-28T09:54:48.2074067Z           ]
2026-08-28T09:54:48.2074324Z         },
2026-08-28T09:54:48.2074581Z         "int": {
2026-08-28T09:54:48.2075130Z           "complete": false,
2026-08-28T09:54:48.2075406Z           "evidence": []
2026-08-28T09:54:48.2075653Z         },
2026-08-28T09:54:48.2075906Z         "unit": {
2026-08-28T09:54:48.2076183Z           "complete": true,
2026-08-28T09:54:48.2076455Z           "evidence": [
2026-08-28T09:54:48.2076704Z             {
2026-08-28T09:54:48.2077061Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2077327Z               "line": 15211
2026-08-28T09:54:48.2077586Z             },
2026-08-28T09:54:48.2077834Z             {
2026-08-28T09:54:48.2078172Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2078669Z               "line": 619
2026-08-28T09:54:48.2078932Z             }
2026-08-28T09:54:48.2079275Z           ]
2026-08-28T09:54:48.2079523Z         }
2026-08-28T09:54:48.2079780Z       }
2026-08-28T09:54:48.2080027Z     },
2026-08-28T09:54:48.2080279Z     {
2026-08-28T09:54:48.2080583Z       "id": "REQ-SEAL-ENVELOPE-ATTR",
2026-08-28T09:54:48.2097322Z       "title": "A SEALED MESSAGE CARRIES ITS SEAL TOKEN AS A SENDER-AUTHORED ENVELOPE ATTRIBUTE seal=\"<token>\" riding like `json=` (collision-proof by construction: the token lives inside ONE attribute value and can never forge `from`/`type`; its alphabet, REQ-SEAL-TOKEN-FORMAT's 30-glyph set, is a strict subset of the reemittable attr charset so the attr can never smuggle envelope structure). SENDER-AUTHORED IS A DIFFERENT CLASS FROM RECEIVER-COMPOSED, AND THE BOUNDARY IS LOAD-BEARING: the ingress strip (REQ-TRUST-WARNING-ENVELOPE's RECEIVER_COMPOSED_ATTRS class - `trust-warning`, `mnemonics-json`, CONTEXT.md:960) inertizes attributes the RECEIVER composes about a delivery; the seal attr is the envelope author's OWN field (like `type`, `from`, a notify's id) and MUST ride end-to-end intact through that strip - and MUST NEVER be added to the strip class, which would delete the sender's own evidence citation at every ingress. THE ATTR SURFACES IN THE RECEIVER'S EVENT ENVELOPE: the receiving agent sees seal=\"...\" on the delivered <EVENT> and cites or verifies from there. KH 7.5 TRANSPORTED, STATED AS A PROHIBITION ON EVERY FUTURE CONSUMER: the attribute is a CITATION, never an authorization subject - no consumer may branch authority on its presence or value; only a BOUND `spt api seal verify` verdict over the delivered body is evidence, and a forged attr is harmless by construction because verify recomputes the hash. Gate: doc - the CONTEXT.md sealed-message clause's attribute sentence; impl - the attr const and its sender-side authoring at the compose seam; unit - a sealed envelope survives strip_receiver_composed_attrs with the attr intact while the receiver-composed class is still stripped beside it, the attr renders in the delivered EVENT envelope and round-trips the envelope codec, the attr value is the bare token; int - a sealed send delivered CROSS-NODE arrives with the attr intact and its body verifying BOUND against the replicated record on the receiving node (doyle W3 dispatch point 5b).",
2026-08-28T09:54:48.2097776Z       "requiredStages": [
2026-08-28T09:54:48.2098033Z         "doc",
2026-08-28T09:54:48.2098294Z         "impl",
2026-08-28T09:54:48.2098597Z         "unit",
2026-08-28T09:54:48.2098851Z         "int"
2026-08-28T09:54:48.2099198Z       ],
2026-08-28T09:54:48.2099465Z       "stages": {
2026-08-28T09:54:48.2099728Z         "doc": {
2026-08-28T09:54:48.2100009Z           "complete": true,
2026-08-28T09:54:48.2100275Z           "evidence": [
2026-08-28T09:54:48.2100533Z             {
2026-08-28T09:54:48.2100833Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2101114Z               "line": 1090
2026-08-28T09:54:48.2101366Z             },
2026-08-28T09:54:48.2101612Z             {
2026-08-28T09:54:48.2101994Z               "path": "docs-site/src/messaging/overview.md",
2026-08-28T09:54:48.2102261Z               "line": 168
2026-08-28T09:54:48.2102517Z             }
2026-08-28T09:54:48.2102771Z           ]
2026-08-28T09:54:48.2103023Z         },
2026-08-28T09:54:48.2103282Z         "impl": {
2026-08-28T09:54:48.2103564Z           "complete": true,
2026-08-28T09:54:48.2103832Z           "evidence": [
2026-08-28T09:54:48.2104092Z             {
2026-08-28T09:54:48.2104460Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.2104726Z               "line": 226
2026-08-28T09:54:48.2104985Z             },
2026-08-28T09:54:48.2105233Z             {
2026-08-28T09:54:48.2105548Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2105820Z               "line": 10956
2026-08-28T09:54:48.2106072Z             }
2026-08-28T09:54:48.2106324Z           ]
2026-08-28T09:54:48.2106581Z         },
2026-08-28T09:54:48.2106910Z         "int": {
2026-08-28T09:54:48.2107192Z           "complete": true,
2026-08-28T09:54:48.2107496Z           "evidence": [
2026-08-28T09:54:48.2107736Z             {
2026-08-28T09:54:48.2108117Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.2108389Z               "line": 1730
2026-08-28T09:54:48.2108646Z             }
2026-08-28T09:54:48.2108925Z           ]
2026-08-28T09:54:48.2109271Z         },
2026-08-28T09:54:48.2109534Z         "unit": {
2026-08-28T09:54:48.2109819Z           "complete": true,
2026-08-28T09:54:48.2110153Z           "evidence": [
2026-08-28T09:54:48.2110412Z             {
2026-08-28T09:54:48.2110759Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:48.2111026Z               "line": 268
2026-08-28T09:54:48.2111290Z             },
2026-08-28T09:54:48.2111542Z             {
2026-08-28T09:54:48.2111893Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.2112167Z               "line": 814
2026-08-28T09:54:48.2112424Z             },
2026-08-28T09:54:48.2112691Z             {
2026-08-28T09:54:48.2113002Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2113278Z               "line": 28248
2026-08-28T09:54:48.2113527Z             }
2026-08-28T09:54:48.2113785Z           ]
2026-08-28T09:54:48.2114046Z         }
2026-08-28T09:54:48.2114293Z       }
2026-08-28T09:54:48.2114549Z     },
2026-08-28T09:54:48.2114796Z     {
2026-08-28T09:54:48.2115102Z       "id": "REQ-SEAL-FIDO2-RC-CLIENT",
2026-08-28T09:54:48.2130526Z       "title": "THE FIDO2 CEREMONY RIDES THE EXISTING ATTACH RECORDS AS ADDITIVE FIELDS, NOT NEW VARIANTS (doyle wire ruling 3, 2026-08-24 — the measured N-1 posture supersedes the variants wording): the ceremony OPEN gains optional offer/payload fields and the upstream CODE record gains optional proof fields, so an N-1 CONTROLLER IGNORES THE UNKNOWN FIELDS AND DEGRADES TO THE PLAIN TOTP OVERLAY — the universal fallback keeps working, nothing hangs, no undecodable record, no refusal even needed; the existing default-false seal_ceremony capability bit keeps gating the ceremony surface itself, and no new bit is minted for the offers. SIGNING IS CLIENT-SIDE WHERE THE HUMAN IS (the rc-paste precedent): the rc client calls the authenticator seam's sign-payload over the daemon-composed tuple bytes and ships the SIGNATURE up the attach wire — a proof, never a verdict; verification, the ledger, and the mint stay daemon-side (an agent on the box can speak the broker's IPC directly, so a client-side decision would be decorative). LOCAL AND REMOTE CONTROLLERS ARE ONE CODE PATH — nothing about remote is special except transport latency, and a remote controller whose node lacks the enrolled key degrades to TOTP through the same seam-refusal fallback every client uses. An old DAEMON never emits the offers, so a new client never sends an unexpected proof to it. Gate: doc — the published page's remote-controller sentence; impl — the additive open/code fields + the client sign arm + the overlay fallback; unit — the open and code records round-trip with and without the new fields (absent fields decode as the plain TOTP shapes — the N-1 arm), the upstream proof record carries signature bytes and has no verdict field, and the client's seam-refusal path folds to TOTP entry.",
2026-08-28T09:54:48.2131035Z       "requiredStages": [
2026-08-28T09:54:48.2131288Z         "doc",
2026-08-28T09:54:48.2131551Z         "impl",
2026-08-28T09:54:48.2131808Z         "unit"
2026-08-28T09:54:48.2132062Z       ],
2026-08-28T09:54:48.2132329Z       "stages": {
2026-08-28T09:54:48.2132585Z         "doc": {
2026-08-28T09:54:48.2132880Z           "complete": true,
2026-08-28T09:54:48.2133149Z           "evidence": [
2026-08-28T09:54:48.2133407Z             {
2026-08-28T09:54:48.2133793Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2134075Z               "line": 162
2026-08-28T09:54:48.2134323Z             }
2026-08-28T09:54:48.2134585Z           ]
2026-08-28T09:54:48.2134939Z         },
2026-08-28T09:54:48.2135215Z         "impl": {
2026-08-28T09:54:48.2135503Z           "complete": true,
2026-08-28T09:54:48.2135773Z           "evidence": [
2026-08-28T09:54:48.2136026Z             {
2026-08-28T09:54:48.2136388Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.2136660Z               "line": 676
2026-08-28T09:54:48.2136913Z             },
2026-08-28T09:54:48.2137172Z             {
2026-08-28T09:54:48.2137543Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.2137816Z               "line": 961
2026-08-28T09:54:48.2138130Z             },
2026-08-28T09:54:48.2138380Z             {
2026-08-28T09:54:48.2138728Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.2139073Z               "line": 719
2026-08-28T09:54:48.2139334Z             },
2026-08-28T09:54:48.2139582Z             {
2026-08-28T09:54:48.2139892Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2140164Z               "line": 1663
2026-08-28T09:54:48.2140422Z             },
2026-08-28T09:54:48.2140673Z             {
2026-08-28T09:54:48.2140976Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2141247Z               "line": 3252
2026-08-28T09:54:48.2141496Z             }
2026-08-28T09:54:48.2141753Z           ]
2026-08-28T09:54:48.2142002Z         },
2026-08-28T09:54:48.2142259Z         "int": {
2026-08-28T09:54:48.2142535Z           "complete": false,
2026-08-28T09:54:48.2142807Z           "evidence": []
2026-08-28T09:54:48.2143059Z         },
2026-08-28T09:54:48.2143313Z         "unit": {
2026-08-28T09:54:48.2143607Z           "complete": true,
2026-08-28T09:54:48.2143877Z           "evidence": [
2026-08-28T09:54:48.2144129Z             {
2026-08-28T09:54:48.2144487Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.2144753Z               "line": 340
2026-08-28T09:54:48.2145011Z             },
2026-08-28T09:54:48.2145326Z             {
2026-08-28T09:54:48.2145645Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2145922Z               "line": 3349
2026-08-28T09:54:48.2146179Z             }
2026-08-28T09:54:48.2146424Z           ]
2026-08-28T09:54:48.2146686Z         }
2026-08-28T09:54:48.2146934Z       }
2026-08-28T09:54:48.2147267Z     },
2026-08-28T09:54:48.2147521Z     {
2026-08-28T09:54:48.2147840Z       "id": "REQ-SEAL-FIDO2-SIG-VERIFY",
2026-08-28T09:54:48.2171167Z       "title": "`spt api seal verify` EXTENDS TO THE SIGNATURE FOR fido2 RECORDS, ON ANY MEMBER NODE (#217 anchor 6): when the record's ceremony_kind is `fido2`, BOUND requires the content hash to match AND the signature to verify — the verifier RECOMPOSES the canonical tuple FROM THE RECORD'S OWN STORED FIELD SPELLINGS VERBATIM (the content_hash hex as stored, the fully-qualified minter as stored, minted_at as stored — no re-derivation, no respelling; ANY divergence is NOT-BOUND, never a second canonical form: doyle's exactness rider) and checks signature_hex against the pubkey looked up STRICTLY BY (node, subnet) — the record minter's node half x its binding subnet — in the replicated enrollment store, REFUSING BY NAME when no enrollment record exists there (no fallback to some record with this pubkey elsewhere: the replication scope IS the verification audience, the SEAL_NO_SHARED_SUBNET rationale — doyle ruling 3, 2026-08-24, unit-pinned). ALGORITHM DISPATCH RIDES THE ENROLLMENT RECORD'S backend_kind TOKEN: `hello-kcm-rs256` = RSASSA-PKCS1-v1_5 over SHA-256 of the tuple bytes, the pubkey parsed from the stored DER SubjectPublicKeyInfo, verified by the pure-Rust rsa crate — VERIFY-ONLY IN CORE (signature creation stays behind the authenticator seam; RUSTSEC-2023-0071 is private-key-op timing and cannot reach a verify-only consumer — the dep comment states exactly that with the advisory id, per doyle ruling 1) — and a FUTURE BACKEND ADDS A TOKEN AND A VERIFIER ARM, NEVER A RECORD MIGRATION; an unknown token refuses by name. `hello-rs256` IS RETIRED UNMINTED (#222 ruling, 2026-08-25) and gets NO verifier arm: its mint path was structurally unreachable on every box, so no record can carry it by construction (census: trust/seals.json holds totp records only, no enrollment record exists anywhere) — a record claiming that token is fabricated, and the unknown-token refusal is the honest answer to it. A fido2 record with a MISSING signature is NOT-BOUND (a self-declared fido2 mint that cannot be checked is not evidence); non-fido2 records verify exactly as before — the signature path is additive. `describe` renders the ceremony kind and the SIGNATURE PRESENCE (the fingerprint discipline anywhere a human reads key material). Exit contract unchanged: 0 IFF BOUND. Gate: doc — the published verify clause; impl — the signature arm + tuple recomposition + strict lookup + rsa verify + describe rendering; unit — valid signature BOUND, wrong signature NOT-BOUND, tuple recomposition pinned to stored spellings (a respelled minted_at diverges to NOT-BOUND), missing-enrollment refusal by name distinct from NOT-BOUND, unknown backend token refusal, fido2-with-missing-signature NOT-BOUND, non-fido2 records unaffected.",
2026-08-28T09:54:48.2171750Z       "requiredStages": [
2026-08-28T09:54:48.2172012Z         "doc",
2026-08-28T09:54:48.2172272Z         "impl",
2026-08-28T09:54:48.2172523Z         "unit"
2026-08-28T09:54:48.2172781Z       ],
2026-08-28T09:54:48.2173038Z       "stages": {
2026-08-28T09:54:48.2173296Z         "doc": {
2026-08-28T09:54:48.2173576Z           "complete": true,
2026-08-28T09:54:48.2173848Z           "evidence": [
2026-08-28T09:54:48.2174111Z             {
2026-08-28T09:54:48.2174502Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2174793Z               "line": 271
2026-08-28T09:54:48.2175045Z             }
2026-08-28T09:54:48.2175301Z           ]
2026-08-28T09:54:48.2175552Z         },
2026-08-28T09:54:48.2175814Z         "impl": {
2026-08-28T09:54:48.2176095Z           "complete": true,
2026-08-28T09:54:48.2176434Z           "evidence": [
2026-08-28T09:54:48.2176687Z             {
2026-08-28T09:54:48.2177040Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.2177321Z               "line": 293
2026-08-28T09:54:48.2177584Z             },
2026-08-28T09:54:48.2177839Z             {
2026-08-28T09:54:48.2178172Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2178444Z               "line": 138
2026-08-28T09:54:48.2178700Z             },
2026-08-28T09:54:48.2179010Z             {
2026-08-28T09:54:48.2179335Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2179664Z               "line": 175
2026-08-28T09:54:48.2179926Z             },
2026-08-28T09:54:48.2180178Z             {
2026-08-28T09:54:48.2180516Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2180780Z               "line": 331
2026-08-28T09:54:48.2181042Z             }
2026-08-28T09:54:48.2181289Z           ]
2026-08-28T09:54:48.2181550Z         },
2026-08-28T09:54:48.2181813Z         "int": {
2026-08-28T09:54:48.2182089Z           "complete": false,
2026-08-28T09:54:48.2182376Z           "evidence": []
2026-08-28T09:54:48.2182625Z         },
2026-08-28T09:54:48.2182890Z         "unit": {
2026-08-28T09:54:48.2183168Z           "complete": true,
2026-08-28T09:54:48.2183440Z           "evidence": [
2026-08-28T09:54:48.2183861Z             {
2026-08-28T09:54:48.2184233Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.2184509Z               "line": 493
2026-08-28T09:54:48.2184761Z             },
2026-08-28T09:54:48.2185028Z             {
2026-08-28T09:54:48.2185381Z               "path": "crates/spt-store/src/enroll.rs",
2026-08-28T09:54:48.2185657Z               "line": 537
2026-08-28T09:54:48.2185913Z             },
2026-08-28T09:54:48.2186175Z             {
2026-08-28T09:54:48.2186494Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2186771Z               "line": 656
2026-08-28T09:54:48.2187042Z             }
2026-08-28T09:54:48.2187300Z           ]
2026-08-28T09:54:48.2187552Z         }
2026-08-28T09:54:48.2187886Z       }
2026-08-28T09:54:48.2188139Z     },
2026-08-28T09:54:48.2188386Z     {
2026-08-28T09:54:48.2188689Z       "id": "REQ-SEAL-MINT-VERB",
2026-08-28T09:54:48.2203717Z       "title": "`spt seal mint` IS THE DECISION-SEAL ENTRY POINT: the text to seal arrives on STDIN, the verb requests the daemon's TOTP ceremony over exactly those bytes through the ONE production mint seam (Brain::seal_ceremony -> KIND_SEAL_CEREMONY; the CLI process never verifies, never ledgers, never mints - REQ-SEAL-CEREMONY-TOTP's write-through-daemon posture), and on admit prints the MINTED TOKEN to stdout as the whole result. STDIN IS TRIMMED EXACTLY AS `spt send` TRIMS ITS BODY (the REQ-HAZARD-ENVELOPE-CR-LINESAFE parity: a Windows `echo |` pipes a trailing CRLF, and a seal minted over an invisible trailing newline is a citation whose verify mysteriously reads NOT-BOUND) - so the buffer `spt seal mint` seals for a given text is byte-identical to the buffer a sealed send delivers for that same text; EMPTY content after the trim refuses fast CLI-side by name, before any ceremony opens (a ceremony over nothing asks the human to consent to nothing). REFUSALS RIDE THROUGH VERBATIM: no-surface, content cap, non-UTF-8, throttle, wrong-code and cancellation each surface the daemon's own outcome token and detail sentence - the CLI never re-words a refusal it did not decide (the W2 reply contract: every field is the broker's answer and none of it is the client's to summarize). The binding subnet resolves through REQ-SEAL-SUBNET-BINDING-DEFAULT (minter endpoint's anchor; `--subnet` overrides). EXIT CONTRACT, mirroring verify's 0-iff-BOUND: exit 0 IF AND ONLY IF the ceremony ADMITTED and the token printed; refused / throttled / cancelled / transport-error are each nonzero with the named reason on stderr. Gate: doc - the CONTEXT.md wax-seal entry's mint-verb sentence; impl - the CLI verb and its outcome mapping; unit - admit prints the bare token and exits 0, each non-admit outcome exits nonzero carrying the daemon's own detail verbatim, stdin trim parity with send, empty-content fast refusal by name.",
2026-08-28T09:54:48.2204194Z       "requiredStages": [
2026-08-28T09:54:48.2204452Z         "doc",
2026-08-28T09:54:48.2204714Z         "impl",
2026-08-28T09:54:48.2204976Z         "unit"
2026-08-28T09:54:48.2205237Z       ],
2026-08-28T09:54:48.2205500Z       "stages": {
2026-08-28T09:54:48.2205762Z         "doc": {
2026-08-28T09:54:48.2206044Z           "complete": true,
2026-08-28T09:54:48.2206312Z           "evidence": [
2026-08-28T09:54:48.2206636Z             {
2026-08-28T09:54:48.2206925Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2207194Z               "line": 1087
2026-08-28T09:54:48.2207461Z             },
2026-08-28T09:54:48.2207752Z             {
2026-08-28T09:54:48.2208138Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2208420Z               "line": 23
2026-08-28T09:54:48.2208725Z             }
2026-08-28T09:54:48.2209097Z           ]
2026-08-28T09:54:48.2209386Z         },
2026-08-28T09:54:48.2209651Z         "impl": {
2026-08-28T09:54:48.2209938Z           "complete": true,
2026-08-28T09:54:48.2210200Z           "evidence": [
2026-08-28T09:54:48.2210454Z             {
2026-08-28T09:54:48.2210783Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2211049Z               "line": 437
2026-08-28T09:54:48.2211311Z             },
2026-08-28T09:54:48.2211559Z             {
2026-08-28T09:54:48.2211921Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2212197Z               "line": 112
2026-08-28T09:54:48.2212450Z             },
2026-08-28T09:54:48.2212717Z             {
2026-08-28T09:54:48.2219519Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2219838Z               "line": 132
2026-08-28T09:54:48.2220104Z             },
2026-08-28T09:54:48.2220359Z             {
2026-08-28T09:54:48.2220704Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2220989Z               "line": 179
2026-08-28T09:54:48.2221352Z             }
2026-08-28T09:54:48.2221609Z           ]
2026-08-28T09:54:48.2221861Z         },
2026-08-28T09:54:48.2222124Z         "int": {
2026-08-28T09:54:48.2222409Z           "complete": false,
2026-08-28T09:54:48.2222691Z           "evidence": []
2026-08-28T09:54:48.2222943Z         },
2026-08-28T09:54:48.2223205Z         "unit": {
2026-08-28T09:54:48.2223481Z           "complete": true,
2026-08-28T09:54:48.2223753Z           "evidence": [
2026-08-28T09:54:48.2224016Z             {
2026-08-28T09:54:48.2224364Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2224697Z               "line": 559
2026-08-28T09:54:48.2224950Z             },
2026-08-28T09:54:48.2225206Z             {
2026-08-28T09:54:48.2225544Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2225820Z               "line": 588
2026-08-28T09:54:48.2226096Z             }
2026-08-28T09:54:48.2226348Z           ]
2026-08-28T09:54:48.2226606Z         }
2026-08-28T09:54:48.2226864Z       }
2026-08-28T09:54:48.2227122Z     },
2026-08-28T09:54:48.2227380Z     {
2026-08-28T09:54:48.2227733Z       "id": "REQ-SEAL-NO-CEREMONY-SURFACE",
2026-08-28T09:54:48.2239667Z       "title": "A MINT REQUESTED WITH NO CEREMONY SURFACE REFUSES FAST AND BY NAME: no live session for the minter endpoint, no attached CONTROLLER on that session, or a controller that did not declare the seal-ceremony capability (an N-1 rc client) each refuse `SEAL_NO_CEREMONY_SURFACE` with a notice telling the agent to have the operator attach and retry (operator ruling 4, 2026-08-23). NO pending-mint state and NO timeout queue: the refusal is immediate and nothing is parked awaiting a controller. The controller-attached predicate reads the BROKER'S LIVE SEAT TABLE under the log lock (has_controller), NEVER the perch info stamp — the stamp lags the seat decision by documented hazard (KH 7.15 / info.rs terminal_normalize: a dead session's controller stamp survives until a daemon-side clear catches up, and SessionInfo's controller_by None is ambiguous between empty and local), so a stamp reader would run ceremonies against a corpse or refuse against a live seat. Gate: doc — the CONTEXT.md ceremony clause's no-surface sentence; impl — the seat-table check and the named refusal; unit — no-session refuses, session-without-controller refuses, non-capable controller refuses, each by name; an attached capable controller proceeds; and the predicate is the broker seat table, pinned so a perch-stamp rewrite cannot pass.",
2026-08-28T09:54:48.2240105Z       "requiredStages": [
2026-08-28T09:54:48.2240443Z         "doc",
2026-08-28T09:54:48.2240716Z         "impl",
2026-08-28T09:54:48.2240977Z         "unit"
2026-08-28T09:54:48.2241234Z       ],
2026-08-28T09:54:48.2241494Z       "stages": {
2026-08-28T09:54:48.2241756Z         "doc": {
2026-08-28T09:54:48.2242037Z           "complete": true,
2026-08-28T09:54:48.2242309Z           "evidence": [
2026-08-28T09:54:48.2242566Z             {
2026-08-28T09:54:48.2242877Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2243168Z               "line": 1082
2026-08-28T09:54:48.2243422Z             },
2026-08-28T09:54:48.2243679Z             {
2026-08-28T09:54:48.2244073Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2244345Z               "line": 119
2026-08-28T09:54:48.2244597Z             }
2026-08-28T09:54:48.2244859Z           ]
2026-08-28T09:54:48.2245117Z         },
2026-08-28T09:54:48.2245531Z         "impl": {
2026-08-28T09:54:48.2245823Z           "complete": true,
2026-08-28T09:54:48.2246084Z           "evidence": [
2026-08-28T09:54:48.2246337Z             {
2026-08-28T09:54:48.2246698Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.2246978Z               "line": 928
2026-08-28T09:54:48.2247293Z             },
2026-08-28T09:54:48.2247561Z             {
2026-08-28T09:54:48.2247928Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2248200Z               "line": 704
2026-08-28T09:54:48.2248456Z             },
2026-08-28T09:54:48.2248796Z             {
2026-08-28T09:54:48.2249245Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2249516Z               "line": 1455
2026-08-28T09:54:48.2249764Z             },
2026-08-28T09:54:48.2250021Z             {
2026-08-28T09:54:48.2250379Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2250656Z               "line": 1467
2026-08-28T09:54:48.2250913Z             },
2026-08-28T09:54:48.2251162Z             {
2026-08-28T09:54:48.2251523Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2251859Z               "line": 2839
2026-08-28T09:54:48.2252112Z             },
2026-08-28T09:54:48.2252370Z             {
2026-08-28T09:54:48.2252736Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2253013Z               "line": 6504
2026-08-28T09:54:48.2253270Z             },
2026-08-28T09:54:48.2253518Z             {
2026-08-28T09:54:48.2253890Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2254176Z               "line": 6600
2026-08-28T09:54:48.2254438Z             },
2026-08-28T09:54:48.2254686Z             {
2026-08-28T09:54:48.2255053Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2255329Z               "line": 6630
2026-08-28T09:54:48.2255582Z             },
2026-08-28T09:54:48.2255834Z             {
2026-08-28T09:54:48.2256193Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2256455Z               "line": 8290
2026-08-28T09:54:48.2256706Z             },
2026-08-28T09:54:48.2256971Z             {
2026-08-28T09:54:48.2257319Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2257596Z               "line": 369
2026-08-28T09:54:48.2257854Z             },
2026-08-28T09:54:48.2258097Z             {
2026-08-28T09:54:48.2258435Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2258769Z               "line": 619
2026-08-28T09:54:48.2259113Z             },
2026-08-28T09:54:48.2259366Z             {
2026-08-28T09:54:48.2259750Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.2260019Z               "line": 130
2026-08-28T09:54:48.2260271Z             },
2026-08-28T09:54:48.2260524Z             {
2026-08-28T09:54:48.2260839Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2261120Z               "line": 2521
2026-08-28T09:54:48.2261369Z             }
2026-08-28T09:54:48.2261627Z           ]
2026-08-28T09:54:48.2262032Z         },
2026-08-28T09:54:48.2262419Z         "int": {
2026-08-28T09:54:48.2262862Z           "complete": false,
2026-08-28T09:54:48.2263172Z           "evidence": []
2026-08-28T09:54:48.2263453Z         },
2026-08-28T09:54:48.2263754Z         "unit": {
2026-08-28T09:54:48.2264116Z           "complete": true,
2026-08-28T09:54:48.2264484Z           "evidence": [
2026-08-28T09:54:48.2264770Z             {
2026-08-28T09:54:48.2265256Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2265618Z               "line": 14956
2026-08-28T09:54:48.2265966Z             },
2026-08-28T09:54:48.2266346Z             {
2026-08-28T09:54:48.2266933Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2267304Z               "line": 15041
2026-08-28T09:54:48.2267578Z             },
2026-08-28T09:54:48.2267969Z             {
2026-08-28T09:54:48.2268574Z               "path": "crates/spt-net/src/net/attach.rs",
2026-08-28T09:54:48.2269128Z               "line": 585
2026-08-28T09:54:48.2269523Z             }
2026-08-28T09:54:48.2269785Z           ]
2026-08-28T09:54:48.2270035Z         }
2026-08-28T09:54:48.2270290Z       }
2026-08-28T09:54:48.2270540Z     },
2026-08-28T09:54:48.2270798Z     {
2026-08-28T09:54:48.2271089Z       "id": "REQ-SEAL-RECORD",
2026-08-28T09:54:48.2286386Z       "title": "A WAX SEAL IS A DURABLE RECORD BINDING CONTENT TO A MINTER: `{token, content_hash, minter, minted_at, ceremony_kind}` — the token (REQ-SEAL-TOKEN-FORMAT), the lowercase-hex SHA-256 over the EXACT BYTES presented at the ceremony (the artifact-digest convention, `sha256_hex` house style: no prefix, no truncation), the FULLY-QUALIFIED minter address `subnet:endpoint@node` (the subnet component IS the binding subnet — the record carries no separate subnet field, and the store derives scoping by parsing the minter through the spt-proto address grammar, one truth not two), the mint timestamp in epoch ms, and the ceremony kind as an open string (`totp` arrives W2; FIDO2 is fast-follow; test-seam mints name themselves honestly and never wear a ceremony they did not run). NO EXPIRY AND NO REVOCATION IN V1 (operator ruling 6, 2026-08-23): the timestamp is in the record and a reversed decision is a NEWER seal, so records are IMMUTABLE ONCE MINTED — which is what makes the replicated store a join-semilattice for free (REQ-SEAL-STORE-REPLICATES-SUBNET-SCOPED). A seal is EVIDENCE, never an authorization subject by itself (the KNOWN-HAZARDS 7.5 discipline transported): nothing grants on token possession; only a BOUND verify verdict (REQ-SEAL-VERIFY-CONTENT-BOUND) is citable. W1 lands the mint machinery behind an INTERNAL SEAM ONLY — no public mint verb, no ceremony; W2 wires the TOTP ceremony to that seam. The seam refuses EMPTY content: a seal over zero bytes proves nothing and the verify surface treats empty stdin as absent content, so admitting the mint would create a record whose verification is indistinguishable from the no-content refusal. Gate: doc — the ratified CONTEXT.md wax-seal entry carries the record shape; impl — the record struct + mint seam in spt-store; unit — roundtrip persistence, minter-parse-derived binding subnet, empty-content mint refusal.",
2026-08-28T09:54:48.2286944Z       "requiredStages": [
2026-08-28T09:54:48.2287205Z         "doc",
2026-08-28T09:54:48.2287467Z         "impl",
2026-08-28T09:54:48.2287730Z         "unit"
2026-08-28T09:54:48.2287987Z       ],
2026-08-28T09:54:48.2288245Z       "stages": {
2026-08-28T09:54:48.2288572Z         "doc": {
2026-08-28T09:54:48.2288852Z           "complete": true,
2026-08-28T09:54:48.2289229Z           "evidence": [
2026-08-28T09:54:48.2289482Z             {
2026-08-28T09:54:48.2289777Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2290048Z               "line": 1074
2026-08-28T09:54:48.2290301Z             }
2026-08-28T09:54:48.2290559Z           ]
2026-08-28T09:54:48.2290802Z         },
2026-08-28T09:54:48.2291070Z         "impl": {
2026-08-28T09:54:48.2291353Z           "complete": true,
2026-08-28T09:54:48.2291632Z           "evidence": [
2026-08-28T09:54:48.2291956Z             {
2026-08-28T09:54:48.2292319Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2292586Z               "line": 35
2026-08-28T09:54:48.2292844Z             },
2026-08-28T09:54:48.2293106Z             {
2026-08-28T09:54:48.2293454Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2293736Z               "line": 101
2026-08-28T09:54:48.2293992Z             },
2026-08-28T09:54:48.2294252Z             {
2026-08-28T09:54:48.2294591Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2294866Z               "line": 112
2026-08-28T09:54:48.2295119Z             },
2026-08-28T09:54:48.2295377Z             {
2026-08-28T09:54:48.2295712Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2295973Z               "line": 275
2026-08-28T09:54:48.2296223Z             }
2026-08-28T09:54:48.2296480Z           ]
2026-08-28T09:54:48.2296735Z         },
2026-08-28T09:54:48.2296988Z         "int": {
2026-08-28T09:54:48.2297284Z           "complete": false,
2026-08-28T09:54:48.2297560Z           "evidence": []
2026-08-28T09:54:48.2297823Z         },
2026-08-28T09:54:48.2298085Z         "unit": {
2026-08-28T09:54:48.2298366Z           "complete": true,
2026-08-28T09:54:48.2298642Z           "evidence": [
2026-08-28T09:54:48.2298895Z             {
2026-08-28T09:54:48.2299368Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2299640Z               "line": 397
2026-08-28T09:54:48.2299973Z             },
2026-08-28T09:54:48.2300227Z             {
2026-08-28T09:54:48.2300584Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2300861Z               "line": 419
2026-08-28T09:54:48.2301114Z             }
2026-08-28T09:54:48.2301367Z           ]
2026-08-28T09:54:48.2301620Z         }
2026-08-28T09:54:48.2301875Z       }
2026-08-28T09:54:48.2302126Z     },
2026-08-28T09:54:48.2302374Z     {
2026-08-28T09:54:48.2302680Z       "id": "REQ-SEAL-SEND-SEALED",
2026-08-28T09:54:48.2328141Z       "title": "`spt send <id> --seal [--subnet <name>]` IS SEALED DISPATCH: one verb that runs the TOTP ceremony over the EXACT BYTES THAT WILL BE DELIVERED and, on admit, delivers the message carrying the minted token as its sender-authored envelope attribute (REQ-SEAL-ENVELOPE-ATTR). ONE BUFFER END TO END: the body read once at the verb's head (trimmed exactly as an unsealed send trims) is THE buffer the overlay shows, THE buffer the mint hashes, and THE buffer delivered - never re-read and never re-encoded between ceremony and delivery, so the receiver's `spt api seal verify` over the delivered body reads BOUND by construction; the unit pins ceremony-buffer == delivered-buffer identity. THE OVERLAY NAMES THE DESTINATION ID as well as the binding subnet (design of record, doyle W3 dispatch point 2 - the W2 overlay named only the subnet, so this is an overlay change too: the destination line renders when present, and the human consents to sealing THIS text TO THIS endpoint UNDER THIS subnet). A NON-ADMITTED CEREMONY SENDS NOTHING: refused, throttled and cancelled each surface the daemon's outcome verbatim and the message is neither delivered nor spooled (REQ-SEAL-CEREMONY-ESC-CANCEL's pending-sealed-send-DROPPED arm, which this verb finally gives a consumer). The binding subnet resolves through REQ-SEAL-SUBNET-BINDING-DEFAULT against the destination. Gate: doc - the CONTEXT.md sealed-message clause; impl - the --seal arm in cmd_send (ceremony before delivery, attr authoring at the compose seam); unit - ceremony-buffer == delivered-buffer identity, the overlay brief carries the destination id, a non-admit outcome delivers and spools nothing, an admit delivers carrying the minted token. #223 (FIELD-SEAL W2): THE SENDER'S ANSWER CARRIES THE MINTED TOKEN — `SENT:<target> seal=<token>` — because before this the ONLY sender-visible copy of the token was a ceremony-overlay line stranded in the sender's PTY, which no script or agent can consume (field-measured, v0.62.0 first sealed exchange). THE TOKEN RIDES EVERY OUTCOME LINE A SEALED SEND CAN ANSWER WITH — SENT, QUEUED, QUEUED(idle-only), DEFERRED (doyle ruling, 2026-08-25) — because the token is evidence of the MINT, not of delivery: the ceremony runs BEFORE any delivery arm by construction, so a send that only spooled still minted a record its sender may need to cite. The suffix appears IFF A MINT PRECEDED THE ANSWER: an unsealed send's answer is byte-identical to before, and refusal/non-admit paths return before any answer line exists, so no path can print an empty `seal=`. AND THE ADMITTED CEREMONY PRINTS NOTHING TO THE PTY: the rc takes the overlay down and emits NO notice on admit, since the token now reaches the sender on the answer line and that notice was the residue; every NON-admit outcome still renders the daemon's sentence verbatim, because nothing else surfaces a failure or a cancel. The remaining cosmetic half — the blanked overlay rows the session repaints only over time — is REQ-BROKER-SCREEN-GRID's scope, not this one's. Gate adds: unit — the answer composer over all four outcome labels, and the unsealed answer unchanged.",
2026-08-28T09:54:48.2328716Z       "requiredStages": [
2026-08-28T09:54:48.2329126Z         "doc",
2026-08-28T09:54:48.2329392Z         "impl",
2026-08-28T09:54:48.2329651Z         "unit"
2026-08-28T09:54:48.2329904Z       ],
2026-08-28T09:54:48.2330176Z       "stages": {
2026-08-28T09:54:48.2330429Z         "doc": {
2026-08-28T09:54:48.2330732Z           "complete": true,
2026-08-28T09:54:48.2331078Z           "evidence": [
2026-08-28T09:54:48.2331335Z             {
2026-08-28T09:54:48.2331635Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2331902Z               "line": 1088
2026-08-28T09:54:48.2332165Z             },
2026-08-28T09:54:48.2332419Z             {
2026-08-28T09:54:48.2332794Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2333062Z               "line": 55
2026-08-28T09:54:48.2333320Z             }
2026-08-28T09:54:48.2333574Z           ]
2026-08-28T09:54:48.2333835Z         },
2026-08-28T09:54:48.2334102Z         "impl": {
2026-08-28T09:54:48.2334436Z           "complete": true,
2026-08-28T09:54:48.2334713Z           "evidence": [
2026-08-28T09:54:48.2334957Z             {
2026-08-28T09:54:48.2335276Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2335543Z               "line": 11000
2026-08-28T09:54:48.2335795Z             },
2026-08-28T09:54:48.2336056Z             {
2026-08-28T09:54:48.2336364Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2336641Z               "line": 11247
2026-08-28T09:54:48.2336894Z             },
2026-08-28T09:54:48.2337151Z             {
2026-08-28T09:54:48.2337456Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2337732Z               "line": 3302
2026-08-28T09:54:48.2337990Z             },
2026-08-28T09:54:48.2338247Z             {
2026-08-28T09:54:48.2338581Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2338848Z               "line": 413
2026-08-28T09:54:48.2339238Z             }
2026-08-28T09:54:48.2339491Z           ]
2026-08-28T09:54:48.2339758Z         },
2026-08-28T09:54:48.2340015Z         "int": {
2026-08-28T09:54:48.2340301Z           "complete": false,
2026-08-28T09:54:48.2340578Z           "evidence": []
2026-08-28T09:54:48.2340835Z         },
2026-08-28T09:54:48.2341098Z         "unit": {
2026-08-28T09:54:48.2341383Z           "complete": true,
2026-08-28T09:54:48.2341734Z           "evidence": [
2026-08-28T09:54:48.2341991Z             {
2026-08-28T09:54:48.2342306Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2342578Z               "line": 28220
2026-08-28T09:54:48.2342839Z             },
2026-08-28T09:54:48.2343102Z             {
2026-08-28T09:54:48.2343412Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2343692Z               "line": 28243
2026-08-28T09:54:48.2343942Z             },
2026-08-28T09:54:48.2344197Z             {
2026-08-28T09:54:48.2344505Z               "path": "crates/spt/src/rc.rs",
2026-08-28T09:54:48.2344839Z               "line": 3462
2026-08-28T09:54:48.2345096Z             },
2026-08-28T09:54:48.2345358Z             {
2026-08-28T09:54:48.2345682Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2345954Z               "line": 570
2026-08-28T09:54:48.2346212Z             }
2026-08-28T09:54:48.2346461Z           ]
2026-08-28T09:54:48.2346716Z         }
2026-08-28T09:54:48.2346967Z       }
2026-08-28T09:54:48.2347267Z     },
2026-08-28T09:54:48.2347525Z     {
2026-08-28T09:54:48.2347934Z       "id": "REQ-SEAL-STORE-REPLICATES-SUBNET-SCOPED",
2026-08-28T09:54:48.2371953Z       "title": "SEAL RECORDS LIVE IN SUBNET SECURITY MATERIAL AND REPLICATE SUBNET-SCOPED, so `spt api seal verify|describe` answers on ANY member node of the binding subnet. The store is `identity/trust/seals.json` beside the grant store and whitelist (one JSON document, atomic write, the grants.rs template; a new path fn in perch.rs per REQ-HAZARD-SINGLE-PATH-SOURCE). PREMISE CORRECTION, MEASURED AT INTAKE (0fcbc086): the grant store and whitelist are NODE-LOCAL AND DO NOT REPLICATE — their 'propagation seam' is aspirational prose with no wire family behind it — so 'same plumbing' is honored by riding the ONE shipped subnet-scoped replication pattern, the notif store's four-part shape: (1) MONOTONE JOIN — the apply point is insert-if-absent by token, so records commute, a replayed feed no-ops, and immutability (REQ-SEAL-RECORD) makes the store a join-semilattice with no delta bookkeeping; a same-token-different-content arrival is DROPPED WITH THE EXISTING RECORD KEPT and counted as an anomaly, never merged, because tokens are minted once and a collision is either astronomical or adversarial, and the adversarial copy is already harmless (verify recomputes the hash). (2) KIND-TAGGED WIRE RECORD — NDJSON with kind = 'seal' (the knockmsg N-1 lesson: an untagged record lands in an old daemon's WanMessage arm as a chat message; a tagged one drops cleanly). (3) STREAMFAMILY REGISTRATION — a `Seal` family arm in classify_first_line + serve dispatch, widening the census array the bijection test asserts. (4) APPLY GATE + FULL-RE-PRESENTATION EMIT + PUMP WORKER — the gate admits a row only when THIS node is a member of the record's binding subnet AND the handshake-proven origin node is on that subnet's roster (fail-closed: non-member subnet drops, untrusted origin drops — the REQ-NOTIF-1/REQ-MESH-5 posture verbatim); the emitter re-presents every record of the subnet (duplicates are free under the join); the pump worker fans per member subnet x roster peer through the existing fan_targets discipline. DEGRADE POLARITY IS OPEN-TO-EMPTY (the grants polarity, chosen deliberately): a husk or corrupt store loads empty, so verify answers unknown-token — the store failing can only LOSE the ability to prove, never mint false evidence, which is the safe direction for an evidence primitive. Binding-subnet scoping is derived from the minter address at the ONE parse helper on the record — the emitter and the gate share it, so the scope a record replicates under and the scope it is admitted under cannot diverge. Gate: doc — the CONTEXT.md entry's subnet-scoped replication clause; impl — store + wire record + family arm + gate/emit/worker; unit — join idempotence + collision-drop, gate's verdict arms (admitted, non-member-subnet dropped, untrusted-origin dropped, replay no-op), emit/decode roundtrip, husk-loads-empty. int at gate: a record minted on one member node answering describe on another.",
2026-08-28T09:54:48.2372597Z       "requiredStages": [
2026-08-28T09:54:48.2372863Z         "doc",
2026-08-28T09:54:48.2373123Z         "impl",
2026-08-28T09:54:48.2373381Z         "unit",
2026-08-28T09:54:48.2373643Z         "int"
2026-08-28T09:54:48.2373899Z       ],
2026-08-28T09:54:48.2374167Z       "stages": {
2026-08-28T09:54:48.2374425Z         "doc": {
2026-08-28T09:54:48.2374720Z           "complete": true,
2026-08-28T09:54:48.2374997Z           "evidence": [
2026-08-28T09:54:48.2375256Z             {
2026-08-28T09:54:48.2375622Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2375897Z               "line": 1076
2026-08-28T09:54:48.2376171Z             }
2026-08-28T09:54:48.2376428Z           ]
2026-08-28T09:54:48.2376686Z         },
2026-08-28T09:54:48.2376953Z         "impl": {
2026-08-28T09:54:48.2377244Z           "complete": true,
2026-08-28T09:54:48.2377521Z           "evidence": [
2026-08-28T09:54:48.2377784Z             {
2026-08-28T09:54:48.2378165Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2378454Z               "line": 177
2026-08-28T09:54:48.2378718Z             },
2026-08-28T09:54:48.2379135Z             {
2026-08-28T09:54:48.2379520Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2379797Z               "line": 262
2026-08-28T09:54:48.2380060Z             },
2026-08-28T09:54:48.2380316Z             {
2026-08-28T09:54:48.2380684Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2380966Z               "line": 1076
2026-08-28T09:54:48.2381221Z             },
2026-08-28T09:54:48.2381483Z             {
2026-08-28T09:54:48.2381850Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2382132Z               "line": 1511
2026-08-28T09:54:48.2382389Z             },
2026-08-28T09:54:48.2382653Z             {
2026-08-28T09:54:48.2383028Z               "path": "crates/spt-daemon/src/pump/seal.rs",
2026-08-28T09:54:48.2383301Z               "line": 57
2026-08-28T09:54:48.2383566Z             },
2026-08-28T09:54:48.2383893Z             {
2026-08-28T09:54:48.2384256Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2384518Z               "line": 27
2026-08-28T09:54:48.2384789Z             },
2026-08-28T09:54:48.2385056Z             {
2026-08-28T09:54:48.2385628Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2385909Z               "line": 58
2026-08-28T09:54:48.2386159Z             },
2026-08-28T09:54:48.2386409Z             {
2026-08-28T09:54:48.2386789Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2387132Z               "line": 94
2026-08-28T09:54:48.2387390Z             },
2026-08-28T09:54:48.2387641Z             {
2026-08-28T09:54:48.2388010Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.2388281Z               "line": 24
2026-08-28T09:54:48.2388538Z             },
2026-08-28T09:54:48.2388801Z             {
2026-08-28T09:54:48.2389337Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.2389617Z               "line": 47
2026-08-28T09:54:48.2389874Z             },
2026-08-28T09:54:48.2390133Z             {
2026-08-28T09:54:48.2390490Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.2390762Z               "line": 74
2026-08-28T09:54:48.2391019Z             },
2026-08-28T09:54:48.2391268Z             {
2026-08-28T09:54:48.2391612Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2391872Z               "line": 165
2026-08-28T09:54:48.2392134Z             },
2026-08-28T09:54:48.2392387Z             {
2026-08-28T09:54:48.2392725Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2392993Z               "line": 201
2026-08-28T09:54:48.2393241Z             },
2026-08-28T09:54:48.2393499Z             {
2026-08-28T09:54:48.2393838Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2394188Z               "line": 232
2026-08-28T09:54:48.2394438Z             }
2026-08-28T09:54:48.2394700Z           ]
2026-08-28T09:54:48.2394953Z         },
2026-08-28T09:54:48.2395217Z         "int": {
2026-08-28T09:54:48.2395502Z           "complete": true,
2026-08-28T09:54:48.2395775Z           "evidence": [
2026-08-28T09:54:48.2396042Z             {
2026-08-28T09:54:48.2396414Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.2396695Z               "line": 1636
2026-08-28T09:54:48.2396945Z             }
2026-08-28T09:54:48.2397201Z           ]
2026-08-28T09:54:48.2397515Z         },
2026-08-28T09:54:48.2397778Z         "unit": {
2026-08-28T09:54:48.2398069Z           "complete": true,
2026-08-28T09:54:48.2398341Z           "evidence": [
2026-08-28T09:54:48.2398599Z             {
2026-08-28T09:54:48.2399098Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2399389Z               "line": 2676
2026-08-28T09:54:48.2399645Z             },
2026-08-28T09:54:48.2399906Z             {
2026-08-28T09:54:48.2400269Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2400550Z               "line": 176
2026-08-28T09:54:48.2400807Z             },
2026-08-28T09:54:48.2401055Z             {
2026-08-28T09:54:48.2401427Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2401694Z               "line": 204
2026-08-28T09:54:48.2401951Z             },
2026-08-28T09:54:48.2402205Z             {
2026-08-28T09:54:48.2402576Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2402852Z               "line": 259
2026-08-28T09:54:48.2403119Z             },
2026-08-28T09:54:48.2403381Z             {
2026-08-28T09:54:48.2403920Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2404191Z               "line": 276
2026-08-28T09:54:48.2404440Z             },
2026-08-28T09:54:48.2404691Z             {
2026-08-28T09:54:48.2405057Z               "path": "crates/spt-daemon/src/sealsync.rs",
2026-08-28T09:54:48.2405332Z               "line": 408
2026-08-28T09:54:48.2405667Z             },
2026-08-28T09:54:48.2405929Z             {
2026-08-28T09:54:48.2406292Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.2406553Z               "line": 92
2026-08-28T09:54:48.2406849Z             },
2026-08-28T09:54:48.2407092Z             {
2026-08-28T09:54:48.2407454Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.2407709Z               "line": 132
2026-08-28T09:54:48.2407967Z             },
2026-08-28T09:54:48.2408239Z             {
2026-08-28T09:54:48.2408600Z               "path": "crates/spt-net/src/net/sealmsg.rs",
2026-08-28T09:54:48.2408934Z               "line": 179
2026-08-28T09:54:48.2409282Z             },
2026-08-28T09:54:48.2409540Z             {
2026-08-28T09:54:48.2409888Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2410168Z               "line": 445
2026-08-28T09:54:48.2410423Z             },
2026-08-28T09:54:48.2410684Z             {
2026-08-28T09:54:48.2411038Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2411310Z               "line": 505
2026-08-28T09:54:48.2411563Z             },
2026-08-28T09:54:48.2411811Z             {
2026-08-28T09:54:48.2412163Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2412431Z               "line": 518
2026-08-28T09:54:48.2412690Z             }
2026-08-28T09:54:48.2412944Z           ]
2026-08-28T09:54:48.2413202Z         }
2026-08-28T09:54:48.2413460Z       }
2026-08-28T09:54:48.2413713Z     },
2026-08-28T09:54:48.2413966Z     {
2026-08-28T09:54:48.2414323Z       "id": "REQ-SEAL-SUBNET-BINDING-DEFAULT",
2026-08-28T09:54:48.2428127Z       "title": "THE BINDING SUBNET OF A SEAL RESOLVES BY ONE DETERMINISTIC RULE (operator ruling 5 + Q8, doyle W3 dispatch point 3): (1) an explicit `--subnet <name>` OVERRIDES everything below - the caller named the key the human will present - but a name the MINTER endpoint is not a member of refuses fast by name (the ceremony could never verify a member-or-admin code of a subnet the minter has no seeds for); (2) otherwise the seal binds to the MINTER ENDPOINT'S ANCHOR SUBNET; (3) on sealed dispatch where the DESTINATION does not share the minter's anchor, the LEXICOGRAPHICALLY-FIRST subnet shared by both endpoints - deterministic, so one pair of endpoints always binds one subnet and the overlay's named subnet is reproducible run to run; (4) NO SHARED SUBNET refuses by name (`SEAL_NO_SHARED_SUBNET`) - NEVER fall back to a subnet the receiver cannot verify in, because the replication scope IS the verification audience: a seal whose binding subnet excludes the destination's nodes is a citation the recipient structurally cannot check (REQ-SEAL-STORE-REPLICATES-SUBNET-SCOPED). The resolver is a PURE FUNCTION over (override, minter anchor, minter's subnet set, destination's subnet set) so the whole rule is one unit table; the overlay always names the chosen subnet (W2 already renders it). Gate: doc - the CONTEXT.md binding-subnet clause; impl - the pure resolver and its callers (mint verb, sealed dispatch); unit - the rule table: anchor default, shared-lex-first when the destination lacks the anchor, override beats both, override-outside-minter-membership refuses by name, no-shared refuses SEAL_NO_SHARED_SUBNET, and input-order independence of the shared-set pick.",
2026-08-28T09:54:48.2428554Z       "requiredStages": [
2026-08-28T09:54:48.2428815Z         "doc",
2026-08-28T09:54:48.2429163Z         "impl",
2026-08-28T09:54:48.2429425Z         "unit"
2026-08-28T09:54:48.2429678Z       ],
2026-08-28T09:54:48.2429945Z       "stages": {
2026-08-28T09:54:48.2430207Z         "doc": {
2026-08-28T09:54:48.2430492Z           "complete": true,
2026-08-28T09:54:48.2430774Z           "evidence": [
2026-08-28T09:54:48.2431027Z             {
2026-08-28T09:54:48.2431331Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2431601Z               "line": 1089
2026-08-28T09:54:48.2431858Z             },
2026-08-28T09:54:48.2432115Z             {
2026-08-28T09:54:48.2432570Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2432841Z               "line": 186
2026-08-28T09:54:48.2433098Z             }
2026-08-28T09:54:48.2433360Z           ]
2026-08-28T09:54:48.2433607Z         },
2026-08-28T09:54:48.2433871Z         "impl": {
2026-08-28T09:54:48.2434151Z           "complete": true,
2026-08-28T09:54:48.2434427Z           "evidence": [
2026-08-28T09:54:48.2434680Z             {
2026-08-28T09:54:48.2435018Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2435285Z               "line": 72
2026-08-28T09:54:48.2435614Z             },
2026-08-28T09:54:48.2435876Z             {
2026-08-28T09:54:48.2436210Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2436480Z               "line": 160
2026-08-28T09:54:48.2436732Z             }
2026-08-28T09:54:48.2436989Z           ]
2026-08-28T09:54:48.2437241Z         },
2026-08-28T09:54:48.2437504Z         "int": {
2026-08-28T09:54:48.2437786Z           "complete": false,
2026-08-28T09:54:48.2438067Z           "evidence": []
2026-08-28T09:54:48.2438320Z         },
2026-08-28T09:54:48.2438578Z         "unit": {
2026-08-28T09:54:48.2438854Z           "complete": true,
2026-08-28T09:54:48.2439200Z           "evidence": [
2026-08-28T09:54:48.2439460Z             {
2026-08-28T09:54:48.2439789Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2440066Z               "line": 484
2026-08-28T09:54:48.2440319Z             },
2026-08-28T09:54:48.2440577Z             {
2026-08-28T09:54:48.2440916Z               "path": "crates/spt/src/sealverb.rs",
2026-08-28T09:54:48.2441183Z               "line": 540
2026-08-28T09:54:48.2441440Z             }
2026-08-28T09:54:48.2441691Z           ]
2026-08-28T09:54:48.2441947Z         }
2026-08-28T09:54:48.2442199Z       }
2026-08-28T09:54:48.2442457Z     },
2026-08-28T09:54:48.2442709Z     {
2026-08-28T09:54:48.2443024Z       "id": "REQ-SEAL-TOKEN-FORMAT",
2026-08-28T09:54:48.2455814Z       "title": "A SEAL TOKEN IS 8-10 CHARS FROM A NARROW UNAMBIGUOUS LOWERCASE CHARSET, minted by rejection-sampling the OsRng-backed identity source (the knock-code precedent — one randomness source, one audit point; no `rand` crate edge). The charset is the 30-glyph set `23456789abcdefghjkmnpqrstvwxyz`: digits drop `0`/`1` (collide with `o`/`l`/`i`), letters drop `i`/`l`/`o` (same collisions) and `u` (the Crockford accidental-obscenity drop) — REQ-HAZARD-ID-CHARSET's discipline applied to a NEW, NARROWER alphabet rather than reusing the endpoint-id set, because a seal token is read aloud and retyped by humans citing a decision, and `:`/`@` stay permanently reserved address delimiters so a token can never smuggle address structure. MINTS EMIT 10 CHARS (~49 bits over the 30-set — ample for a citation handle whose forgery is harmless by construction, since verify recomputes the content hash and possession grants nothing); VALIDATION ADMITS 8-10 so the format has headroom without a flag day (the sptkc_ versioning lesson: widen by admitting, never by breaking). Well-formedness lives in the STORE beside the record (the knock `is_well_formed` precedent) and every verb validates the token at its seam before touching the store — a malformed token is a refusal, never a lookup miss, so the two cannot be conflated by a caller. Gate: doc — the CONTEXT.md entry's 8-10-char clause; impl — charset const + validator + mint sampler in spt-store; unit — charset membership (every minted char in-set, ambiguous glyphs refused), length bounds both edges, malformed-vs-unknown distinction at the verb seam.",
2026-08-28T09:54:48.2456359Z       "requiredStages": [
2026-08-28T09:54:48.2456625Z         "doc",
2026-08-28T09:54:48.2456889Z         "impl",
2026-08-28T09:54:48.2457155Z         "unit"
2026-08-28T09:54:48.2457410Z       ],
2026-08-28T09:54:48.2457685Z       "stages": {
2026-08-28T09:54:48.2457947Z         "doc": {
2026-08-28T09:54:48.2458229Z           "complete": true,
2026-08-28T09:54:48.2458515Z           "evidence": [
2026-08-28T09:54:48.2458773Z             {
2026-08-28T09:54:48.2459226Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2459506Z               "line": 1075
2026-08-28T09:54:48.2459765Z             }
2026-08-28T09:54:48.2460013Z           ]
2026-08-28T09:54:48.2460277Z         },
2026-08-28T09:54:48.2460533Z         "impl": {
2026-08-28T09:54:48.2460824Z           "complete": true,
2026-08-28T09:54:48.2461091Z           "evidence": [
2026-08-28T09:54:48.2461354Z             {
2026-08-28T09:54:48.2461692Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2461960Z               "line": 50
2026-08-28T09:54:48.2462280Z             },
2026-08-28T09:54:48.2462521Z             {
2026-08-28T09:54:48.2462863Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2463128Z               "line": 68
2026-08-28T09:54:48.2463391Z             },
2026-08-28T09:54:48.2463640Z             {
2026-08-28T09:54:48.2463978Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2464245Z               "line": 78
2026-08-28T09:54:48.2464502Z             },
2026-08-28T09:54:48.2464764Z             {
2026-08-28T09:54:48.2465093Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2465370Z               "line": 258
2026-08-28T09:54:48.2465631Z             }
2026-08-28T09:54:48.2465889Z           ]
2026-08-28T09:54:48.2466146Z         },
2026-08-28T09:54:48.2466393Z         "int": {
2026-08-28T09:54:48.2466660Z           "complete": false,
2026-08-28T09:54:48.2466938Z           "evidence": []
2026-08-28T09:54:48.2467190Z         },
2026-08-28T09:54:48.2467449Z         "unit": {
2026-08-28T09:54:48.2467740Z           "complete": true,
2026-08-28T09:54:48.2468019Z           "evidence": [
2026-08-28T09:54:48.2468274Z             {
2026-08-28T09:54:48.2468617Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2468893Z               "line": 359
2026-08-28T09:54:48.2469232Z             },
2026-08-28T09:54:48.2469556Z             {
2026-08-28T09:54:48.2469900Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2470171Z               "line": 379
2026-08-28T09:54:48.2470424Z             }
2026-08-28T09:54:48.2470678Z           ]
2026-08-28T09:54:48.2470929Z         }
2026-08-28T09:54:48.2471178Z       }
2026-08-28T09:54:48.2471431Z     },
2026-08-28T09:54:48.2471681Z     {
2026-08-28T09:54:48.2472023Z       "id": "REQ-SEAL-VERIFY-CONTENT-BOUND",
2026-08-28T09:54:48.2499115Z       "title": "`spt api seal verify <token>` IS CONTENT-BOUND: the content arrives on stdin, the verb recomputes the lowercase-hex SHA-256 over the exact bytes received and compares it to the record's `content_hash`, and the verdict is BOUND or NOT-BOUND with the record's fields printed alongside — a verify that does not read content is not a verify, so BARE VERIFY WITH NO CONTENT (empty or absent stdin) REFUSES BY NAME, pointing the caller at `describe` (operator ruling 7: `SEAL_VERIFY_NO_CONTENT`, the refusal names the verb that answers the question actually asked). EXIT CONTRACT, PINNED SO A SCRIPTED CALLER CAN NEVER MISREAD A NON-VERDICT AS EVIDENCE: exit 0 IF AND ONLY IF BOUND. NOT-BOUND prints its verdict line (with the expected-vs-presented hashes) on stdout and exits nonzero; an unknown token refuses `SEAL_UNKNOWN_TOKEN` on stderr; a malformed token refuses at the format seam (REQ-SEAL-TOKEN-FORMAT) — three distinct texts, none of them exit 0, because ONLY A BOUND VERDICT IS EVIDENCE (KH 7.5: the token, and any envelope attribute carrying it, is never an authorization subject by itself; forged or wrong tokens are harmless by construction precisely because this verb recomputes the hash). The verbs are READ-ONLY and take no auth gate (the EndpointInfo precedent): the store they read replicates subnet-scoped, so membership already bounds who can answer, and a verify mutates nothing. Gate: doc — the CONTEXT.md entry's verify clause; impl — the api verb, hash recomputation at the store's one helper, the no-content and unknown-token refusals; unit — BOUND on exact bytes, NOT-BOUND on a one-byte delta, empty-stdin refusal pointing at describe, unknown-token refusal distinct from malformed-token refusal, exit-0-iff-BOUND across all five arms. #220 (operator, FIELD-SEAL W2): TWO CHANGES, NEITHER OF WHICH WEAKENS THE BINDING. (1) THE MINT'S TRIM IS MIRRORED AS A SECOND CANDIDATE: `seal mint` seals `raw.trim()` (both ends, the CRLF rationale of REQ-HAZARD-ENVELOPE-CR-LINESAFE), so presented bytes carrying a shell's trailing newline — every `echo |` on the fleet — could never bind the seal minted from that same text. Verify hashes the EXACT bytes FIRST and, ONLY ON A MISS, hashes the mint-trimmed candidate: additive by construction, so nothing that binds today stops binding, including content deliberately sealed WITH its whitespace. The trim MIRRORS THE MINT rather than the ticket's narrower 'trailing' — `str::trim` for UTF-8 content (the identical function the mint calls), ASCII whitespace for bytes the mint verb could never have produced but the store can hold. (2) THE VERDICT'S RECORD BLOCK IS THE NARROW ONE: `token`, `content_hash` and `ceremony_kind` DO NOT surface from verify — the verdict line already carries the token (`SEAL_BOUND:<token>`) and, on a mismatch, both hashes in prose, and a field repeated beside its own verdict reads as a second, weaker answer; `describe` keeps all three. Verify's minter rides VERBATIM (the human render is describe's alone). Gate adds: unit — exact bytes bind, trailing-newline/CRLF/both-ends-padded bind through the fallback, a real one-byte delta and interior-whitespace differences still NOT-BOUND, a seal minted over trailing whitespace still binds its exact bytes, the non-UTF-8 arm, and the three dropped fields pinned as an ABSENCE.",
2026-08-28T09:54:48.2499752Z       "requiredStages": [
2026-08-28T09:54:48.2500006Z         "doc",
2026-08-28T09:54:48.2500268Z         "impl",
2026-08-28T09:54:48.2500527Z         "unit"
2026-08-28T09:54:48.2500785Z       ],
2026-08-28T09:54:48.2501056Z       "stages": {
2026-08-28T09:54:48.2501371Z         "doc": {
2026-08-28T09:54:48.2501662Z           "complete": true,
2026-08-28T09:54:48.2501944Z           "evidence": [
2026-08-28T09:54:48.2502195Z             {
2026-08-28T09:54:48.2502490Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.2502769Z               "line": 1077
2026-08-28T09:54:48.2503022Z             },
2026-08-28T09:54:48.2503275Z             {
2026-08-28T09:54:48.2503656Z               "path": "docs-site/src/messaging/wax-seal.md",
2026-08-28T09:54:48.2503924Z               "line": 210
2026-08-28T09:54:48.2504176Z             }
2026-08-28T09:54:48.2504471Z           ]
2026-08-28T09:54:48.2504724Z         },
2026-08-28T09:54:48.2504990Z         "impl": {
2026-08-28T09:54:48.2505275Z           "complete": true,
2026-08-28T09:54:48.2505541Z           "evidence": [
2026-08-28T09:54:48.2505798Z             {
2026-08-28T09:54:48.2506142Z               "path": "crates/spt-store/src/seal.rs",
2026-08-28T09:54:48.2506414Z               "line": 102
2026-08-28T09:54:48.2506671Z             },
2026-08-28T09:54:48.2506929Z             {
2026-08-28T09:54:48.2507257Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.2507528Z               "line": 242
2026-08-28T09:54:48.2507792Z             },
2026-08-28T09:54:48.2508043Z             {
2026-08-28T09:54:48.2508377Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.2508644Z               "line": 559
2026-08-28T09:54:48.2508906Z             },
2026-08-28T09:54:48.2509240Z             {
2026-08-28T09:54:48.2509573Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2509850Z               "line": 17
2026-08-28T09:54:48.2510107Z             },
2026-08-28T09:54:48.2510377Z             {
2026-08-28T09:54:48.2510706Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2510978Z               "line": 307
2026-08-28T09:54:48.2511230Z             },
2026-08-28T09:54:48.2511496Z             {
2026-08-28T09:54:48.2511816Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2512093Z               "line": 330
2026-08-28T09:54:48.2512431Z             },
2026-08-28T09:54:48.2512679Z             {
2026-08-28T09:54:48.2513008Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2513273Z               "line": 400
2026-08-28T09:54:48.2513535Z             }
2026-08-28T09:54:48.2513787Z           ]
2026-08-28T09:54:48.2514044Z         },
2026-08-28T09:54:48.2514306Z         "int": {
2026-08-28T09:54:48.2514588Z           "complete": false,
2026-08-28T09:54:48.2514869Z           "evidence": []
2026-08-28T09:54:48.2515118Z         },
2026-08-28T09:54:48.2515366Z         "unit": {
2026-08-28T09:54:48.2515688Z           "complete": true,
2026-08-28T09:54:48.2515953Z           "evidence": [
2026-08-28T09:54:48.2516197Z             {
2026-08-28T09:54:48.2516521Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.2516792Z               "line": 1154
2026-08-28T09:54:48.2517046Z             },
2026-08-28T09:54:48.2517308Z             {
2026-08-28T09:54:48.2517633Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2517904Z               "line": 522
2026-08-28T09:54:48.2518161Z             },
2026-08-28T09:54:48.2518409Z             {
2026-08-28T09:54:48.2518728Z               "path": "crates/spt/src/api/seal.rs",
2026-08-28T09:54:48.2519080Z               "line": 569
2026-08-28T09:54:48.2519342Z             }
2026-08-28T09:54:48.2519591Z           ]
2026-08-28T09:54:48.2519843Z         }
2026-08-28T09:54:48.2520095Z       }
2026-08-28T09:54:48.2520343Z     },
2026-08-28T09:54:48.2520602Z     {
2026-08-28T09:54:48.2520900Z       "id": "REQ-SEAM-ACTIVITY",
2026-08-28T09:54:48.2521456Z       "title": "Activity/idle reported via api sentinels, not PTY quiescence",
2026-08-28T09:54:48.2521751Z       "requiredStages": [
2026-08-28T09:54:48.2522018Z         "impl",
2026-08-28T09:54:48.2522271Z         "unit"
2026-08-28T09:54:48.2522529Z       ],
2026-08-28T09:54:48.2522802Z       "stages": {
2026-08-28T09:54:48.2523131Z         "doc": {
2026-08-28T09:54:48.2523413Z           "complete": false,
2026-08-28T09:54:48.2523696Z           "evidence": []
2026-08-28T09:54:48.2523946Z         },
2026-08-28T09:54:48.2524209Z         "impl": {
2026-08-28T09:54:48.2524495Z           "complete": true,
2026-08-28T09:54:48.2524767Z           "evidence": [
2026-08-28T09:54:48.2525034Z             {
2026-08-28T09:54:48.2525392Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2525664Z               "line": 18
2026-08-28T09:54:48.2525921Z             },
2026-08-28T09:54:48.2526239Z             {
2026-08-28T09:54:48.2526585Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2526866Z               "line": 292
2026-08-28T09:54:48.2527128Z             },
2026-08-28T09:54:48.2527377Z             {
2026-08-28T09:54:48.2527734Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2528001Z               "line": 369
2026-08-28T09:54:48.2528259Z             }
2026-08-28T09:54:48.2528513Z           ]
2026-08-28T09:54:48.2528774Z         },
2026-08-28T09:54:48.2529110Z         "int": {
2026-08-28T09:54:48.2529397Z           "complete": false,
2026-08-28T09:54:48.2529682Z           "evidence": []
2026-08-28T09:54:48.2529946Z         },
2026-08-28T09:54:48.2530208Z         "unit": {
2026-08-28T09:54:48.2530490Z           "complete": true,
2026-08-28T09:54:48.2530762Z           "evidence": [
2026-08-28T09:54:48.2531023Z             {
2026-08-28T09:54:48.2531385Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2531653Z               "line": 1102
2026-08-28T09:54:48.2531916Z             },
2026-08-28T09:54:48.2532174Z             {
2026-08-28T09:54:48.2532522Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2532798Z               "line": 1119
2026-08-28T09:54:48.2533061Z             },
2026-08-28T09:54:48.2533319Z             {
2026-08-28T09:54:48.2533672Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2533953Z               "line": 1128
2026-08-28T09:54:48.2534290Z             }
2026-08-28T09:54:48.2534544Z           ]
2026-08-28T09:54:48.2534807Z         }
2026-08-28T09:54:48.2535055Z       }
2026-08-28T09:54:48.2535322Z     },
2026-08-28T09:54:48.2541206Z     {
2026-08-28T09:54:48.2541564Z       "id": "REQ-SEAM-CAPABILITY",
2026-08-28T09:54:48.2542040Z       "title": "Hostable endpoint-types capability declaration",
2026-08-28T09:54:48.2542329Z       "requiredStages": [
2026-08-28T09:54:48.2542596Z         "impl",
2026-08-28T09:54:48.2542853Z         "unit"
2026-08-28T09:54:48.2543119Z       ],
2026-08-28T09:54:48.2543383Z       "stages": {
2026-08-28T09:54:48.2543735Z         "doc": {
2026-08-28T09:54:48.2544025Z           "complete": false,
2026-08-28T09:54:48.2544293Z           "evidence": []
2026-08-28T09:54:48.2544552Z         },
2026-08-28T09:54:48.2544802Z         "impl": {
2026-08-28T09:54:48.2545296Z           "complete": true,
2026-08-28T09:54:48.2545568Z           "evidence": [
2026-08-28T09:54:48.2545826Z             {
2026-08-28T09:54:48.2546202Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.2546475Z               "line": 943
2026-08-28T09:54:48.2546741Z             }
2026-08-28T09:54:48.2546998Z           ]
2026-08-28T09:54:48.2547259Z         },
2026-08-28T09:54:48.2547567Z         "int": {
2026-08-28T09:54:48.2547858Z           "complete": false,
2026-08-28T09:54:48.2548130Z           "evidence": []
2026-08-28T09:54:48.2548392Z         },
2026-08-28T09:54:48.2548650Z         "unit": {
2026-08-28T09:54:48.2548935Z           "complete": true,
2026-08-28T09:54:48.2549318Z           "evidence": [
2026-08-28T09:54:48.2549579Z             {
2026-08-28T09:54:48.2549947Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.2550212Z               "line": 1885
2026-08-28T09:54:48.2550474Z             }
2026-08-28T09:54:48.2550742Z           ]
2026-08-28T09:54:48.2550999Z         }
2026-08-28T09:54:48.2551253Z       }
2026-08-28T09:54:48.2551586Z     },
2026-08-28T09:54:48.2551848Z     {
2026-08-28T09:54:48.2552144Z       "id": "REQ-SEAM-HISTORY",
2026-08-28T09:54:48.2552702Z       "title": "History subsystem (fetcher / locate-normalize / native store)",
2026-08-28T09:54:48.2552994Z       "requiredStages": [
2026-08-28T09:54:48.2553251Z         "impl",
2026-08-28T09:54:48.2553504Z         "unit",
2026-08-28T09:54:48.2553771Z         "int"
2026-08-28T09:54:48.2554023Z       ],
2026-08-28T09:54:48.2554291Z       "stages": {
2026-08-28T09:54:48.2554553Z         "doc": {
2026-08-28T09:54:48.2554830Z           "complete": false,
2026-08-28T09:54:48.2555173Z           "evidence": []
2026-08-28T09:54:48.2555429Z         },
2026-08-28T09:54:48.2555903Z         "impl": {
2026-08-28T09:54:48.2556195Z           "complete": true,
2026-08-28T09:54:48.2556466Z           "evidence": [
2026-08-28T09:54:48.2556720Z             {
2026-08-28T09:54:48.2557063Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:48.2557335Z               "line": 24
2026-08-28T09:54:48.2557597Z             },
2026-08-28T09:54:48.2557853Z             {
2026-08-28T09:54:48.2558207Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2558479Z               "line": 22
2026-08-28T09:54:48.2558728Z             }
2026-08-28T09:54:48.2559085Z           ]
2026-08-28T09:54:48.2559338Z         },
2026-08-28T09:54:48.2559597Z         "int": {
2026-08-28T09:54:48.2559883Z           "complete": true,
2026-08-28T09:54:48.2560154Z           "evidence": [
2026-08-28T09:54:48.2560411Z             {
2026-08-28T09:54:48.2560772Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:48.2561044Z               "line": 245
2026-08-28T09:54:48.2561297Z             }
2026-08-28T09:54:48.2561550Z           ]
2026-08-28T09:54:48.2561808Z         },
2026-08-28T09:54:48.2562074Z         "unit": {
2026-08-28T09:54:48.2562360Z           "complete": true,
2026-08-28T09:54:48.2562632Z           "evidence": [
2026-08-28T09:54:48.2562889Z             {
2026-08-28T09:54:48.2563230Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:48.2563582Z               "line": 220
2026-08-28T09:54:48.2563840Z             },
2026-08-28T09:54:48.2564098Z             {
2026-08-28T09:54:48.2564422Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:48.2564699Z               "line": 249
2026-08-28T09:54:48.2564922Z             },
2026-08-28T09:54:48.2565194Z             {
2026-08-28T09:54:48.2565537Z               "path": "crates/spt-live/src/echo.rs",
2026-08-28T09:54:48.2565799Z               "line": 269
2026-08-28T09:54:48.2566064Z             },
2026-08-28T09:54:48.2566311Z             {
2026-08-28T09:54:48.2566736Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2567003Z               "line": 199
2026-08-28T09:54:48.2567261Z             },
2026-08-28T09:54:48.2567522Z             {
2026-08-28T09:54:48.2567872Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2568152Z               "line": 219
2026-08-28T09:54:48.2568408Z             },
2026-08-28T09:54:48.2568668Z             {
2026-08-28T09:54:48.2569106Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2569383Z               "line": 244
2026-08-28T09:54:48.2569636Z             },
2026-08-28T09:54:48.2569893Z             {
2026-08-28T09:54:48.2570251Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2570519Z               "line": 276
2026-08-28T09:54:48.2570777Z             },
2026-08-28T09:54:48.2571029Z             {
2026-08-28T09:54:48.2571385Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2571651Z               "line": 297
2026-08-28T09:54:48.2571919Z             },
2026-08-28T09:54:48.2572177Z             {
2026-08-28T09:54:48.2572529Z               "path": "crates/spt-live/src/history.rs",
2026-08-28T09:54:48.2572801Z               "line": 324
2026-08-28T09:54:48.2573055Z             }
2026-08-28T09:54:48.2573317Z           ]
2026-08-28T09:54:48.2573620Z         }
2026-08-28T09:54:48.2573875Z       }
2026-08-28T09:54:48.2574123Z     },
2026-08-28T09:54:48.2574377Z     {
2026-08-28T09:54:48.2574663Z       "id": "REQ-SEAM-INJECT",
2026-08-28T09:54:48.2575162Z       "title": "inject-input methods configurable per activity-state",
2026-08-28T09:54:48.2575454Z       "requiredStages": [
2026-08-28T09:54:48.2575711Z         "impl",
2026-08-28T09:54:48.2575974Z         "unit"
2026-08-28T09:54:48.2576223Z       ],
2026-08-28T09:54:48.2576497Z       "stages": {
2026-08-28T09:54:48.2576751Z         "doc": {
2026-08-28T09:54:48.2577090Z           "complete": false,
2026-08-28T09:54:48.2577357Z           "evidence": []
2026-08-28T09:54:48.2577611Z         },
2026-08-28T09:54:48.2577869Z         "impl": {
2026-08-28T09:54:48.2578155Z           "complete": true,
2026-08-28T09:54:48.2578437Z           "evidence": [
2026-08-28T09:54:48.2578693Z             {
2026-08-28T09:54:48.2579130Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2579400Z               "line": 19
2026-08-28T09:54:48.2579657Z             },
2026-08-28T09:54:48.2579910Z             {
2026-08-28T09:54:48.2580262Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2580544Z               "line": 448
2026-08-28T09:54:48.2580797Z             }
2026-08-28T09:54:48.2581051Z           ]
2026-08-28T09:54:48.2581299Z         },
2026-08-28T09:54:48.2581555Z         "int": {
2026-08-28T09:54:48.2581845Z           "complete": false,
2026-08-28T09:54:48.2582121Z           "evidence": []
2026-08-28T09:54:48.2582374Z         },
2026-08-28T09:54:48.2582633Z         "unit": {
2026-08-28T09:54:48.2582918Z           "complete": true,
2026-08-28T09:54:48.2583175Z           "evidence": [
2026-08-28T09:54:48.2583414Z             {
2026-08-28T09:54:48.2583757Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2584028Z               "line": 1208
2026-08-28T09:54:48.2584284Z             },
2026-08-28T09:54:48.2584541Z             {
2026-08-28T09:54:48.2584889Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.2585223Z               "line": 1228
2026-08-28T09:54:48.2585486Z             }
2026-08-28T09:54:48.2585742Z           ]
2026-08-28T09:54:48.2585999Z         }
2026-08-28T09:54:48.2586247Z       }
2026-08-28T09:54:48.2586501Z     },
2026-08-28T09:54:48.2586749Z     {
2026-08-28T09:54:48.2587061Z       "id": "REQ-SEAM-POSTSPAWN",
2026-08-28T09:54:48.2587470Z       "title": "post-spawn / api bind seam with boot nonce",
2026-08-28T09:54:48.2587756Z       "requiredStages": [
2026-08-28T09:54:48.2588033Z         "impl",
2026-08-28T09:54:48.2588314Z         "unit"
2026-08-28T09:54:48.2588623Z       ],
2026-08-28T09:54:48.2588891Z       "stages": {
2026-08-28T09:54:48.2589233Z         "doc": {
2026-08-28T09:54:48.2589523Z           "complete": false,
2026-08-28T09:54:48.2589803Z           "evidence": []
2026-08-28T09:54:48.2590066Z         },
2026-08-28T09:54:48.2590323Z         "impl": {
2026-08-28T09:54:48.2590604Z           "complete": true,
2026-08-28T09:54:48.2590875Z           "evidence": [
2026-08-28T09:54:48.2591137Z             {
2026-08-28T09:54:48.2591486Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.2591762Z               "line": 18
2026-08-28T09:54:48.2592019Z             },
2026-08-28T09:54:48.2592274Z             {
2026-08-28T09:54:48.2592631Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.2592906Z               "line": 1076
2026-08-28T09:54:48.2593169Z             }
2026-08-28T09:54:48.2593416Z           ]
2026-08-28T09:54:48.2593682Z         },
2026-08-28T09:54:48.2593935Z         "int": {
2026-08-28T09:54:48.2594222Z           "complete": false,
2026-08-28T09:54:48.2594500Z           "evidence": []
2026-08-28T09:54:48.2594759Z         },
2026-08-28T09:54:48.2595023Z         "unit": {
2026-08-28T09:54:48.2595305Z           "complete": true,
2026-08-28T09:54:48.2595582Z           "evidence": [
2026-08-28T09:54:48.2595830Z             {
2026-08-28T09:54:48.2596244Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.2596517Z               "line": 2423
2026-08-28T09:54:48.2596779Z             },
2026-08-28T09:54:48.2597033Z             {
2026-08-28T09:54:48.2597385Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.2597655Z               "line": 2433
2026-08-28T09:54:48.2597915Z             }
2026-08-28T09:54:48.2598173Z           ]
2026-08-28T09:54:48.2598426Z         }
2026-08-28T09:54:48.2598683Z       }
2026-08-28T09:54:48.2598927Z     },
2026-08-28T09:54:48.2599280Z     {
2026-08-28T09:54:48.2599633Z       "id": "REQ-SEAM-PSYCHE",
2026-08-28T09:54:48.2600065Z       "title": "spawn-psyche seam (fresh + resume templates)",
2026-08-28T09:54:48.2600358Z       "requiredStages": [
2026-08-28T09:54:48.2600616Z         "impl",
2026-08-28T09:54:48.2600878Z         "unit",
2026-08-28T09:54:48.2601135Z         "int"
2026-08-28T09:54:48.2601392Z       ],
2026-08-28T09:54:48.2601651Z       "stages": {
2026-08-28T09:54:48.2601913Z         "doc": {
2026-08-28T09:54:48.2602199Z           "complete": false,
2026-08-28T09:54:48.2602481Z           "evidence": []
2026-08-28T09:54:48.2602739Z         },
2026-08-28T09:54:48.2602998Z         "impl": {
2026-08-28T09:54:48.2603294Z           "complete": true,
2026-08-28T09:54:48.2603571Z           "evidence": [
2026-08-28T09:54:48.2603828Z             {
2026-08-28T09:54:48.2604181Z               "path": "crates/spt-live/src/psyche.rs",
2026-08-28T09:54:48.2604453Z               "line": 11
2026-08-28T09:54:48.2604707Z             },
2026-08-28T09:54:48.2604968Z             {
2026-08-28T09:54:48.2605315Z               "path": "crates/spt/src/api/live.rs",
2026-08-28T09:54:48.2605574Z               "line": 12
2026-08-28T09:54:48.2605823Z             },
2026-08-28T09:54:48.2606066Z             {
2026-08-28T09:54:48.2606410Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.2606691Z               "line": 825
2026-08-28T09:54:48.2606949Z             }
2026-08-28T09:54:48.2607201Z           ]
2026-08-28T09:54:48.2607463Z         },
2026-08-28T09:54:48.2607807Z         "int": {
2026-08-28T09:54:48.2608082Z           "complete": true,
2026-08-28T09:54:48.2608361Z           "evidence": [
2026-08-28T09:54:48.2608614Z             {
2026-08-28T09:54:48.2609057Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:48.2609329Z               "line": 244
2026-08-28T09:54:48.2609591Z             }
2026-08-28T09:54:48.2609840Z           ]
2026-08-28T09:54:48.2610107Z         },
2026-08-28T09:54:48.2610368Z         "unit": {
2026-08-28T09:54:48.2610649Z           "complete": true,
2026-08-28T09:54:48.2610918Z           "evidence": [
2026-08-28T09:54:48.2611228Z             {
2026-08-28T09:54:48.2611581Z               "path": "crates/spt-live/src/pulse.rs",
2026-08-28T09:54:48.2611853Z               "line": 106
2026-08-28T09:54:48.2612110Z             },
2026-08-28T09:54:48.2612364Z             {
2026-08-28T09:54:48.2612721Z               "path": "crates/spt-live/src/pulse.rs",
2026-08-28T09:54:48.2612998Z               "line": 137
2026-08-28T09:54:48.2613260Z             },
2026-08-28T09:54:48.2613520Z             {
2026-08-28T09:54:48.2613863Z               "path": "crates/spt-live/src/pulse.rs",
2026-08-28T09:54:48.2614140Z               "line": 232
2026-08-28T09:54:48.2614393Z             }
2026-08-28T09:54:48.2614651Z           ]
2026-08-28T09:54:48.2614909Z         }
2026-08-28T09:54:48.2615165Z       }
2026-08-28T09:54:48.2615408Z     },
2026-08-28T09:54:48.2615653Z     {
2026-08-28T09:54:48.2615947Z       "id": "REQ-SEAM-RESUME",
2026-08-28T09:54:48.2616507Z       "title": "resume-session seam (fresh-with-preload / continue-existing)",
2026-08-28T09:54:48.2616802Z       "requiredStages": [],
2026-08-28T09:54:48.2617064Z       "stages": {
2026-08-28T09:54:48.2617313Z         "doc": {
2026-08-28T09:54:48.2617585Z           "complete": false,
2026-08-28T09:54:48.2617862Z           "evidence": []
2026-08-28T09:54:48.2618120Z         },
2026-08-28T09:54:48.2618381Z         "impl": {
2026-08-28T09:54:48.2618738Z           "complete": false,
2026-08-28T09:54:48.2619083Z           "evidence": []
2026-08-28T09:54:48.2619340Z         },
2026-08-28T09:54:48.2619593Z         "int": {
2026-08-28T09:54:48.2619880Z           "complete": false,
2026-08-28T09:54:48.2620151Z           "evidence": []
2026-08-28T09:54:48.2620415Z         },
2026-08-28T09:54:48.2620672Z         "unit": {
2026-08-28T09:54:48.2620953Z           "complete": false,
2026-08-28T09:54:48.2621228Z           "evidence": []
2026-08-28T09:54:48.2621493Z         }
2026-08-28T09:54:48.2621831Z       }
2026-08-28T09:54:48.2622080Z     },
2026-08-28T09:54:48.2622337Z     {
2026-08-28T09:54:48.2622629Z       "id": "REQ-SEAM-SPAWN",
2026-08-28T09:54:48.2622944Z       "title": "spawn-session seam",
2026-08-28T09:54:48.2623234Z       "requiredStages": [
2026-08-28T09:54:48.2623495Z         "impl",
2026-08-28T09:54:48.2623762Z         "unit"
2026-08-28T09:54:48.2624014Z       ],
2026-08-28T09:54:48.2624282Z       "stages": {
2026-08-28T09:54:48.2624544Z         "doc": {
2026-08-28T09:54:48.2624825Z           "complete": false,
2026-08-28T09:54:48.2625096Z           "evidence": []
2026-08-28T09:54:48.2625358Z         },
2026-08-28T09:54:48.2625616Z         "impl": {
2026-08-28T09:54:48.2625893Z           "complete": true,
2026-08-28T09:54:48.2626170Z           "evidence": [
2026-08-28T09:54:48.2626421Z             {
2026-08-28T09:54:48.2626795Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2627062Z               "line": 20
2026-08-28T09:54:48.2627324Z             }
2026-08-28T09:54:48.2627577Z           ]
2026-08-28T09:54:48.2627830Z         },
2026-08-28T09:54:48.2628107Z         "int": {
2026-08-28T09:54:48.2628394Z           "complete": false,
2026-08-28T09:54:48.2628666Z           "evidence": []
2026-08-28T09:54:48.2628917Z         },
2026-08-28T09:54:48.2629264Z         "unit": {
2026-08-28T09:54:48.2629538Z           "complete": true,
2026-08-28T09:54:48.2629820Z           "evidence": [
2026-08-28T09:54:48.2630083Z             {
2026-08-28T09:54:48.2630454Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2630802Z               "line": 1135
2026-08-28T09:54:48.2631064Z             },
2026-08-28T09:54:48.2631318Z             {
2026-08-28T09:54:48.2631684Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2631955Z               "line": 1142
2026-08-28T09:54:48.2632215Z             },
2026-08-28T09:54:48.2632477Z             {
2026-08-28T09:54:48.2632845Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2633126Z               "line": 1679
2026-08-28T09:54:48.2633383Z             },
2026-08-28T09:54:48.2633702Z             {
2026-08-28T09:54:48.2634075Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2634356Z               "line": 1685
2026-08-28T09:54:48.2634617Z             },
2026-08-28T09:54:48.2634871Z             {
2026-08-28T09:54:48.2635242Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2635519Z               "line": 1710
2026-08-28T09:54:48.2635776Z             },
2026-08-28T09:54:48.2636029Z             {
2026-08-28T09:54:48.2636397Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.2636663Z               "line": 1747
2026-08-28T09:54:48.2636919Z             }
2026-08-28T09:54:48.2637179Z           ]
2026-08-28T09:54:48.2637433Z         }
2026-08-28T09:54:48.2637685Z       }
2026-08-28T09:54:48.2637942Z     },
2026-08-28T09:54:48.2638208Z     {
2026-08-28T09:54:48.2638513Z       "id": "REQ-SEAM-UPDATE",
2026-08-28T09:54:48.2639091Z       "title": "Adapter-update avenue (file-pull / delegated command)",
2026-08-28T09:54:48.2639387Z       "requiredStages": [
2026-08-28T09:54:48.2639654Z         "impl",
2026-08-28T09:54:48.2639919Z         "unit"
2026-08-28T09:54:48.2640170Z       ],
2026-08-28T09:54:48.2640432Z       "stages": {
2026-08-28T09:54:48.2640681Z         "doc": {
2026-08-28T09:54:48.2640962Z           "complete": false,
2026-08-28T09:54:48.2641290Z           "evidence": []
2026-08-28T09:54:48.2641554Z         },
2026-08-28T09:54:48.2641811Z         "impl": {
2026-08-28T09:54:48.2642098Z           "complete": true,
2026-08-28T09:54:48.2642372Z           "evidence": [
2026-08-28T09:54:48.2642627Z             {
2026-08-28T09:54:48.2643027Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.2643289Z               "line": 28
2026-08-28T09:54:48.2643553Z             },
2026-08-28T09:54:48.2643805Z             {
2026-08-28T09:54:48.2644211Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.2644535Z               "line": 88
2026-08-28T09:54:48.2644792Z             }
2026-08-28T09:54:48.2645056Z           ]
2026-08-28T09:54:48.2645306Z         },
2026-08-28T09:54:48.2645568Z         "int": {
2026-08-28T09:54:48.2645849Z           "complete": false,
2026-08-28T09:54:48.2646126Z           "evidence": []
2026-08-28T09:54:48.2646379Z         },
2026-08-28T09:54:48.2646647Z         "unit": {
2026-08-28T09:54:48.2646928Z           "complete": true,
2026-08-28T09:54:48.2647209Z           "evidence": [
2026-08-28T09:54:48.2647550Z             {
2026-08-28T09:54:48.2647940Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.2648212Z               "line": 332
2026-08-28T09:54:48.2648454Z             },
2026-08-28T09:54:48.2648707Z             {
2026-08-28T09:54:48.2649185Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.2649466Z               "line": 343
2026-08-28T09:54:48.2649722Z             }
2026-08-28T09:54:48.2649975Z           ]
2026-08-28T09:54:48.2650242Z         }
2026-08-28T09:54:48.2650494Z       }
2026-08-28T09:54:48.2650754Z     },
2026-08-28T09:54:48.2651006Z     {
2026-08-28T09:54:48.2651326Z       "id": "REQ-SEAT-LIFETIME-BOUNDED",
2026-08-28T09:54:48.2660873Z       "title": "REGISTRY-LIFECYCLE W1 (ADR-0040 decision 5, hertz defect B leg 5 CROSS-FAMILY per the final attribution correction — my_stream_subs releases only at conn-loop exit, NO unsubscribe verb existed, ~546/589 broker threads were unnamed parked SubscriberSeat writers on completed Registry/sync/update seats): new KIND_NET_STREAM_UNSUBSCRIBE broker verb removes the SubscriberSeat, stops AND JOINS its writer thread, drops its cursor; every dispatch worker calls it on serve completion (ALL families, success or failure); the retire sweep calls it for retired rows. N-1: unknown-kind on an older broker = tolerated send_error path, caller best-effort. Rider: spawned daemon threads NAMED (SubscriberSeat writer sub-writer-s<id> minimum, conn accept handlers) — field censuses attribute, not infer. Gate: impl — verb + worker/sweep call sites + thread naming; unit — unsubscribe removes seat/joins writer/drops cursor + idempotent + unknown-stream tolerated; int — rides REQ-HAZARD-REGISTRY-STALL seam (physical seat/thread counts plateau CROSS-FAMILY after completion); doc — ADR-0040.",
2026-08-28T09:54:48.2661334Z       "requiredStages": [
2026-08-28T09:54:48.2661605Z         "doc",
2026-08-28T09:54:48.2661867Z         "impl",
2026-08-28T09:54:48.2662125Z         "unit",
2026-08-28T09:54:48.2662387Z         "int"
2026-08-28T09:54:48.2662641Z       ],
2026-08-28T09:54:48.2662918Z       "stages": {
2026-08-28T09:54:48.2663174Z         "doc": {
2026-08-28T09:54:48.2663464Z           "complete": true,
2026-08-28T09:54:48.2663734Z           "evidence": [
2026-08-28T09:54:48.2664001Z             {
2026-08-28T09:54:48.2664625Z               "path": "docs/adr/0040-bounded-stream-seat-lifecycle-one-way-terminal.md",
2026-08-28T09:54:48.2664931Z               "line": 72
2026-08-28T09:54:48.2665193Z             }
2026-08-28T09:54:48.2665455Z           ]
2026-08-28T09:54:48.2665717Z         },
2026-08-28T09:54:48.2665979Z         "impl": {
2026-08-28T09:54:48.2666269Z           "complete": true,
2026-08-28T09:54:48.2666542Z           "evidence": [
2026-08-28T09:54:48.2666804Z             {
2026-08-28T09:54:48.2667166Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.2667513Z               "line": 2113
2026-08-28T09:54:48.2667786Z             },
2026-08-28T09:54:48.2668030Z             {
2026-08-28T09:54:48.2668397Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2668671Z               "line": 5448
2026-08-28T09:54:48.2668930Z             },
2026-08-28T09:54:48.2669284Z             {
2026-08-28T09:54:48.2669652Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2669923Z               "line": 6027
2026-08-28T09:54:48.2670180Z             },
2026-08-28T09:54:48.2670490Z             {
2026-08-28T09:54:48.2670848Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2671124Z               "line": 8689
2026-08-28T09:54:48.2671381Z             },
2026-08-28T09:54:48.2671638Z             {
2026-08-28T09:54:48.2671999Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2672280Z               "line": 9254
2026-08-28T09:54:48.2672543Z             },
2026-08-28T09:54:48.2672795Z             {
2026-08-28T09:54:48.2673168Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2673434Z               "line": 1242
2026-08-28T09:54:48.2673691Z             },
2026-08-28T09:54:48.2673948Z             {
2026-08-28T09:54:48.2674313Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.2674580Z               "line": 1252
2026-08-28T09:54:48.2674833Z             },
2026-08-28T09:54:48.2675091Z             {
2026-08-28T09:54:48.2675433Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2675705Z               "line": 219
2026-08-28T09:54:48.2675962Z             },
2026-08-28T09:54:48.2676239Z             {
2026-08-28T09:54:48.2676568Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2676844Z               "line": 872
2026-08-28T09:54:48.2677087Z             },
2026-08-28T09:54:48.2677344Z             {
2026-08-28T09:54:48.2677712Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2677984Z               "line": 204
2026-08-28T09:54:48.2678313Z             },
2026-08-28T09:54:48.2678565Z             {
2026-08-28T09:54:48.2678933Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2679288Z               "line": 249
2026-08-28T09:54:48.2679549Z             },
2026-08-28T09:54:48.2679801Z             {
2026-08-28T09:54:48.2680153Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2680425Z               "line": 610
2026-08-28T09:54:48.2680679Z             },
2026-08-28T09:54:48.2680941Z             {
2026-08-28T09:54:48.2681293Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2681622Z               "line": 1983
2026-08-28T09:54:48.2681876Z             },
2026-08-28T09:54:48.2682136Z             {
2026-08-28T09:54:48.2682497Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2682764Z               "line": 2027
2026-08-28T09:54:48.2683025Z             },
2026-08-28T09:54:48.2683278Z             {
2026-08-28T09:54:48.2683641Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2683908Z               "line": 2052
2026-08-28T09:54:48.2684165Z             },
2026-08-28T09:54:48.2684415Z             {
2026-08-28T09:54:48.2684778Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2685059Z               "line": 2199
2026-08-28T09:54:48.2685311Z             },
2026-08-28T09:54:48.2685568Z             {
2026-08-28T09:54:48.2685946Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.2686222Z               "line": 365
2026-08-28T09:54:48.2686479Z             },
2026-08-28T09:54:48.2686732Z             {
2026-08-28T09:54:48.2687070Z               "path": "crates/spt-daemon/src/sync.rs",
2026-08-28T09:54:48.2687333Z               "line": 356
2026-08-28T09:54:48.2687594Z             }
2026-08-28T09:54:48.2687842Z           ]
2026-08-28T09:54:48.2688104Z         },
2026-08-28T09:54:48.2688423Z         "int": {
2026-08-28T09:54:48.2688724Z           "complete": true,
2026-08-28T09:54:48.2689077Z           "evidence": [
2026-08-28T09:54:48.2689339Z             {
2026-08-28T09:54:48.2689777Z               "path": "crates/spt-daemon/tests/registry_lifecycle.rs",
2026-08-28T09:54:48.2690051Z               "line": 164
2026-08-28T09:54:48.2690318Z             }
2026-08-28T09:54:48.2690567Z           ]
2026-08-28T09:54:48.2690820Z         },
2026-08-28T09:54:48.2691082Z         "unit": {
2026-08-28T09:54:48.2691372Z           "complete": true,
2026-08-28T09:54:48.2691707Z           "evidence": [
2026-08-28T09:54:48.2691973Z             {
2026-08-28T09:54:48.2692341Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2692620Z               "line": 3263
2026-08-28T09:54:48.2692875Z             },
2026-08-28T09:54:48.2693129Z             {
2026-08-28T09:54:48.2693500Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2693778Z               "line": 3305
2026-08-28T09:54:48.2694030Z             }
2026-08-28T09:54:48.2694283Z           ]
2026-08-28T09:54:48.2694544Z         }
2026-08-28T09:54:48.2694797Z       }
2026-08-28T09:54:48.2695045Z     },
2026-08-28T09:54:48.2695302Z     {
2026-08-28T09:54:48.2695581Z       "id": "REQ-SEC-1",
2026-08-28T09:54:48.2696855Z       "title": "Per-endpoint access whitelist: origin-node gate, stateful-firewall (reply/outbound exempt), node-now/user-later, outer gate before grants",
2026-08-28T09:54:48.2697140Z       "requiredStages": [
2026-08-28T09:54:48.2697402Z         "impl",
2026-08-28T09:54:48.2697659Z         "unit",
2026-08-28T09:54:48.2697917Z         "doc"
2026-08-28T09:54:48.2698174Z       ],
2026-08-28T09:54:48.2698455Z       "stages": {
2026-08-28T09:54:48.2698712Z         "doc": {
2026-08-28T09:54:48.2699070Z           "complete": true,
2026-08-28T09:54:48.2699356Z           "evidence": [
2026-08-28T09:54:48.2699609Z             {
2026-08-28T09:54:48.2700010Z               "path": "docs-site/src/networking/knocking.md",
2026-08-28T09:54:48.2700280Z               "line": 115
2026-08-28T09:54:48.2700611Z             }
2026-08-28T09:54:48.2700874Z           ]
2026-08-28T09:54:48.2701132Z         },
2026-08-28T09:54:48.2701390Z         "impl": {
2026-08-28T09:54:48.2701666Z           "complete": true,
2026-08-28T09:54:48.2701947Z           "evidence": [
2026-08-28T09:54:48.2702199Z             {
2026-08-28T09:54:48.2702553Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2702819Z               "line": 281
2026-08-28T09:54:48.2703081Z             },
2026-08-28T09:54:48.2703342Z             {
2026-08-28T09:54:48.2703689Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.2704018Z               "line": 2271
2026-08-28T09:54:48.2704271Z             },
2026-08-28T09:54:48.2704523Z             {
2026-08-28T09:54:48.2704882Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.2705158Z               "line": 2297
2026-08-28T09:54:48.2705415Z             },
2026-08-28T09:54:48.2705671Z             {
2026-08-28T09:54:48.2706021Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:48.2706284Z               "line": 189
2026-08-28T09:54:48.2706537Z             },
2026-08-28T09:54:48.2706785Z             {
2026-08-28T09:54:48.2707134Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:48.2707405Z               "line": 372
2026-08-28T09:54:48.2707662Z             },
2026-08-28T09:54:48.2707924Z             {
2026-08-28T09:54:48.2708258Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:48.2708572Z               "line": 386
2026-08-28T09:54:48.2708824Z             },
2026-08-28T09:54:48.2709158Z             {
2026-08-28T09:54:48.2709496Z               "path": "crates/spt-store/src/gate.rs",
2026-08-28T09:54:48.2709773Z               "line": 605
2026-08-28T09:54:48.2710021Z             },
2026-08-28T09:54:48.2710285Z             {
2026-08-28T09:54:48.2710599Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2710945Z               "line": 15519
2026-08-28T09:54:48.2711205Z             }
2026-08-28T09:54:48.2711453Z           ]
2026-08-28T09:54:48.2711710Z         },
2026-08-28T09:54:48.2711964Z         "int": {
2026-08-28T09:54:48.2712255Z           "complete": true,
2026-08-28T09:54:48.2712517Z           "evidence": [
2026-08-28T09:54:48.2712778Z             {
2026-08-28T09:54:48.2713147Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.2713413Z               "line": 1570
2026-08-28T09:54:48.2713674Z             },
2026-08-28T09:54:48.2713982Z             {
2026-08-28T09:54:48.2714372Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.2714644Z               "line": 2848
2026-08-28T09:54:48.2714893Z             }
2026-08-28T09:54:48.2715141Z           ]
2026-08-28T09:54:48.2715404Z         },
2026-08-28T09:54:48.2715665Z         "unit": {
2026-08-28T09:54:48.2715941Z           "complete": true,
2026-08-28T09:54:48.2716221Z           "evidence": [
2026-08-28T09:54:48.2716478Z             {
2026-08-28T09:54:48.2716835Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:48.2717101Z               "line": 323
2026-08-28T09:54:48.2717360Z             },
2026-08-28T09:54:48.2717612Z             {
2026-08-28T09:54:48.2717970Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:48.2718251Z               "line": 501
2026-08-28T09:54:48.2718537Z             },
2026-08-28T09:54:48.2718789Z             {
2026-08-28T09:54:48.2719241Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:48.2719517Z               "line": 834
2026-08-28T09:54:48.2719770Z             },
2026-08-28T09:54:48.2720028Z             {
2026-08-28T09:54:48.2720390Z               "path": "crates/spt-daemon/tests/access.rs",
2026-08-28T09:54:48.2720657Z               "line": 138
2026-08-28T09:54:48.2720915Z             },
2026-08-28T09:54:48.2721164Z             {
2026-08-28T09:54:48.2721520Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.2721856Z               "line": 4406
2026-08-28T09:54:48.2722113Z             },
2026-08-28T09:54:48.2722365Z             {
2026-08-28T09:54:48.2722719Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.2722990Z               "line": 4436
2026-08-28T09:54:48.2723239Z             },
2026-08-28T09:54:48.2723491Z             {
2026-08-28T09:54:48.2723839Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.2724112Z               "line": 4460
2026-08-28T09:54:48.2724368Z             },
2026-08-28T09:54:48.2724823Z             {
2026-08-28T09:54:48.2725218Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2725481Z               "line": 30999
2026-08-28T09:54:48.2725748Z             }
2026-08-28T09:54:48.2726011Z           ]
2026-08-28T09:54:48.2726345Z         }
2026-08-28T09:54:48.2726707Z       }
2026-08-28T09:54:48.2727090Z     },
2026-08-28T09:54:48.2727461Z     {
2026-08-28T09:54:48.2728010Z       "id": "REQ-SEC-REPLY-EXEMPTION-SEND-LEG",
2026-08-28T09:54:48.2759681Z       "title": "THE REPLY EXEMPTION HAS A SENDING LEG, AND IT IS WIRED AT THE TRANSMISSION CHOKEPOINT RATHER THAN AT ANY CALLER. REQ-SEC-1's stateful firewall is a JOIN of two halves: the receiving leg classifies an inbound against the recent-outbound log (`classify_inbound`), and something must WRITE that log. It shipped with only the reading half live -- `note_outbound` existed, was `pub`, was re-exported, and had a passing unit test, while the whole `crates/` tree held ZERO production call sites (releases#166, confirmed at main@8248bc3: two callers, both tests). `RecentOutbound` was therefore never written in the field, every inbound classified `Unsolicited`, and a genuine reply to a closed-posture endpoint bounced -- the requirement was STRUCTURALLY INERT while reading fully covered. THE WRITE SITE IS `wan::request_wan`, THE ONE SEAM EVERY WAN MESSAGE CROSSES, NOT `wan_send_with` OR ANY OTHER CALLER: a per-caller write is a rule satisfied by remembering to, and the same forgetting is what made the first implementation inert; the chokepoint also puts both halves of the join in one file, where a future reader cannot change one without seeing the other. THREE THINGS THE ROW MUST GET RIGHT, EACH THE PROVABLE FIELD RATHER THAN THE CONVENIENT ONE. (1) THE ENDPOINT IS THE DAEMON-STAMPED `sender_proven`, NEVER `msg.from`: `from` is reply-routing metadata an explicit `--from` owns (KNOWN-HAZARDS 7.5), so a row keyed on it would let any local caller open a 15-minute inbound hole for an endpoint it merely NAMED -- the same reasoning that already keeps `from` out of the access chain's tier 1 and out of the contact ledger. An UNSTAMPED send records NOTHING: `session_proven_sender` stamps only after resolving the id to a real local perch, so the stamp is exactly the proof that the sending id can RECEIVE, and an id that cannot receive cannot be replied to. (2) THE NODE IS THE CONNECTION'S HANDSHAKE-PROVEN `remote_id_hex`, NEVER THE NODE RESOLUTION CLAIMED: the receiving leg keys the gate on the proven origin (REQ-HAZARD-WAN-ORIGIN-AUTH), and a correlation whose two halves keyed on different notions of `node` would silently fail to meet under exactly the stale-gossip conditions the registry is stale-tolerant by contract about. (3) ONLY A CUSTODY-CONFIRMED ROUND-TRIP RECORDS -- delivered, spooled, or duplicate, the same set that earns `SENT(WAN)`. A refusal must not write (their gate closed; a row would open OURS to a node that just refused us), a no-perch must not write (nobody is there to answer), and an UNCONFIRMED hop must not write even though an N-1 receiver may genuinely reply: an exemption is a WIDENED ADMIT VERDICT, so an unconfirmed hop failing closed costs one reply its exemption while the opposite direction grants a hole on a guess. Gate: impl -- the wire-in at `request_wan`, taking the dialed `NetDialed` rather than a bare conn id so the proven node is in hand, plus the split-out decision the units drive; unit -- the decision table: each custody outcome records and each non-custody outcome records nothing (all six named, so a widened set cannot pass), an unstamped send records nothing beside a stamped one that does (with `from` populated in the unstamped arm, so a fallback to it fails the assertion rather than passing it), and THE ROW IS THE KEY THE RECEIVING LEG READS -- the real write followed by the real `classify_inbound`, correlating on the recorded (endpoint, node) pair while a DIFFERENT local endpoint and a DIFFERENT origin node each stay `Unsolicited`; that meeting is the property whose absence made the requirement inert, and asserting the write alone would not have caught it. The proven-node half is COMPILE-ENFORCED rather than asserted: the seam takes the dialed `NetDialed`, so the resolved-node string the caller also holds is not in reach at the write site. int -- THE JOIN, not the parts: a REAL cross-node send from A to B, then B's reply reaching A's CLOSED-posture endpoint and passing with `PassReason::ReplyExemption`, with the same reply REFUSED in the un-sent control arm.",
2026-08-28T09:54:48.2760291Z       "requiredStages": [
2026-08-28T09:54:48.2760545Z         "impl",
2026-08-28T09:54:48.2760807Z         "unit",
2026-08-28T09:54:48.2761068Z         "int"
2026-08-28T09:54:48.2761315Z       ],
2026-08-28T09:54:48.2761578Z       "stages": {
2026-08-28T09:54:48.2761830Z         "doc": {
2026-08-28T09:54:48.2762122Z           "complete": false,
2026-08-28T09:54:48.2762407Z           "evidence": []
2026-08-28T09:54:48.2762660Z         },
2026-08-28T09:54:48.2762917Z         "impl": {
2026-08-28T09:54:48.2763213Z           "complete": true,
2026-08-28T09:54:48.2763504Z           "evidence": [
2026-08-28T09:54:48.2763755Z             {
2026-08-28T09:54:48.2764102Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2764378Z               "line": 231
2026-08-28T09:54:48.2764640Z             },
2026-08-28T09:54:48.2764887Z             {
2026-08-28T09:54:48.2765240Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2765560Z               "line": 282
2026-08-28T09:54:48.2765823Z             },
2026-08-28T09:54:48.2766080Z             {
2026-08-28T09:54:48.2766418Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2766693Z               "line": 322
2026-08-28T09:54:48.2766949Z             }
2026-08-28T09:54:48.2767206Z           ]
2026-08-28T09:54:48.2767464Z         },
2026-08-28T09:54:48.2767731Z         "int": {
2026-08-28T09:54:48.2768007Z           "complete": true,
2026-08-28T09:54:48.2768285Z           "evidence": [
2026-08-28T09:54:48.2768586Z             {
2026-08-28T09:54:48.2769027Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.2769311Z               "line": 1570
2026-08-28T09:54:48.2769564Z             },
2026-08-28T09:54:48.2769822Z             {
2026-08-28T09:54:48.2770198Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.2770471Z               "line": 2848
2026-08-28T09:54:48.2770737Z             }
2026-08-28T09:54:48.2770989Z           ]
2026-08-28T09:54:48.2771314Z         },
2026-08-28T09:54:48.2771590Z         "unit": {
2026-08-28T09:54:48.2775949Z           "complete": true,
2026-08-28T09:54:48.2776260Z           "evidence": [
2026-08-28T09:54:48.2776518Z             {
2026-08-28T09:54:48.2776870Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2777144Z               "line": 2079
2026-08-28T09:54:48.2777399Z             },
2026-08-28T09:54:48.2777653Z             {
2026-08-28T09:54:48.2778009Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2778292Z               "line": 2120
2026-08-28T09:54:48.2778554Z             },
2026-08-28T09:54:48.2778812Z             {
2026-08-28T09:54:48.2779259Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.2779535Z               "line": 2155
2026-08-28T09:54:48.2779788Z             }
2026-08-28T09:54:48.2780043Z           ]
2026-08-28T09:54:48.2780295Z         }
2026-08-28T09:54:48.2780557Z       }
2026-08-28T09:54:48.2780811Z     },
2026-08-28T09:54:48.2781164Z     {
2026-08-28T09:54:48.2781520Z       "id": "REQ-SELF-ADDR-REBIND-READVERTISE",
2026-08-28T09:54:48.2792053Z       "title": "WAN-TRUTH #40 F4: when this node's live endpoint address changes — a rebind to a new port after a restart, the everyday shape behind the incident's dead Jul-18 port — it re-authors its own roster self-entry with the new address immediately, rather than waiting for a peer to dial in and trigger the exchange provider. A node whose address changed is exactly the node peers can no longer reach, so making propagation depend on an inbound connection is the wrong direction of dependency; the local roster row is refreshed at once (so any exchange, in either direction, serves the current address) and the advertise wake is set so the next pump round pushes it. The re-authored entry carries a strictly-greater lease, which is only sound once REQ-ROSTER-SELF-LEASE-HEAL guarantees the counter is above the fleet's ceiling — F4 is the propagation half of the same field failure, F1 the ordering half. Gate: impl — the address-change detection against the last-advertised self row, the re-author, and the advertise wake; unit — a changed address re-authors the self row with a strictly-greater lease and sets the wake, an unchanged address does neither (no advertise storm), and a null/unbound address is never advertised.",
2026-08-28T09:54:48.2792492Z       "requiredStages": [
2026-08-28T09:54:48.2792758Z         "impl",
2026-08-28T09:54:48.2793010Z         "unit"
2026-08-28T09:54:48.2793278Z       ],
2026-08-28T09:54:48.2793540Z       "stages": {
2026-08-28T09:54:48.2793812Z         "doc": {
2026-08-28T09:54:48.2794092Z           "complete": false,
2026-08-28T09:54:48.2794373Z           "evidence": []
2026-08-28T09:54:48.2794631Z         },
2026-08-28T09:54:48.2794888Z         "impl": {
2026-08-28T09:54:48.2795170Z           "complete": true,
2026-08-28T09:54:48.2795681Z           "evidence": [
2026-08-28T09:54:48.2796015Z             {
2026-08-28T09:54:48.2796384Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.2796659Z               "line": 1368
2026-08-28T09:54:48.2796916Z             },
2026-08-28T09:54:48.2797164Z             {
2026-08-28T09:54:48.2797536Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.2797803Z               "line": 1422
2026-08-28T09:54:48.2798056Z             }
2026-08-28T09:54:48.2798308Z           ]
2026-08-28T09:54:48.2798568Z         },
2026-08-28T09:54:48.2798829Z         "int": {
2026-08-28T09:54:48.2799288Z           "complete": false,
2026-08-28T09:54:48.2799570Z           "evidence": []
2026-08-28T09:54:48.2799826Z         },
2026-08-28T09:54:48.2800089Z         "unit": {
2026-08-28T09:54:48.2800365Z           "complete": true,
2026-08-28T09:54:48.2800637Z           "evidence": [
2026-08-28T09:54:48.2800888Z             {
2026-08-28T09:54:48.2801259Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.2801545Z               "line": 2603
2026-08-28T09:54:48.2801798Z             }
2026-08-28T09:54:48.2802064Z           ]
2026-08-28T09:54:48.2802317Z         }
2026-08-28T09:54:48.2802569Z       }
2026-08-28T09:54:48.2802823Z     },
2026-08-28T09:54:48.2803081Z     {
2026-08-28T09:54:48.2803410Z       "id": "REQ-SELF-DETECT-PARENT-PID",
2026-08-28T09:54:48.2817054Z       "title": "E-1 (REMOTE-TRUTH triage §E-1 #7): self-detect leg (c) — the pid-ancestry fallback — ALSO candidates on `rec.parent_pid` (the harness pid, CONTEXT's 'stable session-binding anchor', stamped at bind), not `rec.pid` alone. ROOT: for an spt-hosted endpoint (broker PTY, headless) `rec.pid` is the ephemeral bind-CLI pid, ALREADY DEAD by send time (the F-026 #11 dead-pid class, field-sighted on hall-bf) — never in any sender's ancestry and alive-gated out — so an spt-hosted sender could NEVER resolve self via leg (c): its messages were from-stamped `cli@NODE` (operator #7) and replies bounced NO_PERCH. FIX: detect_self_by_ancestry pushes a second candidate (id, parent_pid) when `rec.parent_pid` is Some + alive; the pure nearest-first matcher (match_self_by_ancestry) is unchanged. LABEL-ONLY, exactly like the rest of leg (c): from-label/routing default, NEVER authentication — authenticate() untouched, the pid-ancestry-for-auth question stays parked (KH 7.3/7.5 separation holds; a wrong label self-corrects, a wrong grant does not). Env legs (a)/(b) stay first. Red-first int (the triage-specified missing test): rec.pid = dead sibling + rec.parent_pid = genuine live ancestor → self resolves (pre-fix None); ancestry-gate control: live-but-non-ancestor parent_pid must NOT resolve. Rider (same cluster, activated separately once doyle rules the fix shape): F-026 #11 dead-pid itself — rec.pid should hold something that stays true, or liveness readers stop trusting it. Cross-node from-stamp proof (spt-hosted B-side sender arrives at A as `<id>@node`, not `cli@node`) rides the [twohost] rig wave rung.",
2026-08-28T09:54:48.2817546Z       "requiredStages": [
2026-08-28T09:54:48.2817818Z         "impl",
2026-08-28T09:54:48.2818084Z         "int"
2026-08-28T09:54:48.2818342Z       ],
2026-08-28T09:54:48.2818609Z       "stages": {
2026-08-28T09:54:48.2818866Z         "doc": {
2026-08-28T09:54:48.2819233Z           "complete": false,
2026-08-28T09:54:48.2819503Z           "evidence": []
2026-08-28T09:54:48.2819760Z         },
2026-08-28T09:54:48.2820017Z         "impl": {
2026-08-28T09:54:48.2820307Z           "complete": true,
2026-08-28T09:54:48.2820579Z           "evidence": [
2026-08-28T09:54:48.2820875Z             {
2026-08-28T09:54:48.2821199Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:48.2821466Z               "line": 274
2026-08-28T09:54:48.2821715Z             }
2026-08-28T09:54:48.2821961Z           ]
2026-08-28T09:54:48.2822206Z         },
2026-08-28T09:54:48.2822460Z         "int": {
2026-08-28T09:54:48.2822732Z           "complete": true,
2026-08-28T09:54:48.2822999Z           "evidence": [
2026-08-28T09:54:48.2823318Z             {
2026-08-28T09:54:48.2823642Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:48.2823920Z               "line": 499
2026-08-28T09:54:48.2824177Z             },
2026-08-28T09:54:48.2824434Z             {
2026-08-28T09:54:48.2824742Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:48.2825015Z               "line": 526
2026-08-28T09:54:48.2825268Z             },
2026-08-28T09:54:48.2825516Z             {
2026-08-28T09:54:48.2825878Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:48.2826150Z               "line": 1142
2026-08-28T09:54:48.2826456Z             }
2026-08-28T09:54:48.2826712Z           ]
2026-08-28T09:54:48.2826964Z         },
2026-08-28T09:54:48.2827224Z         "unit": {
2026-08-28T09:54:48.2827496Z           "complete": false,
2026-08-28T09:54:48.2827773Z           "evidence": []
2026-08-28T09:54:48.2828025Z         }
2026-08-28T09:54:48.2828282Z       }
2026-08-28T09:54:48.2828535Z     },
2026-08-28T09:54:48.2828811Z     {
2026-08-28T09:54:48.2829245Z       "id": "REQ-SELF-ENDPOINT-ADDR-SURFACE",
2026-08-28T09:54:48.2840967Z       "title": "WAN-TRUTH #41 leg 2: this node OWN dialable address -- id, direct paths, and the relay it is actually homed on -- is reported by spt daemon status and its --json twin. The home relay reached no surface at all before this: the fleet homed onto iroh-canary relays while daemon.json still declared N0Default, and nothing an operator could run would contradict the config file. The value is therefore read off the LIVE endpoint (the broker net-status reply, which already carried it unconsumed), never echoed from configuration -- a line that restates config would have agreed with the wrong answer. No relay advertised is a reported state, not an absence of one, and an unparseable or unknown address shape degrades to that rather than failing the status read. Distinguish from REQ-PUMP-STAGE-TRUTH, which reports whether we can reach OTHER nodes; this reports what we advertise about OURSELVES. Gate: impl -- the relay accessor over the opaque EndpointAddr JSON, the status --json fields (self_addr, home_relay, node_id_hex, all additive), and the human status line; unit -- the accessor is proved against a REAL serialized EndpointAddr rather than a hand-written fixture (this repo existing opaque-addr fixtures spell paths as bare strings, which iroh does not emit, so a fixture-verified accessor would return no relay for every node in the field), a relay-less address reports no relay, and junk degrades without panicking.",
2026-08-28T09:54:48.2841347Z       "requiredStages": [
2026-08-28T09:54:48.2841615Z         "impl",
2026-08-28T09:54:48.2841882Z         "unit",
2026-08-28T09:54:48.2842192Z         "int"
2026-08-28T09:54:48.2842445Z       ],
2026-08-28T09:54:48.2842706Z       "stages": {
2026-08-28T09:54:48.2842972Z         "doc": {
2026-08-28T09:54:48.2843256Z           "complete": false,
2026-08-28T09:54:48.2843533Z           "evidence": []
2026-08-28T09:54:48.2843785Z         },
2026-08-28T09:54:48.2844053Z         "impl": {
2026-08-28T09:54:48.2844334Z           "complete": true,
2026-08-28T09:54:48.2844619Z           "evidence": [
2026-08-28T09:54:48.2844886Z             {
2026-08-28T09:54:48.2845254Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2845530Z               "line": 930
2026-08-28T09:54:48.2845782Z             },
2026-08-28T09:54:48.2846045Z             {
2026-08-28T09:54:48.2846407Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2846683Z               "line": 947
2026-08-28T09:54:48.2846942Z             },
2026-08-28T09:54:48.2847193Z             {
2026-08-28T09:54:48.2847628Z               "path": "crates/spt-net/src/net/endpoint.rs",
2026-08-28T09:54:48.2847891Z               "line": 36
2026-08-28T09:54:48.2848150Z             },
2026-08-28T09:54:48.2848406Z             {
2026-08-28T09:54:48.2848721Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2849068Z               "line": 8209
2026-08-28T09:54:48.2849392Z             },
2026-08-28T09:54:48.2849650Z             {
2026-08-28T09:54:48.2849965Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2850242Z               "line": 8217
2026-08-28T09:54:48.2850490Z             },
2026-08-28T09:54:48.2850748Z             {
2026-08-28T09:54:48.2851061Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2851335Z               "line": 8222
2026-08-28T09:54:48.2851592Z             },
2026-08-28T09:54:48.2851851Z             {
2026-08-28T09:54:48.2852160Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2852498Z               "line": 8404
2026-08-28T09:54:48.2852757Z             },
2026-08-28T09:54:48.2853019Z             {
2026-08-28T09:54:48.2853334Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2853608Z               "line": 8554
2026-08-28T09:54:48.2853868Z             },
2026-08-28T09:54:48.2854117Z             {
2026-08-28T09:54:48.2854436Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2854708Z               "line": 8740
2026-08-28T09:54:48.2854961Z             }
2026-08-28T09:54:48.2855218Z           ]
2026-08-28T09:54:48.2855456Z         },
2026-08-28T09:54:48.2855723Z         "int": {
2026-08-28T09:54:48.2856004Z           "complete": true,
2026-08-28T09:54:48.2856273Z           "evidence": [
2026-08-28T09:54:48.2856518Z             {
2026-08-28T09:54:48.2856929Z               "path": "crates/spt-daemon/tests/mesh_recovery.rs",
2026-08-28T09:54:48.2857206Z               "line": 503
2026-08-28T09:54:48.2857453Z             }
2026-08-28T09:54:48.2857715Z           ]
2026-08-28T09:54:48.2857963Z         },
2026-08-28T09:54:48.2858226Z         "unit": {
2026-08-28T09:54:48.2858508Z           "complete": true,
2026-08-28T09:54:48.2858783Z           "evidence": [
2026-08-28T09:54:48.2859114Z             {
2026-08-28T09:54:48.2859491Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.2859772Z               "line": 2299
2026-08-28T09:54:48.2860025Z             },
2026-08-28T09:54:48.2860286Z             {
2026-08-28T09:54:48.2860674Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2860950Z               "line": 37666
2026-08-28T09:54:48.2861198Z             }
2026-08-28T09:54:48.2861455Z           ]
2026-08-28T09:54:48.2861702Z         }
2026-08-28T09:54:48.2861962Z       }
2026-08-28T09:54:48.2862214Z     },
2026-08-28T09:54:48.2862462Z     {
2026-08-28T09:54:48.2862806Z       "id": "REQ-SELF-ID-TRUST-INJECTED-ENV",
2026-08-28T09:54:48.2877982Z       "title": "DEFERRED to a followup vX.X.n sprint (post-LIFECYCLE-TRUTH, operator-ruled 2026-07-07): self-identity resolution must trust the harness-injected authoritative id and detect a stomped perch instead of silently mis-attributing. ROOT (doyle /diagnose 2026-07-07, field: agent sends stamped `cli@HFENDULEAM` / mis-attributed): `resolve_from` (cli.rs:5480) stamps `cli@<node>` when `detect_self_id` (roster.rs:103) returns None; detect_self_id resolves self ONLY by reverse-lookup — matching `$OWL_SESSION_ID` against a perch's info.json.session_id (then SPT_AGENT_ID, then parent_pid) — and IGNORES `SPT_ENDPOINT_ID`, the authoritative self-id the adapter injects (present in-env as SPT_ENDPOINT_ID=<id>). When a perch record is STOMPED (a cross-id info.json overwrite — the REQ-SPAWN-COLLISION-GUARD-LIVE-DUP damage class; field case: doyle's live session_id written into the deployah perch), the reverse-lookup mis-resolves (doyle session -> `deployah`) or fails (real deployah -> None -> `cli@node`), and the CLI silently believes the stomped store. FIX: detect_self_id PREFERS `SPT_ENDPOINT_ID` when set+non-empty (the harness-authoritative id, immune to a stompable perch), AND cross-checks it against the reverse-resolved perch id — a mismatch logs LOUD (a stomped/duplicated perch becomes a self-diagnosing signal, not a silent wrong identity). Bare-CLI (no SPT_ENDPOINT_ID) keeps the reverse-lookup then the `cli@node` fallback. Also reconcile the adapter/core self-id env contract (SPT_ENDPOINT_ID vs SPT_AGENT_ID vs OWL_SESSION_ID — which is canonical). NOTE: W4 REQ-SPAWN-COLLISION-GUARD-LIVE-DUP prevents FUTURE stomps but does not heal existing corruption nor add this resolution-robustness; recovery of a live stomp today is a manual `api boundary clear <id> --to-session-id <sid> --session-id <current>` re-bind (doyle recovered the doyle/deployah cross-wire this way 2026-07-07).",
2026-08-28T09:54:48.2878459Z       "requiredStages": [],
2026-08-28T09:54:48.2878735Z       "stages": {
2026-08-28T09:54:48.2879084Z         "doc": {
2026-08-28T09:54:48.2879369Z           "complete": false,
2026-08-28T09:54:48.2879707Z           "evidence": []
2026-08-28T09:54:48.2879964Z         },
2026-08-28T09:54:48.2880234Z         "impl": {
2026-08-28T09:54:48.2880516Z           "complete": false,
2026-08-28T09:54:48.2880791Z           "evidence": []
2026-08-28T09:54:48.2881049Z         },
2026-08-28T09:54:48.2881303Z         "int": {
2026-08-28T09:54:48.2881583Z           "complete": false,
2026-08-28T09:54:48.2881857Z           "evidence": []
2026-08-28T09:54:48.2882123Z         },
2026-08-28T09:54:48.2882385Z         "unit": {
2026-08-28T09:54:48.2882669Z           "complete": false,
2026-08-28T09:54:48.2882944Z           "evidence": []
2026-08-28T09:54:48.2883197Z         }
2026-08-28T09:54:48.2883450Z       }
2026-08-28T09:54:48.2883698Z     },
2026-08-28T09:54:48.2883950Z     {
2026-08-28T09:54:48.2884260Z       "id": "REQ-SEND-REPLYTO-REMOVE",
2026-08-28T09:54:48.2888204Z       "title": "Remove `--reply-to` from `spt send` — a target-fallback + REPLIED-label nicety that confuses agents, with no wire effect (ADR-0020 already made messages structural (from,body), no __REPLY_TO__). Hard-remove (no deprecation shim): the clap flag, the is_reply/REPLIED label branch (always SENT/QUEUED), the `send` how-to --reply-to example, and the reply-to mention in REQ-DOCS-6's send topic. Reply-correlation stays on the structural `from` attribute. (v0.16.0)",
2026-08-28T09:54:48.2888504Z       "requiredStages": [
2026-08-28T09:54:48.2888761Z         "impl",
2026-08-28T09:54:48.2889105Z         "unit"
2026-08-28T09:54:48.2889434Z       ],
2026-08-28T09:54:48.2889701Z       "stages": {
2026-08-28T09:54:48.2889953Z         "doc": {
2026-08-28T09:54:48.2890244Z           "complete": false,
2026-08-28T09:54:48.2890520Z           "evidence": []
2026-08-28T09:54:48.2890766Z         },
2026-08-28T09:54:48.2891037Z         "impl": {
2026-08-28T09:54:48.2891314Z           "complete": true,
2026-08-28T09:54:48.2891590Z           "evidence": [
2026-08-28T09:54:48.2891843Z             {
2026-08-28T09:54:48.2892167Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2892436Z               "line": 100
2026-08-28T09:54:48.2892751Z             }
2026-08-28T09:54:48.2893008Z           ]
2026-08-28T09:54:48.2893258Z         },
2026-08-28T09:54:48.2893518Z         "int": {
2026-08-28T09:54:48.2893795Z           "complete": false,
2026-08-28T09:54:48.2894072Z           "evidence": []
2026-08-28T09:54:48.2894325Z         },
2026-08-28T09:54:48.2894587Z         "unit": {
2026-08-28T09:54:48.2894867Z           "complete": true,
2026-08-28T09:54:48.2895139Z           "evidence": [
2026-08-28T09:54:48.2895401Z             {
2026-08-28T09:54:48.2895711Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2895991Z               "line": 33271
2026-08-28T09:54:48.2896233Z             }
2026-08-28T09:54:48.2896491Z           ]
2026-08-28T09:54:48.2896738Z         }
2026-08-28T09:54:48.2897024Z       }
2026-08-28T09:54:48.2897282Z     },
2026-08-28T09:54:48.2897711Z     {
2026-08-28T09:54:48.2898002Z       "id": "REQ-SEND-SPT-HOSTED",
2026-08-28T09:54:48.2909041Z       "title": "An inbound `spt send` is DELIVERED to an spt-hosted endpoint (brought up via `spt endpoint run` → `api bind`, broker holds its PTY, NO `api listen` relay). Today cmd_bind→establish_perch (api/startup.rs ~441) writes info.json + ready marker + controllable=Some(true) but registers NO message-listener / NO address, so deliver.rs resolve_address→None→spool (deliver.rs:132-140) and the message NEVER reaches the live PTY — the endpoint reads 'online' (ready marker) yet `spt send` silently SPOOLS ('online but not deliverable' lie). Per CONTEXT:187-188 the daemon owns the PTY and delivers, manifest-configurable per activity-state (direct PTY injection / relay / HTTP). FIX: route an inbound send for an spt-hosted target through the daemon → broker InputReq → session.write_input PTY-inject (broker.rs dispatch_input/write_input ~988-1022), the same path the brain uses; the live-delivery handshake must report Sent (not Queued) and stop the spool-only fallback for a broker-hosted, PTY-resident endpoint. Detection is local: controllable==Some(true) + spt-hosted state + resolve_address==None. = the spt-core HALF of the wall-b finding (perri owns the adapter half: bind-hook fired-zero-perch + the missing endpoint-run int test). (post-v0.10.0)",
2026-08-28T09:54:48.2909552Z       "requiredStages": [
2026-08-28T09:54:48.2909815Z         "impl",
2026-08-28T09:54:48.2910073Z         "unit",
2026-08-28T09:54:48.2910340Z         "int"
2026-08-28T09:54:48.2910593Z       ],
2026-08-28T09:54:48.2910869Z       "stages": {
2026-08-28T09:54:48.2911131Z         "doc": {
2026-08-28T09:54:48.2911421Z           "complete": false,
2026-08-28T09:54:48.2911719Z           "evidence": []
2026-08-28T09:54:48.2911968Z         },
2026-08-28T09:54:48.2912230Z         "impl": {
2026-08-28T09:54:48.2912501Z           "complete": true,
2026-08-28T09:54:48.2912777Z           "evidence": [
2026-08-28T09:54:48.2913026Z             {
2026-08-28T09:54:48.2913388Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.2913675Z               "line": 2206
2026-08-28T09:54:48.2913927Z             },
2026-08-28T09:54:48.2914190Z             {
2026-08-28T09:54:48.2914540Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.2914816Z               "line": 8524
2026-08-28T09:54:48.2915063Z             },
2026-08-28T09:54:48.2915320Z             {
2026-08-28T09:54:48.2915669Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.2915940Z               "line": 36
2026-08-28T09:54:48.2916269Z             },
2026-08-28T09:54:48.2916521Z             {
2026-08-28T09:54:48.2916888Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.2917149Z               "line": 74
2026-08-28T09:54:48.2917406Z             }
2026-08-28T09:54:48.2917654Z           ]
2026-08-28T09:54:48.2917910Z         },
2026-08-28T09:54:48.2918168Z         "int": {
2026-08-28T09:54:48.2918459Z           "complete": true,
2026-08-28T09:54:48.2918746Z           "evidence": [
2026-08-28T09:54:48.2919108Z             {
2026-08-28T09:54:48.2919779Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:48.2920127Z               "line": 196
2026-08-28T09:54:48.2920380Z             },
2026-08-28T09:54:48.2920628Z             {
2026-08-28T09:54:48.2920991Z               "path": "crates/spt-daemon/tests/broker.rs",
2026-08-28T09:54:48.2921262Z               "line": 542
2026-08-28T09:54:48.2921516Z             }
2026-08-28T09:54:48.2921783Z           ]
2026-08-28T09:54:48.2922038Z         },
2026-08-28T09:54:48.2922308Z         "unit": {
2026-08-28T09:54:48.2922584Z           "complete": true,
2026-08-28T09:54:48.2922857Z           "evidence": [
2026-08-28T09:54:48.2923110Z             {
2026-08-28T09:54:48.2923472Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.2923744Z               "line": 246
2026-08-28T09:54:48.2923996Z             },
2026-08-28T09:54:48.2924253Z             {
2026-08-28T09:54:48.2924596Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.2924881Z               "line": 2073
2026-08-28T09:54:48.2925137Z             },
2026-08-28T09:54:48.2925391Z             {
2026-08-28T09:54:48.2925842Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.2926120Z               "line": 26543
2026-08-28T09:54:48.2926377Z             }
2026-08-28T09:54:48.2926616Z           ]
2026-08-28T09:54:48.2926863Z         }
2026-08-28T09:54:48.2927168Z       }
2026-08-28T09:54:48.2927420Z     },
2026-08-28T09:54:48.2927672Z     {
2026-08-28T09:54:48.2927986Z       "id": "REQ-SEND-STAMP-AGENT-ID",
2026-08-28T09:54:48.2938765Z       "title": "MSG-IDENTITY W4 / endpoint-identity (operator-flagged 2026-07-09 + live-confirmed on flynn's F-038 ask arriving 'cli@HFENDULEAM'): a live agent's own CLI `spt send <target>` MUST stamp from_id with the AGENT id (e.g. 'doyle'), not the node fallback 'cli@<node>' — today the agent-id stamp rides ONLY the adapter/perch shortform path, so any agent shelling out `spt send` (the DOCUMENTED reach-another-agent form) presents to recipients as an anonymous node CLI: replies mis-route (recipients answer cli@node — no perch — instead of the sender), and the F-036 victim-effect ('sends downgraded to from:cli@node') is indistinguishable from normal CLI traffic. FIX: send-time self-resolve — when the calling process/session maps to a bound live perch on this node (the session-pin/seed machinery already resolves this for bind), stamp that endpoint id as from_id; a genuinely perchless CLI keeps 'cli@<node>'. Gate: unit — a send from a session bound to a live perch stamps the endpoint id; a perchless shell keeps the node stamp; int — recipient's EVENT from= carries the agent id for a shelled-out send from a live session. Kin F-036 victim effects, EVENT envelope (ADR-0020), [[owl-send-not-legacy-spt-send]] (adapter-path stamp works today — this closes the CLI-path gap).",
2026-08-28T09:54:48.2939261Z       "requiredStages": [
2026-08-28T09:54:48.2939522Z         "impl",
2026-08-28T09:54:48.2939795Z         "unit",
2026-08-28T09:54:48.2940053Z         "int"
2026-08-28T09:54:48.2940324Z       ],
2026-08-28T09:54:48.2940586Z       "stages": {
2026-08-28T09:54:48.2940843Z         "doc": {
2026-08-28T09:54:48.2941125Z           "complete": false,
2026-08-28T09:54:48.2941401Z           "evidence": []
2026-08-28T09:54:48.2941654Z         },
2026-08-28T09:54:48.2941920Z         "impl": {
2026-08-28T09:54:48.2942196Z           "complete": true,
2026-08-28T09:54:48.2942487Z           "evidence": [
2026-08-28T09:54:48.2942821Z             {
2026-08-28T09:54:48.2943158Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:48.2943443Z               "line": 229
2026-08-28T09:54:48.2943691Z             }
2026-08-28T09:54:48.2943953Z           ]
2026-08-28T09:54:48.2944206Z         },
2026-08-28T09:54:48.2944472Z         "int": {
2026-08-28T09:54:48.2944753Z           "complete": true,
2026-08-28T09:54:48.2945020Z           "evidence": [
2026-08-28T09:54:48.2945273Z             {
2026-08-28T09:54:48.2945688Z               "path": "crates/spt/tests/send_stamp_agent_id_e2e.rs",
2026-08-28T09:54:48.2946012Z               "line": 49
2026-08-28T09:54:48.2946262Z             }
2026-08-28T09:54:48.2946525Z           ]
2026-08-28T09:54:48.2946778Z         },
2026-08-28T09:54:48.2947044Z         "unit": {
2026-08-28T09:54:48.2947315Z           "complete": true,
2026-08-28T09:54:48.2947635Z           "evidence": [
2026-08-28T09:54:48.2947897Z             {
2026-08-28T09:54:48.2948241Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:48.2948517Z               "line": 598
2026-08-28T09:54:48.2948773Z             }
2026-08-28T09:54:48.2949153Z           ]
2026-08-28T09:54:48.2949464Z         }
2026-08-28T09:54:48.2949740Z       }
2026-08-28T09:54:48.2949988Z     },
2026-08-28T09:54:48.2950245Z     {
2026-08-28T09:54:48.2950584Z       "id": "REQ-SEND-WINDOW-DRAIN-HONOR",
2026-08-28T09:54:48.2973320Z       "title": "F-035 (field finding 2026-07-09): active_only = POLL-ONLY for a relay-bearing live agent -- it must NEVER be RELAY-delivered (its contract is 'active hook window only, never wakes' per spool.rs WINDOW_ACTIVE_ONLY doc + cli.rs:85; `spt send --active-only` / the hidden `--deferred` alias and `send_deferred` shell-context mint it). FIELD SYMPTOM: lia (a full live agent -- relay-for-idle, poll-for-busy) surfaced an --active-only msg on her IDLE RELAY. RCA JOURNEY: v1 RCA (docs/F-035-RCA.md) analyzed the WRONG class (spt-hosted-relay-LESS, the idle-edge inject leg) and proposed a COLLAPSE that would have broken the shipped F-023 anti-starvation gate (docs/F-035-CONFLICT.md); operator reclassified to a relay-bearing live agent; the relay-class re-RCA (docs/F-035-RELAY-RCA.md) traced EVERY active_only->relay carrier and found them ALL ALREADY GUARDED on main@2c05dc9 -- so spt-core has NO code bug. doyle FINAL RULING: the real leak is the ADAPTER's busy->idle poll->idle-representation handoff (spt-claude-code -- a legitimate `api poll` on going idle drains active_only, then the adapter renders it into the idle/relay surface), OUTSIDE spt-core; perri's lane. spt-core DELIVERABLE = a REGRESSION GUARD (tests only, NO behavior change) locking the 3 load-bearing guards that keep active_only off a relay: (1) send_windowed:217 -- an active_only send SKIPS deliver_tcp (never rides a live relay's TCP channel), spools poll-only; (2) cli.rs:5762 -- a cross-node active_only send stays LOCAL-ONLY (the WanMessage wire record has no window field, so shipping it would strip the class and relay-deliver at the far node); (3) relay.rs drain_backlog -> drain_non_deferred (deferred=0) -- the relay backlog NEVER forwards an active_only (deferred=1) row. Guard suite: unit (send_windowed active_only-skips-tcp-to-live-relay + relay_backlog-never-drains-active_only) + int (cross-node active_only stays local-only, never WAN, while a default send to the same remote target DOES take the WAN leg). AMENDED 2026-07-26 (FIELD-TRUTH W1 roll-in, operator ruling): guard (4) added — the idle-edge and parked-re-offer inject claims NEVER take a deferred (active_only) row, on ANY endpoint class. The collapse proposed in docs/F-035-RCA.md v1 and rejected in docs/F-035-CONFLICT.md is now ADOPTED on new field evidence (doyle spool-audit: spt-shells active_only rows taken_leg=idle-inject on a live perch, each starting a turn — the exact 'never wakes' violation this REQ exists to forbid); the F-023 deferred-rescue it collided with is revoked by the REQ-MSG-IDLE-EDGE-DRAIN amendment. Kin REQ-MSG-DELIVERY-AXES + REQ-MSG-IDLE-EDGE-DRAIN + REQ-INST-6.",
2026-08-28T09:54:48.2973867Z       "requiredStages": [
2026-08-28T09:54:48.2974125Z         "unit",
2026-08-28T09:54:48.2974388Z         "int"
2026-08-28T09:54:48.2974641Z       ],
2026-08-28T09:54:48.2974901Z       "stages": {
2026-08-28T09:54:48.2975161Z         "doc": {
2026-08-28T09:54:48.2975437Z           "complete": true,
2026-08-28T09:54:48.2975714Z           "evidence": [
2026-08-28T09:54:48.2975963Z             {
2026-08-28T09:54:48.2976273Z               "path": "docs/F-035-RCA.md",
2026-08-28T09:54:48.2976540Z               "line": 1
2026-08-28T09:54:48.2976797Z             }
2026-08-28T09:54:48.2977112Z           ]
2026-08-28T09:54:48.2977369Z         },
2026-08-28T09:54:48.2977640Z         "impl": {
2026-08-28T09:54:48.2977924Z           "complete": true,
2026-08-28T09:54:48.2978210Z           "evidence": [
2026-08-28T09:54:48.2978463Z             {
2026-08-28T09:54:48.2978826Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.2979187Z               "line": 159
2026-08-28T09:54:48.2979450Z             },
2026-08-28T09:54:48.2979703Z             {
2026-08-28T09:54:48.2980056Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.2980330Z               "line": 649
2026-08-28T09:54:48.2980580Z             }
2026-08-28T09:54:48.2980843Z           ]
2026-08-28T09:54:48.2981096Z         },
2026-08-28T09:54:48.2981354Z         "int": {
2026-08-28T09:54:48.2981635Z           "complete": true,
2026-08-28T09:54:48.2981906Z           "evidence": [
2026-08-28T09:54:48.2982173Z             {
2026-08-28T09:54:48.2982618Z               "path": "crates/spt/tests/active_only_never_relay_e2e.rs",
2026-08-28T09:54:48.2982895Z               "line": 98
2026-08-28T09:54:48.2983149Z             },
2026-08-28T09:54:48.2983412Z             {
2026-08-28T09:54:48.2983789Z               "path": "crates/spt/tests/idle_edge_drain_e2e.rs",
2026-08-28T09:54:48.2984060Z               "line": 75
2026-08-28T09:54:48.2984385Z             }
2026-08-28T09:54:48.2984633Z           ]
2026-08-28T09:54:48.2984891Z         },
2026-08-28T09:54:48.2985143Z         "unit": {
2026-08-28T09:54:48.2985423Z           "complete": true,
2026-08-28T09:54:48.2985692Z           "evidence": [
2026-08-28T09:54:48.2985945Z             {
2026-08-28T09:54:48.2986298Z               "path": "crates/spt-daemon/src/relay.rs",
2026-08-28T09:54:48.2986570Z               "line": 145
2026-08-28T09:54:48.2986833Z             },
2026-08-28T09:54:48.2987081Z             {
2026-08-28T09:54:48.2987429Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:48.2987763Z               "line": 322
2026-08-28T09:54:48.2988020Z             },
2026-08-28T09:54:48.2988280Z             {
2026-08-28T09:54:48.2988631Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.2988917Z               "line": 1352
2026-08-28T09:54:48.2989265Z             }
2026-08-28T09:54:48.2989527Z           ]
2026-08-28T09:54:48.2989775Z         }
2026-08-28T09:54:48.2990034Z       }
2026-08-28T09:54:48.2990278Z     },
2026-08-28T09:54:48.2990529Z     {
2026-08-28T09:54:48.2990871Z       "id": "REQ-SERVE-OWNERSHIP-GENERATION",
2026-08-28T09:54:48.3000169Z       "title": "REDISPATCH-STALL W1 (ADR-0038 Amendment, fix 6): terminal-exclusion enforced PRE-SERVE + ownership/generation validation on attach/detach — a stale worker can never detach or displace a REPLACEMENT controller (today detach_if compares Arc ptr identity only; the serve path re-checks nothing at completion). Covers the UNFINISHED-stale-row control-steal shape (raw-close no-FIN viewports, emphasys C2 leak class feeding it) that finished-row retirement (D1/D1b) definitionally cannot see — the discriminating field observable on the next live steal catch = the stolen row's finished+retired flags. Gate: impl — pre-serve terminal exclusion + generation/ownership tokens on attach/detach; unit — stale-generation detach refused while the same-generation detach lands; int — T6 (UNFINISHED-stale attach row + live current controller + dispatcher restart: neither takes nor clears the replacement, D1/D1b green alongside); doc — ADR-0038 Amendment. Kin REQ-HAZARD-REDISPATCH-CONTROL-STEAL (the finished sibling), REQ-REDISPATCH-FINISHED-RETIRE.",
2026-08-28T09:54:48.3000608Z       "requiredStages": [
2026-08-28T09:54:48.3000861Z         "doc",
2026-08-28T09:54:48.3001118Z         "impl",
2026-08-28T09:54:48.3001374Z         "unit",
2026-08-28T09:54:48.3001625Z         "int"
2026-08-28T09:54:48.3001883Z       ],
2026-08-28T09:54:48.3002140Z       "stages": {
2026-08-28T09:54:48.3002406Z         "doc": {
2026-08-28T09:54:48.3002683Z           "complete": true,
2026-08-28T09:54:48.3003036Z           "evidence": [
2026-08-28T09:54:48.3003293Z             {
2026-08-28T09:54:48.3003757Z               "path": "docs/adr/0038-broker-stream-lifecycle-truth.md",
2026-08-28T09:54:48.3004020Z               "line": 76
2026-08-28T09:54:48.3004270Z             }
2026-08-28T09:54:48.3004527Z           ]
2026-08-28T09:54:48.3004785Z         },
2026-08-28T09:54:48.3005044Z         "impl": {
2026-08-28T09:54:48.3005329Z           "complete": true,
2026-08-28T09:54:48.3005605Z           "evidence": [
2026-08-28T09:54:48.3005853Z             {
2026-08-28T09:54:48.3006216Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.3006491Z               "line": 227
2026-08-28T09:54:48.3006746Z             },
2026-08-28T09:54:48.3007000Z             {
2026-08-28T09:54:48.3007362Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.3007638Z               "line": 920
2026-08-28T09:54:48.3007892Z             },
2026-08-28T09:54:48.3008138Z             {
2026-08-28T09:54:48.3008482Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.3008758Z               "line": 2366
2026-08-28T09:54:48.3009097Z             },
2026-08-28T09:54:48.3009349Z             {
2026-08-28T09:54:48.3009708Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.3009981Z               "line": 2978
2026-08-28T09:54:48.3010290Z             },
2026-08-28T09:54:48.3010539Z             {
2026-08-28T09:54:48.3010905Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.3011178Z               "line": 3334
2026-08-28T09:54:48.3011431Z             },
2026-08-28T09:54:48.3011693Z             {
2026-08-28T09:54:48.3012059Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.3012332Z               "line": 993
2026-08-28T09:54:48.3012589Z             },
2026-08-28T09:54:48.3012843Z             {
2026-08-28T09:54:48.3013252Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.3013534Z               "line": 714
2026-08-28T09:54:48.3013802Z             }
2026-08-28T09:54:48.3014054Z           ]
2026-08-28T09:54:48.3014313Z         },
2026-08-28T09:54:48.3014565Z         "int": {
2026-08-28T09:54:48.3014854Z           "complete": true,
2026-08-28T09:54:48.3015120Z           "evidence": [
2026-08-28T09:54:48.3015375Z             {
2026-08-28T09:54:48.3015798Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:48.3016075Z               "line": 673
2026-08-28T09:54:48.3016327Z             }
2026-08-28T09:54:48.3016577Z           ]
2026-08-28T09:54:48.3016829Z         },
2026-08-28T09:54:48.3017084Z         "unit": {
2026-08-28T09:54:48.3017373Z           "complete": true,
2026-08-28T09:54:48.3017635Z           "evidence": [
2026-08-28T09:54:48.3017889Z             {
2026-08-28T09:54:48.3018251Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.3018532Z               "line": 11892
2026-08-28T09:54:48.3018795Z             },
2026-08-28T09:54:48.3019171Z             {
2026-08-28T09:54:48.3019542Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.3019815Z               "line": 11960
2026-08-28T09:54:48.3020081Z             },
2026-08-28T09:54:48.3020331Z             {
2026-08-28T09:54:48.3020694Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.3020960Z               "line": 12019
2026-08-28T09:54:48.3021285Z             }
2026-08-28T09:54:48.3021542Z           ]
2026-08-28T09:54:48.3021809Z         }
2026-08-28T09:54:48.3022057Z       }
2026-08-28T09:54:48.3022302Z     },
2026-08-28T09:54:48.3022556Z     {
2026-08-28T09:54:48.3022883Z       "id": "REQ-SESSION-ADAPTER-RECORDED",
2026-08-28T09:54:48.3036579Z       "title": "D-2 (REMOTE-TRUTH triage §D-2 + operator Q5 @c248afc): the session ledger records the adapter[:profile] a session ran under, so a later resume can restore the harness the session actually used (not merely the endpoint's CURRENT stamp). ROOT: SessionEntry (spt-store/sessions.rs:58) carries ts/session_id/trigger/cwd/ordinal but NOT the adapter — a resume-from-history row cannot know which harness authored the transcript, so a resume under a since-changed endpoint adapter (B-2 ChangeAdapter, or a fork) launches the wrong harness. FIX: an ADDITIVE `adapter: Option<String>` on SessionEntry, exact cwd/ordinal serde pattern (#[serde(default, skip_serializing_if=\"Option::is_none\")]) — a pre-migration row missing the key deserializes None; None omits the key on serialize (byte-identical to old rows); an unknown key on an old reader is ignored (serde default) — back-compat BOTH directions. Stamped at every PRODUCTION session-boundary append. CENSUS (doyle-confirmed @94f0205, corrects the triage-era 5-site drift to the real 3): startup.rs:317 (live bind boot row, rec.adapter in scope), reporting.rs:94 (boundary rotation row UNDER the mutate_info lock, capture adapter_for_ledger=rec.adapter beside cwd_for_ledger), ready.rs:119 in crates/spt-msg (ready-agent boot row, rec.adapter in scope). NOT digest.rs:601 (cfg(test) fixture) and NOT a livehost psyche-ledger append (none exists — the live /clear|/compact boundary shells `api boundary` → reporting.rs:94, the SAME append). None-stamp is a benign degrade (resume falls back to the endpoint's current adapter).",
2026-08-28T09:54:48.3037038Z       "requiredStages": [
2026-08-28T09:54:48.3037396Z         "impl",
2026-08-28T09:54:48.3037645Z         "unit"
2026-08-28T09:54:48.3037934Z       ],
2026-08-28T09:54:48.3038191Z       "stages": {
2026-08-28T09:54:48.3038437Z         "doc": {
2026-08-28T09:54:48.3038724Z           "complete": false,
2026-08-28T09:54:48.3039075Z           "evidence": []
2026-08-28T09:54:48.3039324Z         },
2026-08-28T09:54:48.3039586Z         "impl": {
2026-08-28T09:54:48.3039862Z           "complete": true,
2026-08-28T09:54:48.3040133Z           "evidence": [
2026-08-28T09:54:48.3040377Z             {
2026-08-28T09:54:48.3040797Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:48.3041067Z               "line": 134
2026-08-28T09:54:48.3041336Z             },
2026-08-28T09:54:48.3041590Z             {
2026-08-28T09:54:48.3041957Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3042224Z               "line": 92
2026-08-28T09:54:48.3042477Z             },
2026-08-28T09:54:48.3042729Z             {
2026-08-28T09:54:48.3043092Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3043364Z               "line": 194
2026-08-28T09:54:48.3043615Z             },
2026-08-28T09:54:48.3043875Z             {
2026-08-28T09:54:48.3044218Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.3044491Z               "line": 796
2026-08-28T09:54:48.3044752Z             }
2026-08-28T09:54:48.3045001Z           ]
2026-08-28T09:54:48.3045253Z         },
2026-08-28T09:54:48.3045520Z         "int": {
2026-08-28T09:54:48.3045806Z           "complete": false,
2026-08-28T09:54:48.3046082Z           "evidence": []
2026-08-28T09:54:48.3046336Z         },
2026-08-28T09:54:48.3046596Z         "unit": {
2026-08-28T09:54:48.3046882Z           "complete": true,
2026-08-28T09:54:48.3047159Z           "evidence": [
2026-08-28T09:54:48.3047412Z             {
2026-08-28T09:54:48.3047821Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3048089Z               "line": 326
2026-08-28T09:54:48.3048356Z             },
2026-08-28T09:54:48.3048609Z             {
2026-08-28T09:54:48.3049110Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3049387Z               "line": 350
2026-08-28T09:54:48.3049640Z             }
2026-08-28T09:54:48.3049921Z           ]
2026-08-28T09:54:48.3050160Z         }
2026-08-28T09:54:48.3050403Z       }
2026-08-28T09:54:48.3050646Z     },
2026-08-28T09:54:48.3050889Z     {
2026-08-28T09:54:48.3051228Z       "id": "REQ-SESSION-RESUME-TEMPLATE",
2026-08-28T09:54:48.3070855Z       "title": "Resuming an endpoint session that HAS conversation history brings up a BLANK session. ROOT (doyle, code-grounded + CONTEXT — case-3 spt-core MISSING feature, NOT a perri docs-miss): CONTEXT L127-129 already defines the resume-session seam ('continue-existing: resume an existing harness session under the adapter — its NATIVE resume'), and the manifest already has the resume-variant pattern (Session has BOTH psyche_init AND psyche_resume, manifest.rs:217-219) — but the agent's own session has ONLY self_ (`[session.self]`, no resume sibling). cmd_endpoint_run (cli.rs:1304) re-passes the session_id through `[session.self]` on resume (resume.unwrap_or_else(mint_session_id)), so the adapter's FRESH command (e.g. `claude --session-id ..`) runs again instead of the harness NATIVE resume (`claude -r ..`) -> CC starts a fresh transcript -> blank. spt-core forwards session_id + cwd faithfully; it just has no way to express the native-resume invocation. SECOND GAP: CC resolves a transcript by session_id + cwd, but the session ledger records only {ts, session_id, trigger} (no cwd), so picker Resume-from-history (cross-project rows) can't restore the right cwd. FIX (doyle design, V0.13.0-P2-SESSION-RESUME-DESIGN.md, mirrors psyche_init->psyche_resume exactly): (A) add a `[session.resume]` role (resume: Option<SessionRole> on Session + roles()/is_empty()); cmd_endpoint_run selects it when --resume is set AND it's declared (fill {id}/{session_id}=resumed id/{session_name} + the resume cwd), else FALL BACK to `[session.self]` (full back-compat). (B) record cwd PER ledger row (operator ruling): {ts, session_id, trigger, cwd} additive serde-default; resume cwd = resumed row cwd -> else perch info.cwd -> else current_dir (back-compat for old rows + single-project endpoints); picker threads the selected row's cwd through Outcome::Run -> cmd_endpoint_run. (C) public docs (MANIFEST + harness-contract) teach `[session.resume]` so perri builds the adapter side BLIND. Adapter follow-on (perri, AFTER spt-core ships+docs): declare `[session.resume] command = claude -r {session_id} --remote-control {id} --dangerously-skip-permissions` from the resume cwd. Completes REQ-READY-AGENT-RESUME / REQ-RUN-PICKER resume-from-history. (v0.13.0)",
2026-08-28T09:54:48.3071428Z       "requiredStages": [
2026-08-28T09:54:48.3071705Z         "doc",
2026-08-28T09:54:48.3071958Z         "impl",
2026-08-28T09:54:48.3072216Z         "unit",
2026-08-28T09:54:48.3072468Z         "int"
2026-08-28T09:54:48.3072728Z       ],
2026-08-28T09:54:48.3072989Z       "stages": {
2026-08-28T09:54:48.3073252Z         "doc": {
2026-08-28T09:54:48.3073542Z           "complete": true,
2026-08-28T09:54:48.3073815Z           "evidence": [
2026-08-28T09:54:48.3074071Z             {
2026-08-28T09:54:48.3074487Z               "path": "docs-site/src/harness-contract/manifest.md",
2026-08-28T09:54:48.3074759Z               "line": 134
2026-08-28T09:54:48.3075010Z             },
2026-08-28T09:54:48.3075267Z             {
2026-08-28T09:54:48.3075570Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:48.3075852Z               "line": 143
2026-08-28T09:54:48.3076114Z             }
2026-08-28T09:54:48.3076367Z           ]
2026-08-28T09:54:48.3076633Z         },
2026-08-28T09:54:48.3076890Z         "impl": {
2026-08-28T09:54:48.3077167Z           "complete": true,
2026-08-28T09:54:48.3077429Z           "evidence": [
2026-08-28T09:54:48.3077683Z             {
2026-08-28T09:54:48.3078073Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.3078344Z               "line": 91
2026-08-28T09:54:48.3078673Z             },
2026-08-28T09:54:48.3078936Z             {
2026-08-28T09:54:48.3079459Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.3079727Z               "line": 259
2026-08-28T09:54:48.3079984Z             },
2026-08-28T09:54:48.3080238Z             {
2026-08-28T09:54:48.3080621Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.3080897Z               "line": 321
2026-08-28T09:54:48.3081154Z             },
2026-08-28T09:54:48.3081411Z             {
2026-08-28T09:54:48.3081779Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3082108Z               "line": 71
2026-08-28T09:54:48.3082355Z             },
2026-08-28T09:54:48.3082613Z             {
2026-08-28T09:54:48.3082966Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.3083237Z               "line": 250
2026-08-28T09:54:48.3083502Z             }
2026-08-28T09:54:48.3083754Z           ]
2026-08-28T09:54:48.3084016Z         },
2026-08-28T09:54:48.3084268Z         "int": {
2026-08-28T09:54:48.3084559Z           "complete": true,
2026-08-28T09:54:48.3084831Z           "evidence": [
2026-08-28T09:54:48.3085089Z             {
2026-08-28T09:54:48.3085484Z               "path": "crates/spt/tests/resume_template_e2e.rs",
2026-08-28T09:54:48.3085757Z               "line": 25
2026-08-28T09:54:48.3086012Z             }
2026-08-28T09:54:48.3086263Z           ]
2026-08-28T09:54:48.3086520Z         },
2026-08-28T09:54:48.3086778Z         "unit": {
2026-08-28T09:54:48.3087065Z           "complete": true,
2026-08-28T09:54:48.3087332Z           "evidence": [
2026-08-28T09:54:48.3087585Z             {
2026-08-28T09:54:48.3087971Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.3088243Z               "line": 697
2026-08-28T09:54:48.3088496Z             },
2026-08-28T09:54:48.3088737Z             {
2026-08-28T09:54:48.3089310Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.3089581Z               "line": 747
2026-08-28T09:54:48.3089834Z             },
2026-08-28T09:54:48.3090086Z             {
2026-08-28T09:54:48.3090459Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.3090730Z               "line": 1931
2026-08-28T09:54:48.3090982Z             },
2026-08-28T09:54:48.3091242Z             {
2026-08-28T09:54:48.3091594Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3091867Z               "line": 249
2026-08-28T09:54:48.3092177Z             },
2026-08-28T09:54:48.3092434Z             {
2026-08-28T09:54:48.3092801Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3093074Z               "line": 275
2026-08-28T09:54:48.3093502Z             },
2026-08-28T09:54:48.3093745Z             {
2026-08-28T09:54:48.3094104Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.3094362Z               "line": 303
2026-08-28T09:54:48.3094625Z             },
2026-08-28T09:54:48.3094876Z             {
2026-08-28T09:54:48.3095234Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.3095506Z               "line": 2211
2026-08-28T09:54:48.3095763Z             }
2026-08-28T09:54:48.3096020Z           ]
2026-08-28T09:54:48.3096269Z         }
2026-08-28T09:54:48.3096530Z       }
2026-08-28T09:54:48.3096785Z     },
2026-08-28T09:54:48.3097038Z     {
2026-08-28T09:54:48.3097424Z       "id": "REQ-SESSIONS-LOG-ENDPOINT-ATTRIBUTION",
2026-08-28T09:54:48.3105199Z       "title": "C2 (F028, infra; ROOT-CAUSED + severity-upgraded doyle RCA 2026-07-03): cross-endpoint perch contamination — a foreign psyche's SessionStart hook REBINDS a victim perch's IDENTITY, not merely its ledger. Evidence: hall-a's info.json.session_id IS f015b-probe-psyche's session (359d7bd7) + hall-a's ledger holds the foreign psyche session; same class as hall-b's dead-pid stamp (141556). This REQ = the OBSERVABLE (foreign session_id in a perch's ledger/info.json + resume offering foreign sessions) and its belt-braces: (iii) filter owlery-cwd rows OUT of resume_rows; (iv) one-time repair for already-contaminated perches (hall-a on HFENDULEAM) or self-heal on next legitimate session-start. The ROOT (identity pinned at spawn + honest bind + nested self-resolve) is REQ-BIND-HONEST-SELF-STAMP — C2 is UPSTREAM of B3 (presence/CONTROLLED read the very stamps this corrupts). See triage C2.",
2026-08-28T09:54:48.3105651Z       "requiredStages": [
2026-08-28T09:54:48.3105923Z         "impl",
2026-08-28T09:54:48.3106195Z         "unit"
2026-08-28T09:54:48.3106444Z       ],
2026-08-28T09:54:48.3106773Z       "stages": {
2026-08-28T09:54:48.3107032Z         "doc": {
2026-08-28T09:54:48.3107316Z           "complete": false,
2026-08-28T09:54:48.3107593Z           "evidence": []
2026-08-28T09:54:48.3107847Z         },
2026-08-28T09:54:48.3108113Z         "impl": {
2026-08-28T09:54:48.3108381Z           "complete": true,
2026-08-28T09:54:48.3108681Z           "evidence": [
2026-08-28T09:54:48.3109157Z             {
2026-08-28T09:54:48.3113640Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.3113983Z               "line": 525
2026-08-28T09:54:48.3114269Z             }
2026-08-28T09:54:48.3114556Z           ]
2026-08-28T09:54:48.3114838Z         },
2026-08-28T09:54:48.3115117Z         "int": {
2026-08-28T09:54:48.3115434Z           "complete": false,
2026-08-28T09:54:48.3115735Z           "evidence": []
2026-08-28T09:54:48.3116011Z         },
2026-08-28T09:54:48.3116502Z         "unit": {
2026-08-28T09:54:48.3116826Z           "complete": true,
2026-08-28T09:54:48.3117126Z           "evidence": [
2026-08-28T09:54:48.3117414Z             {
2026-08-28T09:54:48.3117805Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.3118106Z               "line": 1057
2026-08-28T09:54:48.3118383Z             }
2026-08-28T09:54:48.3118664Z           ]
2026-08-28T09:54:48.3119045Z         }
2026-08-28T09:54:48.3119408Z       }
2026-08-28T09:54:48.3119655Z     },
2026-08-28T09:54:48.3119905Z     {
2026-08-28T09:54:48.3120195Z       "id": "REQ-SHELL-1",
2026-08-28T09:54:48.3123075Z       "title": "Shell hosting machinery: shell perch under the owner (type/owner/adapter_name/status/alias), broker-launched binary + api bind local-link handshake, the three channels (command durable, text+file durable + progress-queryable, sensory REST-only never spooled + dropped-unless-owner-live), owner exclusivity (CONTEXT Shell model)",
2026-08-28T09:54:48.3123361Z       "requiredStages": [
2026-08-28T09:54:48.3123680Z         "impl",
2026-08-28T09:54:48.3123933Z         "unit",
2026-08-28T09:54:48.3124186Z         "int"
2026-08-28T09:54:48.3124439Z       ],
2026-08-28T09:54:48.3124706Z       "stages": {
2026-08-28T09:54:48.3124968Z         "doc": {
2026-08-28T09:54:48.3125244Z           "complete": false,
2026-08-28T09:54:48.3125524Z           "evidence": []
2026-08-28T09:54:48.3125780Z         },
2026-08-28T09:54:48.3126043Z         "impl": {
2026-08-28T09:54:48.3126315Z           "complete": true,
2026-08-28T09:54:48.3126601Z           "evidence": [
2026-08-28T09:54:48.3126847Z             {
2026-08-28T09:54:48.3127225Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3127501Z               "line": 259
2026-08-28T09:54:48.3127754Z             },
2026-08-28T09:54:48.3128007Z             {
2026-08-28T09:54:48.3128375Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3128648Z               "line": 338
2026-08-28T09:54:48.3128905Z             },
2026-08-28T09:54:48.3129395Z             {
2026-08-28T09:54:48.3129762Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3130039Z               "line": 27
2026-08-28T09:54:48.3130292Z             },
2026-08-28T09:54:48.3130545Z             {
2026-08-28T09:54:48.3130920Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3131184Z               "line": 55
2026-08-28T09:54:48.3131446Z             },
2026-08-28T09:54:48.3131698Z             {
2026-08-28T09:54:48.3132146Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3132418Z               "line": 196
2026-08-28T09:54:48.3132671Z             },
2026-08-28T09:54:48.3132928Z             {
2026-08-28T09:54:48.3133303Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3133577Z               "line": 275
2026-08-28T09:54:48.3133831Z             },
2026-08-28T09:54:48.3134083Z             {
2026-08-28T09:54:48.3134459Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3134732Z               "line": 22
2026-08-28T09:54:48.3135218Z             },
2026-08-28T09:54:48.3135471Z             {
2026-08-28T09:54:48.3135848Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3136113Z               "line": 75
2026-08-28T09:54:48.3136364Z             },
2026-08-28T09:54:48.3136626Z             {
2026-08-28T09:54:48.3137022Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3137294Z               "line": 86
2026-08-28T09:54:48.3137547Z             },
2026-08-28T09:54:48.3137800Z             {
2026-08-28T09:54:48.3138172Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3138444Z               "line": 451
2026-08-28T09:54:48.3138689Z             },
2026-08-28T09:54:48.3139030Z             {
2026-08-28T09:54:48.3139403Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3139674Z               "line": 518
2026-08-28T09:54:48.3139931Z             },
2026-08-28T09:54:48.3140184Z             {
2026-08-28T09:54:48.3140552Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3140813Z               "line": 580
2026-08-28T09:54:48.3141077Z             },
2026-08-28T09:54:48.3141330Z             {
2026-08-28T09:54:48.3141691Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3141962Z               "line": 602
2026-08-28T09:54:48.3142302Z             },
2026-08-28T09:54:48.3142553Z             {
2026-08-28T09:54:48.3142926Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3143197Z               "line": 615
2026-08-28T09:54:48.3143449Z             },
2026-08-28T09:54:48.3143707Z             {
2026-08-28T09:54:48.3144052Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.3144320Z               "line": 493
2026-08-28T09:54:48.3144568Z             },
2026-08-28T09:54:48.3144820Z             {
2026-08-28T09:54:48.3145174Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.3145503Z               "line": 509
2026-08-28T09:54:48.3145959Z             },
2026-08-28T09:54:48.3146231Z             {
2026-08-28T09:54:48.3146593Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3146858Z               "line": 41
2026-08-28T09:54:48.3147110Z             },
2026-08-28T09:54:48.3147362Z             {
2026-08-28T09:54:48.3147783Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3148055Z               "line": 357
2026-08-28T09:54:48.3148316Z             },
2026-08-28T09:54:48.3148574Z             {
2026-08-28T09:54:48.3148917Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.3149283Z               "line": 517
2026-08-28T09:54:48.3149538Z             },
2026-08-28T09:54:48.3149801Z             {
2026-08-28T09:54:48.3150116Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.3150383Z               "line": 626
2026-08-28T09:54:48.3150640Z             },
2026-08-28T09:54:48.3150883Z             {
2026-08-28T09:54:48.3151203Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.3151469Z               "line": 724
2026-08-28T09:54:48.3151726Z             },
2026-08-28T09:54:48.3151971Z             {
2026-08-28T09:54:48.3152337Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3152608Z               "line": 521
2026-08-28T09:54:48.3152862Z             },
2026-08-28T09:54:48.3153118Z             {
2026-08-28T09:54:48.3153515Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3153787Z               "line": 22583
2026-08-28T09:54:48.3154043Z             },
2026-08-28T09:54:48.3154295Z             {
2026-08-28T09:54:48.3154607Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3154880Z               "line": 22782
2026-08-28T09:54:48.3155137Z             },
2026-08-28T09:54:48.3155390Z             {
2026-08-28T09:54:48.3155705Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3155971Z               "line": 22978
2026-08-28T09:54:48.3156286Z             }
2026-08-28T09:54:48.3156534Z           ]
2026-08-28T09:54:48.3156791Z         },
2026-08-28T09:54:48.3157046Z         "int": {
2026-08-28T09:54:48.3157324Z           "complete": true,
2026-08-28T09:54:48.3157593Z           "evidence": [
2026-08-28T09:54:48.3157861Z             {
2026-08-28T09:54:48.3158266Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:48.3158532Z               "line": 935
2026-08-28T09:54:48.3158795Z             },
2026-08-28T09:54:48.3159124Z             {
2026-08-28T09:54:48.3159511Z               "path": "crates/spt-daemon/tests/shellchan.rs",
2026-08-28T09:54:48.3159771Z               "line": 8
2026-08-28T09:54:48.3160032Z             },
2026-08-28T09:54:48.3160290Z             {
2026-08-28T09:54:48.3160667Z               "path": "crates/spt-daemon/tests/shellchan.rs",
2026-08-28T09:54:48.3160943Z               "line": 49
2026-08-28T09:54:48.3161196Z             },
2026-08-28T09:54:48.3161448Z             {
2026-08-28T09:54:48.3161816Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3162092Z               "line": 1224
2026-08-28T09:54:48.3162358Z             },
2026-08-28T09:54:48.3162611Z             {
2026-08-28T09:54:48.3162977Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3163245Z               "line": 2246
2026-08-28T09:54:48.3163569Z             },
2026-08-28T09:54:48.3163822Z             {
2026-08-28T09:54:48.3164193Z               "path": "crates/spt/tests/notify_shell_e2e.rs",
2026-08-28T09:54:48.3164461Z               "line": 17
2026-08-28T09:54:48.3164714Z             },
2026-08-28T09:54:48.3164974Z             {
2026-08-28T09:54:48.3165306Z               "path": "crates/spt/tests/shell_e2e.rs",
2026-08-28T09:54:48.3165573Z               "line": 14
2026-08-28T09:54:48.3165821Z             }
2026-08-28T09:54:48.3166078Z           ]
2026-08-28T09:54:48.3166356Z         },
2026-08-28T09:54:48.3166666Z         "unit": {
2026-08-28T09:54:48.3166942Z           "complete": true,
2026-08-28T09:54:48.3167219Z           "evidence": [
2026-08-28T09:54:48.3167461Z             {
2026-08-28T09:54:48.3167831Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3168111Z               "line": 393
2026-08-28T09:54:48.3168363Z             },
2026-08-28T09:54:48.3168617Z             {
2026-08-28T09:54:48.3169069Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3169341Z               "line": 426
2026-08-28T09:54:48.3169589Z             },
2026-08-28T09:54:48.3169848Z             {
2026-08-28T09:54:48.3170228Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3170494Z               "line": 526
2026-08-28T09:54:48.3170749Z             },
2026-08-28T09:54:48.3170997Z             {
2026-08-28T09:54:48.3171369Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3171631Z               "line": 1294
2026-08-28T09:54:48.3171894Z             },
2026-08-28T09:54:48.3172142Z             {
2026-08-28T09:54:48.3172527Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3172799Z               "line": 1490
2026-08-28T09:54:48.3173053Z             },
2026-08-28T09:54:48.3173308Z             {
2026-08-28T09:54:48.3173676Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3173943Z               "line": 1634
2026-08-28T09:54:48.3174195Z             },
2026-08-28T09:54:48.3174524Z             {
2026-08-28T09:54:48.3174863Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.3175140Z               "line": 1196
2026-08-28T09:54:48.3175397Z             },
2026-08-28T09:54:48.3175649Z             {
2026-08-28T09:54:48.3176020Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3176286Z               "line": 682
2026-08-28T09:54:48.3176544Z             },
2026-08-28T09:54:48.3176791Z             {
2026-08-28T09:54:48.3177106Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3177439Z               "line": 32048
2026-08-28T09:54:48.3177696Z             },
2026-08-28T09:54:48.3177958Z             {
2026-08-28T09:54:48.3178269Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3178544Z               "line": 32500
2026-08-28T09:54:48.3178795Z             },
2026-08-28T09:54:48.3179139Z             {
2026-08-28T09:54:48.3179454Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3179725Z               "line": 32917
2026-08-28T09:54:48.3179987Z             }
2026-08-28T09:54:48.3180235Z           ]
2026-08-28T09:54:48.3180497Z         }
2026-08-28T09:54:48.3180756Z       }
2026-08-28T09:54:48.3181006Z     },
2026-08-28T09:54:48.3181251Z     {
2026-08-28T09:54:48.3181538Z       "id": "REQ-SHELL-2",
2026-08-28T09:54:48.3189033Z       "title": "Shell sleep/wake: link-break always closes the link, and always ends the binary it can still PROVE is ours (pre-close instruction + termination timeout, then an AUTHENTICATED force-close -- narrowed from 'always closes the binary' by BAROMETER's REQ-SHELL-KILL-AUTHENTICATED, since an unconditional kill on a recycled pid force-kills an unrelated process TREE; a kill that cannot authenticate its target is refused, named in the log, and the close continues), ephemeral teardown vs persistent offline/relink, wake_command wake-watcher (offline-only, exit-opcode supervision, exponential backoff + give-up), state-keyed wake resolution (dormant/suspended/active-elsewhere; no-reachable refuses — spawn-anywhere branch deferred), spt shutdown owner cascade + api owner-shutdown gated by can_shutdown (CONTEXT Shell sleep/wake)",
2026-08-28T09:54:48.3189408Z       "requiredStages": [
2026-08-28T09:54:48.3189671Z         "impl",
2026-08-28T09:54:48.3189922Z         "unit",
2026-08-28T09:54:48.3190179Z         "int"
2026-08-28T09:54:48.3190433Z       ],
2026-08-28T09:54:48.3190691Z       "stages": {
2026-08-28T09:54:48.3190949Z         "doc": {
2026-08-28T09:54:48.3191302Z           "complete": false,
2026-08-28T09:54:48.3191576Z           "evidence": []
2026-08-28T09:54:48.3191835Z         },
2026-08-28T09:54:48.3192098Z         "impl": {
2026-08-28T09:54:48.3192379Z           "complete": true,
2026-08-28T09:54:48.3192652Z           "evidence": [
2026-08-28T09:54:48.3192905Z             {
2026-08-28T09:54:48.3193290Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.3193567Z               "line": 286
2026-08-28T09:54:48.3193826Z             },
2026-08-28T09:54:48.3194078Z             {
2026-08-28T09:54:48.3194438Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.3194710Z               "line": 1203
2026-08-28T09:54:48.3194963Z             },
2026-08-28T09:54:48.3195221Z             {
2026-08-28T09:54:48.3195583Z               "path": "crates/spt-daemon/src/grants.rs",
2026-08-28T09:54:48.3195860Z               "line": 250
2026-08-28T09:54:48.3196113Z             },
2026-08-28T09:54:48.3196361Z             {
2026-08-28T09:54:48.3196740Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.3197010Z               "line": 1185
2026-08-28T09:54:48.3197267Z             },
2026-08-28T09:54:48.3197525Z             {
2026-08-28T09:54:48.3197901Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3198173Z               "line": 30
2026-08-28T09:54:48.3198421Z             },
2026-08-28T09:54:48.3198684Z             {
2026-08-28T09:54:48.3199128Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3199474Z               "line": 610
2026-08-28T09:54:48.3199730Z             },
2026-08-28T09:54:48.3199987Z             {
2026-08-28T09:54:48.3200359Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3200622Z               "line": 626
2026-08-28T09:54:48.3200874Z             },
2026-08-28T09:54:48.3201126Z             {
2026-08-28T09:54:48.3201485Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3201752Z               "line": 775
2026-08-28T09:54:48.3202012Z             },
2026-08-28T09:54:48.3202325Z             {
2026-08-28T09:54:48.3202687Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3202958Z               "line": 1003
2026-08-28T09:54:48.3203212Z             },
2026-08-28T09:54:48.3203470Z             {
2026-08-28T09:54:48.3203822Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:48.3204100Z               "line": 454
2026-08-28T09:54:48.3204357Z             },
2026-08-28T09:54:48.3204619Z             {
2026-08-28T09:54:48.3204980Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3205289Z               "line": 118
2026-08-28T09:54:48.3205648Z             },
2026-08-28T09:54:48.3205904Z             {
2026-08-28T09:54:48.3206292Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3206573Z               "line": 163
2026-08-28T09:54:48.3206844Z             },
2026-08-28T09:54:48.3207096Z             {
2026-08-28T09:54:48.3207465Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3207742Z               "line": 782
2026-08-28T09:54:48.3207995Z             },
2026-08-28T09:54:48.3208253Z             {
2026-08-28T09:54:48.3208620Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3208920Z               "line": 936
2026-08-28T09:54:48.3209339Z             },
2026-08-28T09:54:48.3209592Z             {
2026-08-28T09:54:48.3209978Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3210252Z               "line": 24
2026-08-28T09:54:48.3210510Z             },
2026-08-28T09:54:48.3210781Z             {
2026-08-28T09:54:48.3211163Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3211444Z               "line": 77
2026-08-28T09:54:48.3211701Z             },
2026-08-28T09:54:48.3211963Z             {
2026-08-28T09:54:48.3212336Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3212668Z               "line": 204
2026-08-28T09:54:48.3212927Z             },
2026-08-28T09:54:48.3213185Z             {
2026-08-28T09:54:48.3213581Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3213848Z               "line": 264
2026-08-28T09:54:48.3214110Z             },
2026-08-28T09:54:48.3214364Z             {
2026-08-28T09:54:48.3214744Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3215022Z               "line": 363
2026-08-28T09:54:48.3215270Z             },
2026-08-28T09:54:48.3215535Z             {
2026-08-28T09:54:48.3215907Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3216184Z               "line": 596
2026-08-28T09:54:48.3216436Z             },
2026-08-28T09:54:48.3216712Z             {
2026-08-28T09:54:48.3217085Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3217361Z               "line": 893
2026-08-28T09:54:48.3217628Z             },
2026-08-28T09:54:48.3217880Z             {
2026-08-28T09:54:48.3218255Z               "path": "crates/spt-net/src/net/shelllink.rs",
2026-08-28T09:54:48.3218522Z               "line": 27
2026-08-28T09:54:48.3218780Z             },
2026-08-28T09:54:48.3219123Z             {
2026-08-28T09:54:48.3219508Z               "path": "crates/spt-net/src/net/shelllink.rs",
2026-08-28T09:54:48.3219772Z               "line": 60
2026-08-28T09:54:48.3220034Z             },
2026-08-28T09:54:48.3220368Z             {
2026-08-28T09:54:48.3220728Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3221002Z               "line": 719
2026-08-28T09:54:48.3221259Z             },
2026-08-28T09:54:48.3221517Z             {
2026-08-28T09:54:48.3221832Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3222123Z               "line": 7737
2026-08-28T09:54:48.3222385Z             },
2026-08-28T09:54:48.3222639Z             {
2026-08-28T09:54:48.3222958Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3223233Z               "line": 22609
2026-08-28T09:54:48.3223555Z             },
2026-08-28T09:54:48.3223807Z             {
2026-08-28T09:54:48.3224126Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3224446Z               "line": 22707
2026-08-28T09:54:48.3224709Z             },
2026-08-28T09:54:48.3224966Z             {
2026-08-28T09:54:48.3225281Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3225778Z               "line": 22735
2026-08-28T09:54:48.3226038Z             },
2026-08-28T09:54:48.3226328Z             {
2026-08-28T09:54:48.3226638Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3226921Z               "line": 22789
2026-08-28T09:54:48.3227192Z             },
2026-08-28T09:54:48.3227460Z             {
2026-08-28T09:54:48.3227780Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3228056Z               "line": 23068
2026-08-28T09:54:48.3228315Z             },
2026-08-28T09:54:48.3228567Z             {
2026-08-28T09:54:48.3228886Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3229234Z               "line": 23169
2026-08-28T09:54:48.3229492Z             },
2026-08-28T09:54:48.3229740Z             {
2026-08-28T09:54:48.3230078Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.3230355Z               "line": 989
2026-08-28T09:54:48.3230604Z             },
2026-08-28T09:54:48.3230923Z             {
2026-08-28T09:54:48.3231250Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.3231529Z               "line": 1031
2026-08-28T09:54:48.3231782Z             }
2026-08-28T09:54:48.3232039Z           ]
2026-08-28T09:54:48.3232302Z         },
2026-08-28T09:54:48.3232565Z         "int": {
2026-08-28T09:54:48.3232846Z           "complete": true,
2026-08-28T09:54:48.3233122Z           "evidence": [
2026-08-28T09:54:48.3233379Z             {
2026-08-28T09:54:48.3233754Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:48.3234086Z               "line": 928
2026-08-28T09:54:48.3234343Z             },
2026-08-28T09:54:48.3234602Z             {
2026-08-28T09:54:48.3234983Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3235264Z               "line": 1224
2026-08-28T09:54:48.3235522Z             },
2026-08-28T09:54:48.3235770Z             {
2026-08-28T09:54:48.3236142Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3236419Z               "line": 2246
2026-08-28T09:54:48.3236679Z             },
2026-08-28T09:54:48.3236927Z             {
2026-08-28T09:54:48.3237324Z               "path": "crates/spt/tests/shell_sleepwake_e2e.rs",
2026-08-28T09:54:48.3237604Z               "line": 18
2026-08-28T09:54:48.3237852Z             }
2026-08-28T09:54:48.3238109Z           ]
2026-08-28T09:54:48.3238363Z         },
2026-08-28T09:54:48.3238626Z         "unit": {
2026-08-28T09:54:48.3238905Z           "complete": true,
2026-08-28T09:54:48.3239342Z           "evidence": [
2026-08-28T09:54:48.3239599Z             {
2026-08-28T09:54:48.3239976Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3240258Z               "line": 1089
2026-08-28T09:54:48.3240515Z             },
2026-08-28T09:54:48.3240772Z             {
2026-08-28T09:54:48.3241145Z               "path": "crates/spt-daemon/src/resting.rs",
2026-08-28T09:54:48.3241416Z               "line": 1257
2026-08-28T09:54:48.3241672Z             },
2026-08-28T09:54:48.3241933Z             {
2026-08-28T09:54:48.3242366Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3242642Z               "line": 1523
2026-08-28T09:54:48.3242910Z             },
2026-08-28T09:54:48.3243172Z             {
2026-08-28T09:54:48.3243534Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3243806Z               "line": 1572
2026-08-28T09:54:48.3244065Z             },
2026-08-28T09:54:48.3244314Z             {
2026-08-28T09:54:48.3244684Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3244961Z               "line": 1596
2026-08-28T09:54:48.3245266Z             },
2026-08-28T09:54:48.3245538Z             {
2026-08-28T09:54:48.3246254Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3246564Z               "line": 1242
2026-08-28T09:54:48.3246816Z             },
2026-08-28T09:54:48.3247068Z             {
2026-08-28T09:54:48.3247449Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3247830Z               "line": 1263
2026-08-28T09:54:48.3248111Z             },
2026-08-28T09:54:48.3248355Z             {
2026-08-28T09:54:48.3248722Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3249079Z               "line": 1299
2026-08-28T09:54:48.3249350Z             },
2026-08-28T09:54:48.3249602Z             {
2026-08-28T09:54:48.3249973Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3250235Z               "line": 1353
2026-08-28T09:54:48.3250498Z             },
2026-08-28T09:54:48.3250761Z             {
2026-08-28T09:54:48.3251128Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3251400Z               "line": 1371
2026-08-28T09:54:48.3251656Z             },
2026-08-28T09:54:48.3251909Z             {
2026-08-28T09:54:48.3252280Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3252554Z               "line": 1410
2026-08-28T09:54:48.3252882Z             },
2026-08-28T09:54:48.3253142Z             {
2026-08-28T09:54:48.3253512Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3253779Z               "line": 1660
2026-08-28T09:54:48.3254038Z             },
2026-08-28T09:54:48.3254291Z             {
2026-08-28T09:54:48.3254668Z               "path": "crates/spt-net/src/net/shelllink.rs",
2026-08-28T09:54:48.3254932Z               "line": 97
2026-08-28T09:54:48.3255187Z             },
2026-08-28T09:54:48.3255454Z             {
2026-08-28T09:54:48.3255821Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3256103Z               "line": 29044
2026-08-28T09:54:48.3256361Z             },
2026-08-28T09:54:48.3256618Z             {
2026-08-28T09:54:48.3256923Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3257192Z               "line": 32127
2026-08-28T09:54:48.3257444Z             },
2026-08-28T09:54:48.3257699Z             {
2026-08-28T09:54:48.3258019Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3258295Z               "line": 32235
2026-08-28T09:54:48.3258549Z             },
2026-08-28T09:54:48.3258797Z             {
2026-08-28T09:54:48.3259187Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3259460Z               "line": 32358
2026-08-28T09:54:48.3259727Z             }
2026-08-28T09:54:48.3259978Z           ]
2026-08-28T09:54:48.3260237Z         }
2026-08-28T09:54:48.3260519Z       }
2026-08-28T09:54:48.3260768Z     },
2026-08-28T09:54:48.3261020Z     {
2026-08-28T09:54:48.3261301Z       "id": "REQ-SHELL-3",
2026-08-28T09:54:48.3266578Z       "title": "Drive channel (owner->shell, REST-only, never-spooled, latest-wins): the owner->shell mirror of sensory for continuous real-time control (scroll/crank/stick/avatar) — a [shell.drive] manifest vocab + EVENT_TYPE_DRIVE frame, delivered to the ONLINE binary only via a single live slot (a new frame supersedes an undelivered one — no spool, no queue, no replay on relink), dropped-with-diagnostic if the shell is offline; cross-node rides the ephemeral link (REST class), never the durable shell spool. Commands = discrete+durable; drive = continuous+ephemeral (CONTEXT:260, minted 2026-06-11 Gateway grill).",
2026-08-28T09:54:48.3266968Z       "requiredStages": [
2026-08-28T09:54:48.3267226Z         "impl",
2026-08-28T09:54:48.3267489Z         "unit",
2026-08-28T09:54:48.3267747Z         "int"
2026-08-28T09:54:48.3268004Z       ],
2026-08-28T09:54:48.3268260Z       "stages": {
2026-08-28T09:54:48.3268517Z         "doc": {
2026-08-28T09:54:48.3268813Z           "complete": false,
2026-08-28T09:54:48.3269175Z           "evidence": []
2026-08-28T09:54:48.3269547Z         },
2026-08-28T09:54:48.3269809Z         "impl": {
2026-08-28T09:54:48.3270100Z           "complete": true,
2026-08-28T09:54:48.3270372Z           "evidence": [
2026-08-28T09:54:48.3270629Z             {
2026-08-28T09:54:48.3270989Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.3271270Z               "line": 308
2026-08-28T09:54:48.3271527Z             },
2026-08-28T09:54:48.3271780Z             {
2026-08-28T09:54:48.3272152Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3272414Z               "line": 48
2026-08-28T09:54:48.3272671Z             },
2026-08-28T09:54:48.3272920Z             {
2026-08-28T09:54:48.3273291Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3273562Z               "line": 351
2026-08-28T09:54:48.3273823Z             },
2026-08-28T09:54:48.3274075Z             {
2026-08-28T09:54:48.3274853Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3275186Z               "line": 360
2026-08-28T09:54:48.3275425Z             },
2026-08-28T09:54:48.3275668Z             {
2026-08-28T09:54:48.3276029Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3276298Z               "line": 387
2026-08-28T09:54:48.3276546Z             },
2026-08-28T09:54:48.3277067Z             {
2026-08-28T09:54:48.3277424Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3277701Z               "line": 791
2026-08-28T09:54:48.3277992Z             },
2026-08-28T09:54:48.3278239Z             {
2026-08-28T09:54:48.3278607Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3278871Z               "line": 843
2026-08-28T09:54:48.3279235Z             },
2026-08-28T09:54:48.3279496Z             {
2026-08-28T09:54:48.3279869Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3280208Z               "line": 870
2026-08-28T09:54:48.3280450Z             },
2026-08-28T09:54:48.3280708Z             {
2026-08-28T09:54:48.3281064Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:48.3281334Z               "line": 51
2026-08-28T09:54:48.3281588Z             },
2026-08-28T09:54:48.3281845Z             {
2026-08-28T09:54:48.3282207Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3282479Z               "line": 403
2026-08-28T09:54:48.3282741Z             },
2026-08-28T09:54:48.3282998Z             {
2026-08-28T09:54:48.3283371Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3283637Z               "line": 446
2026-08-28T09:54:48.3283894Z             },
2026-08-28T09:54:48.3284145Z             {
2026-08-28T09:54:48.3284511Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3284798Z               "line": 945
2026-08-28T09:54:48.3285079Z             },
2026-08-28T09:54:48.3285360Z             {
2026-08-28T09:54:48.3285742Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3286014Z               "line": 135
2026-08-28T09:54:48.3286267Z             },
2026-08-28T09:54:48.3286527Z             {
2026-08-28T09:54:48.3286896Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3287173Z               "line": 884
2026-08-28T09:54:48.3287435Z             },
2026-08-28T09:54:48.3287693Z             {
2026-08-28T09:54:48.3288122Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.3288390Z               "line": 74
2026-08-28T09:54:48.3288647Z             },
2026-08-28T09:54:48.3288901Z             {
2026-08-28T09:54:48.3289361Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.3289661Z               "line": 930
2026-08-28T09:54:48.3289924Z             },
2026-08-28T09:54:48.3290187Z             {
2026-08-28T09:54:48.3290543Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3290821Z               "line": 584
2026-08-28T09:54:48.3291136Z             },
2026-08-28T09:54:48.3291393Z             {
2026-08-28T09:54:48.3291706Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3291984Z               "line": 22849
2026-08-28T09:54:48.3292242Z             }
2026-08-28T09:54:48.3292500Z           ]
2026-08-28T09:54:48.3292758Z         },
2026-08-28T09:54:48.3293011Z         "int": {
2026-08-28T09:54:48.3293296Z           "complete": true,
2026-08-28T09:54:48.3293573Z           "evidence": [
2026-08-28T09:54:48.3293830Z             {
2026-08-28T09:54:48.3294202Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3294487Z               "line": 2295
2026-08-28T09:54:48.3294738Z             },
2026-08-28T09:54:48.3295000Z             {
2026-08-28T09:54:48.3295343Z               "path": "crates/spt/tests/drive_e2e.rs",
2026-08-28T09:54:48.3295611Z               "line": 17
2026-08-28T09:54:48.3295868Z             }
2026-08-28T09:54:48.3296125Z           ]
2026-08-28T09:54:48.3296382Z         },
2026-08-28T09:54:48.3296645Z         "unit": {
2026-08-28T09:54:48.3296932Z           "complete": true,
2026-08-28T09:54:48.3297206Z           "evidence": [
2026-08-28T09:54:48.3297466Z             {
2026-08-28T09:54:48.3297839Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3298115Z               "line": 888
2026-08-28T09:54:48.3298445Z             },
2026-08-28T09:54:48.3298706Z             {
2026-08-28T09:54:48.3299164Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3299432Z               "line": 902
2026-08-28T09:54:48.3299704Z             },
2026-08-28T09:54:48.3299959Z             {
2026-08-28T09:54:48.3300330Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3300607Z               "line": 920
2026-08-28T09:54:48.3300865Z             },
2026-08-28T09:54:48.3301118Z             {
2026-08-28T09:54:48.3301485Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3301818Z               "line": 941
2026-08-28T09:54:48.3302076Z             },
2026-08-28T09:54:48.3302337Z             {
2026-08-28T09:54:48.3302708Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3302984Z               "line": 1330
2026-08-28T09:54:48.3303261Z             },
2026-08-28T09:54:48.3303512Z             {
2026-08-28T09:54:48.3303876Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3304142Z               "line": 1524
2026-08-28T09:54:48.3304414Z             },
2026-08-28T09:54:48.3304671Z             {
2026-08-28T09:54:48.3305038Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3305340Z               "line": 1597
2026-08-28T09:54:48.3305589Z             },
2026-08-28T09:54:48.3305842Z             {
2026-08-28T09:54:48.3306223Z               "path": "crates/spt-daemon/src/shellchan.rs",
2026-08-28T09:54:48.3306495Z               "line": 545
2026-08-28T09:54:48.3306743Z             },
2026-08-28T09:54:48.3307005Z             {
2026-08-28T09:54:48.3307329Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.3307600Z               "line": 1291
2026-08-28T09:54:48.3307860Z             },
2026-08-28T09:54:48.3308113Z             {
2026-08-28T09:54:48.3308423Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3308695Z               "line": 31908
2026-08-28T09:54:48.3309024Z             }
2026-08-28T09:54:48.3309280Z           ]
2026-08-28T09:54:48.3309691Z         }
2026-08-28T09:54:48.3309944Z       }
2026-08-28T09:54:48.3310196Z     },
2026-08-28T09:54:48.3310448Z     {
2026-08-28T09:54:48.3310730Z       "id": "REQ-SHELL-4",
2026-08-28T09:54:48.3315915Z       "title": "Shell tunnel (reliable-ordered opaque byte stream): an owner<->shell link may hold a long-lived, reliable-ordered, link-bound QUIC stream pair carrying opaque wire protocol traffic the channel taxonomy must NOT reinterpret (first consumer usbip URB) — manifest opt-in, not enveloped, not MAC-framed, not spooled; the link lifecycle governs it (a link-break closes the tunnel). Reliable-ordered ⇒ congestion surfaces as lag never loss ⇒ acceptable only on-LAN: the on-LAN posture is documented and the tunnel is NOT proven cross-WAN (CONTEXT:262, minted 2026-06-11 Gateway grill; doyle gate C2).",
2026-08-28T09:54:48.3316388Z       "requiredStages": [
2026-08-28T09:54:48.3316644Z         "doc",
2026-08-28T09:54:48.3316916Z         "impl",
2026-08-28T09:54:48.3317169Z         "unit",
2026-08-28T09:54:48.3317431Z         "int"
2026-08-28T09:54:48.3317690Z       ],
2026-08-28T09:54:48.3317957Z       "stages": {
2026-08-28T09:54:48.3318211Z         "doc": {
2026-08-28T09:54:48.3318496Z           "complete": true,
2026-08-28T09:54:48.3318777Z           "evidence": [
2026-08-28T09:54:48.3319120Z             {
2026-08-28T09:54:48.3319421Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.3319721Z               "line": 342
2026-08-28T09:54:48.3319984Z             },
2026-08-28T09:54:48.3320242Z             {
2026-08-28T09:54:48.3320942Z               "path": "docs/adr/0020-event-envelope-sole-arriving-format-reply-to-removed.md",
2026-08-28T09:54:48.3321213Z               "line": 88
2026-08-28T09:54:48.3326938Z             }
2026-08-28T09:54:48.3327234Z           ]
2026-08-28T09:54:48.3327485Z         },
2026-08-28T09:54:48.3327758Z         "impl": {
2026-08-28T09:54:48.3328043Z           "complete": true,
2026-08-28T09:54:48.3328411Z           "evidence": [
2026-08-28T09:54:48.3328682Z             {
2026-08-28T09:54:48.3329137Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.3329409Z               "line": 322
2026-08-28T09:54:48.3329661Z             },
2026-08-28T09:54:48.3329919Z             {
2026-08-28T09:54:48.3330296Z               "path": "crates/spt-daemon/src/endpoint.rs",
2026-08-28T09:54:48.3330558Z               "line": 61
2026-08-28T09:54:48.3330817Z             },
2026-08-28T09:54:48.3331069Z             {
2026-08-28T09:54:48.3331437Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3331773Z               "line": 288
2026-08-28T09:54:48.3332035Z             },
2026-08-28T09:54:48.3332287Z             {
2026-08-28T09:54:48.3332660Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3332931Z               "line": 315
2026-08-28T09:54:48.3333199Z             },
2026-08-28T09:54:48.3333456Z             {
2026-08-28T09:54:48.3333818Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.3334093Z               "line": 1172
2026-08-28T09:54:48.3334340Z             },
2026-08-28T09:54:48.3334597Z             {
2026-08-28T09:54:48.3334960Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.3335237Z               "line": 2092
2026-08-28T09:54:48.3335498Z             },
2026-08-28T09:54:48.3335751Z             {
2026-08-28T09:54:48.3336123Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.3336395Z               "line": 2104
2026-08-28T09:54:48.3336676Z             },
2026-08-28T09:54:48.3336927Z             {
2026-08-28T09:54:48.3337294Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.3337561Z               "line": 2145
2026-08-28T09:54:48.3337827Z             },
2026-08-28T09:54:48.3338079Z             {
2026-08-28T09:54:48.3338457Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3338733Z               "line": 892
2026-08-28T09:54:48.3339078Z             },
2026-08-28T09:54:48.3339442Z             {
2026-08-28T09:54:48.3339842Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3340117Z               "line": 44
2026-08-28T09:54:48.3340380Z             },
2026-08-28T09:54:48.3340636Z             {
2026-08-28T09:54:48.3341004Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3341280Z               "line": 208
2026-08-28T09:54:48.3341542Z             },
2026-08-28T09:54:48.3341790Z             {
2026-08-28T09:54:48.3342166Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3342495Z               "line": 227
2026-08-28T09:54:48.3342753Z             },
2026-08-28T09:54:48.3343006Z             {
2026-08-28T09:54:48.3343392Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3343668Z               "line": 253
2026-08-28T09:54:48.3343922Z             },
2026-08-28T09:54:48.3344169Z             {
2026-08-28T09:54:48.3344535Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3344828Z               "line": 272
2026-08-28T09:54:48.3345080Z             },
2026-08-28T09:54:48.3345334Z             {
2026-08-28T09:54:48.3345696Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3345968Z               "line": 392
2026-08-28T09:54:48.3346230Z             },
2026-08-28T09:54:48.3346489Z             {
2026-08-28T09:54:48.3346860Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3347132Z               "line": 421
2026-08-28T09:54:48.3347388Z             },
2026-08-28T09:54:48.3347642Z             {
2026-08-28T09:54:48.3348078Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3348354Z               "line": 439
2026-08-28T09:54:48.3348605Z             },
2026-08-28T09:54:48.3348864Z             {
2026-08-28T09:54:48.3349394Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3349742Z               "line": 458
2026-08-28T09:54:48.3349997Z             },
2026-08-28T09:54:48.3350262Z             {
2026-08-28T09:54:48.3350630Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3350906Z               "line": 486
2026-08-28T09:54:48.3351158Z             },
2026-08-28T09:54:48.3351412Z             {
2026-08-28T09:54:48.3351792Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.3352060Z               "line": 949
2026-08-28T09:54:48.3352318Z             },
2026-08-28T09:54:48.3352628Z             {
2026-08-28T09:54:48.3352999Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.3353280Z               "line": 1194
2026-08-28T09:54:48.3353543Z             },
2026-08-28T09:54:48.3353795Z             {
2026-08-28T09:54:48.3354153Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3354425Z               "line": 637
2026-08-28T09:54:48.3354681Z             },
2026-08-28T09:54:48.3354938Z             {
2026-08-28T09:54:48.3355265Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3355528Z               "line": 22906
2026-08-28T09:54:48.3355780Z             }
2026-08-28T09:54:48.3356037Z           ]
2026-08-28T09:54:48.3356299Z         },
2026-08-28T09:54:48.3356552Z         "int": {
2026-08-28T09:54:48.3356843Z           "complete": true,
2026-08-28T09:54:48.3357119Z           "evidence": [
2026-08-28T09:54:48.3357383Z             {
2026-08-28T09:54:48.3357730Z               "path": "crates/spt/tests/tunnel_e2e.rs",
2026-08-28T09:54:48.3358010Z               "line": 18
2026-08-28T09:54:48.3358260Z             }
2026-08-28T09:54:48.3358522Z           ]
2026-08-28T09:54:48.3358780Z         },
2026-08-28T09:54:48.3359128Z         "unit": {
2026-08-28T09:54:48.3359419Z           "complete": true,
2026-08-28T09:54:48.3359681Z           "evidence": [
2026-08-28T09:54:48.3359921Z             {
2026-08-28T09:54:48.3360278Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.3360553Z               "line": 2562
2026-08-28T09:54:48.3360889Z             },
2026-08-28T09:54:48.3361151Z             {
2026-08-28T09:54:48.3361514Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.3361786Z               "line": 2591
2026-08-28T09:54:48.3362047Z             },
2026-08-28T09:54:48.3362296Z             {
2026-08-28T09:54:48.3362663Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3362929Z               "line": 504
2026-08-28T09:54:48.3363188Z             },
2026-08-28T09:54:48.3363573Z             {
2026-08-28T09:54:48.3364026Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3364398Z               "line": 514
2026-08-28T09:54:48.3364660Z             },
2026-08-28T09:54:48.3364922Z             {
2026-08-28T09:54:48.3365299Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3365574Z               "line": 531
2026-08-28T09:54:48.3365820Z             },
2026-08-28T09:54:48.3366079Z             {
2026-08-28T09:54:48.3366459Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3366726Z               "line": 543
2026-08-28T09:54:48.3366980Z             },
2026-08-28T09:54:48.3367232Z             {
2026-08-28T09:54:48.3367609Z               "path": "crates/spt-daemon/src/tunnelhub.rs",
2026-08-28T09:54:48.3367886Z               "line": 555
2026-08-28T09:54:48.3368147Z             },
2026-08-28T09:54:48.3368404Z             {
2026-08-28T09:54:48.3368782Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.3369164Z               "line": 1691
2026-08-28T09:54:48.3369421Z             },
2026-08-28T09:54:48.3369693Z             {
2026-08-28T09:54:48.3370013Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.3370289Z               "line": 1298
2026-08-28T09:54:48.3370542Z             }
2026-08-28T09:54:48.3370805Z           ]
2026-08-28T09:54:48.3371060Z         }
2026-08-28T09:54:48.3371382Z       }
2026-08-28T09:54:48.3371635Z     },
2026-08-28T09:54:48.3371888Z     {
2026-08-28T09:54:48.3372179Z       "id": "REQ-SHELL-5",
2026-08-28T09:54:48.3376021Z       "title": "Shell ownership is owner-type-agnostic: any non-Shell endpoint type may own/spawn/drive/command/link a shell (Gateway the named first) — control-exclusivity keys on the owner endpoint_id, NEVER on the owner's endpoint type. No ownership path (mint, launch, owner-from-link, cmd, drive, tunnel, sleep/wake, owner-shutdown) inspects the owner's type (CONTEXT:264, ratified 2026-06-11 Gateway grill).",
2026-08-28T09:54:48.3376399Z       "requiredStages": [
2026-08-28T09:54:48.3376676Z         "doc",
2026-08-28T09:54:48.3376934Z         "impl",
2026-08-28T09:54:48.3377192Z         "unit",
2026-08-28T09:54:48.3377443Z         "int"
2026-08-28T09:54:48.3377700Z       ],
2026-08-28T09:54:48.3377964Z       "stages": {
2026-08-28T09:54:48.3378221Z         "doc": {
2026-08-28T09:54:48.3378503Z           "complete": true,
2026-08-28T09:54:48.3378785Z           "evidence": [
2026-08-28T09:54:48.3379130Z             {
2026-08-28T09:54:48.3379419Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.3379695Z               "line": 345
2026-08-28T09:54:48.3379948Z             }
2026-08-28T09:54:48.3380201Z           ]
2026-08-28T09:54:48.3380454Z         },
2026-08-28T09:54:48.3380722Z         "impl": {
2026-08-28T09:54:48.3381003Z           "complete": true,
2026-08-28T09:54:48.3381269Z           "evidence": [
2026-08-28T09:54:48.3381526Z             {
2026-08-28T09:54:48.3381913Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3382190Z               "line": 581
2026-08-28T09:54:48.3382444Z             }
2026-08-28T09:54:48.3382701Z           ]
2026-08-28T09:54:48.3382955Z         },
2026-08-28T09:54:48.3383216Z         "int": {
2026-08-28T09:54:48.3383502Z           "complete": true,
2026-08-28T09:54:48.3383783Z           "evidence": [
2026-08-28T09:54:48.3384031Z             {
2026-08-28T09:54:48.3384407Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3384754Z               "line": 1273
2026-08-28T09:54:48.3385008Z             },
2026-08-28T09:54:48.3385266Z             {
2026-08-28T09:54:48.3385632Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.3385900Z               "line": 2323
2026-08-28T09:54:48.3386162Z             },
2026-08-28T09:54:48.3386439Z             {
2026-08-28T09:54:48.3386852Z               "path": "crates/spt/tests/gateway_owner_shell_e2e.rs",
2026-08-28T09:54:48.3387121Z               "line": 23
2026-08-28T09:54:48.3387388Z             }
2026-08-28T09:54:48.3387645Z           ]
2026-08-28T09:54:48.3387955Z         },
2026-08-28T09:54:48.3388209Z         "unit": {
2026-08-28T09:54:48.3388494Z           "complete": true,
2026-08-28T09:54:48.3388767Z           "evidence": [
2026-08-28T09:54:48.3389115Z             {
2026-08-28T09:54:48.3389495Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3389770Z               "line": 1430
2026-08-28T09:54:48.3390037Z             }
2026-08-28T09:54:48.3390289Z           ]
2026-08-28T09:54:48.3390546Z         }
2026-08-28T09:54:48.3390799Z       }
2026-08-28T09:54:48.3391056Z     },
2026-08-28T09:54:48.3391310Z     {
2026-08-28T09:54:48.3391709Z       "id": "REQ-SHELL-ADAPTER-OWNED-DETACHED-SERVICE",
2026-08-28T09:54:48.3446429Z       "title": "RULING OWED (unratified — do NOT satisfy without one): may a shell adapter own a DETACHED process that deliberately OUTLIVES its shell's link-break? Today the answer is 'no, silently, on Windows only'. `shellhost::kill_shell_pid` force-kills with `taskkill /PID <pid> /T /F` — /T is a TREE kill, so `close_shell` takes the shell's descendants with it; the Unix arm is `kill -9 <pid>`, a SINGLE process. So the same adapter's detached child dies on Windows and survives on Linux, undocumented either way. Two ratified positions collide here and neither may be quietly discarded: (a) CONTEXT §Shell model lifecycle states flatly 'the binary never survives a link-break', and the KNOWN-HAZARDS 'stop lies' RCA (two field cases 2026-07-19, one on doyle's own production endpoint) was paid for precisely because a surviving GRANDCHILD was orphaned where 'even a direct-child kill would have missed it' — that hazard is the standing argument FOR /T; (b) a node-singleton service that must not drop every time a shell relinks is a legitimate shape, and flynn's alchemy ships one today (Hub Daemon, CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP, lockfile-guarded), depending on surviving link-breaks to keep a Discord gateway up. Note CREATE_NEW_PROCESS_GROUP does NOT sever ParentProcessId, so it is not an escape from /T — the survival flynn depends on is unverified, not designed-for. MEASURED, not theorized (flynn, this node, 2026-07-25, current spt-core, no branch): the Hub Daemon's ParentProcessId WAS the shell's pid — a direct child, so `/T` reaches it by either reading — and `spt shell teardown alchemy-0` took the daemon to zero processes within 0.1s, still zero across a 15s poll. Nothing restarted it (no bind happens in that window and the adapter's ensure runs only at bind, so 'died and restarted fast' is excluded by construction); recovery needed an operator spawn + re-bind. BLAST RADIUS, the reason this outranks its filing: that daemon also runs alchemy's Watch engine, so tearing down whichever shell happened to parent it silently stops State-change notification delivery NODE-WIDE, for every registered Watch and every owner — cross-Project blocking waits simply never fire, with no error anywhere. It satisfies the LETTER of alchemy's own REQ-HAZARD-WATCH-SILENT-LOSS (the registry entry survives) while its INTENT fails (the delivery engine is dead) — filed separately adapter-side. Option space for the ruling: (1) adapter-owned detached services are UNSUPPORTED — such a service is an AlwaysOnEndpoint (REQ-EP-8 / ADR-0023: resident, daemon-supervised, addressable, independent of agent liveness), NOT a shell's descendant. NOTE this is not a new design: ADR-0023 was ratified 2026-06-21 and EXPLICITLY rejected 'make it a Shell' ('shells are single-owner, driven, control-exclusive; a multi-party bridge inverts every one of those invariants'), and named a Discord bridge as its first consumer — i.e. flynn's exact shape. The gap is DELIVERY (REQ-EP-8 is inactive pending its milestone), not design. (2) allow it behind an explicit manifest declaration that exempts named descendants from the tree kill AND obliges the adapter to reap them — viable only as an EXPLICIT INTERIM with (1) as the stated target, never a permanent answer, because permanence would re-adopt the shape ADR-0023 already rejected. (3) status quo, but then DOCUMENT the platform asymmetry and stop claiming 'never survives' unqualified. CONSUMER LEAN IS (1), argued against his own convenience (flynn 2026-07-25): the service is a shell's descendant only because a shell was the only thing he had that could start something; (2) buys that accident a manifest field plus a reaping obligation he must then honor forever, and leaves 'the next shell that happens to bind' responsible for the service being up — which IS the defect he measured. Available to a consumer TODAY without any core change and without an exemption: start the service out-of-band so no shell parents it (unsupervised, but never tree-killed) — the trade is 'unsupervised but safe' against 'supervised by accident and killed by design'. Whichever wins, the Windows/Unix divergence is a defect in its own right and closes with it — `/T` on one platform and single-pid `kill -9` on the other means adapters cannot reason about descendant lifetime at all. Filed by flynn 2026-07-25 as 'flagging it now rather than after'; code-read by doyle, then field-confirmed by flynn at the cost of one teardown. FIELD CORRECTION (flynn, 2026-07-25, alchemy v0.3.1): the measured kill was NOT /T over-reach — the 'detached' daemon was still the shell's DIRECT CHILD in the process table (CREATE_NO_WINDOW / CREATE_NEW_PROCESS_GROUP / null stdio detach the console and the signal group, never parentage), so any tree walk found it by construction; isolated A/B on this node confirmed a grandchild whose intermediate has exited survives /T. alchemy v0.3.1 ships the fix as one relay hop (the binary re-invokes itself, the intermediate exits, the daemon's ParentProcessId is dead and nothing can walk it) — production-verified (daemon pid 35472, ParentProcessId 11108 dead) — and WITHDREW the Scheduled Task autostart entirely (alchemy ADR-0012 now Rejected; ADR-0013 records the relay hop). alchemy no longer pushes on this seed. What remains core-side is narrowed, not changed in kind: /T's breadth (it reaches detached descendants of any adapter that has NOT done the relay hop) is a hardening item on its own merits, and the Windows/Unix kill asymmetry stands. Job-object caveat filed separately — the relay hop does NOT escape a Job Object: see REQ-SHELL-CLI-SPAWN-JOB-EXPOSURE. PREMISE MOVED UNDERNEATH THIS SEED (BAROMETER, todlando 2026-08-02, REQ-SHELL-KILL-AUTHENTICATED — the ruling itself is UNTOUCHED and still owed): position (a) quotes CONTEXT's flat 'the binary never survives a link-break', and that sentence no longer reads flat. The force-close is now authenticated against the pid+birth pair, so a kill whose target cannot be proven ours is refused and named rather than fired. Option (3)'s demand to 'stop claiming never survives unqualified' is therefore already satisfied in part — but for a DIFFERENT reason than this seed argues (target IDENTITY, not the platform asymmetry), and it changes nothing about the option space here: the Windows /T tree-kill versus Unix single-pid `kill -9` divergence this seed exists to rule on is exactly as it was, and an authenticated kill still takes the whole subtree when it does fire.",
2026-08-28T09:54:48.3447298Z       "requiredStages": [],
2026-08-28T09:54:48.3447575Z       "stages": {
2026-08-28T09:54:48.3447882Z         "doc": {
2026-08-28T09:54:48.3448168Z           "complete": false,
2026-08-28T09:54:48.3448444Z           "evidence": []
2026-08-28T09:54:48.3448712Z         },
2026-08-28T09:54:48.3449060Z         "impl": {
2026-08-28T09:54:48.3449422Z           "complete": false,
2026-08-28T09:54:48.3449694Z           "evidence": []
2026-08-28T09:54:48.3449937Z         },
2026-08-28T09:54:48.3450194Z         "int": {
2026-08-28T09:54:48.3450487Z           "complete": false,
2026-08-28T09:54:48.3450759Z           "evidence": []
2026-08-28T09:54:48.3451011Z         },
2026-08-28T09:54:48.3451274Z         "unit": {
2026-08-28T09:54:48.3451551Z           "complete": false,
2026-08-28T09:54:48.3451827Z           "evidence": []
2026-08-28T09:54:48.3452081Z         }
2026-08-28T09:54:48.3452343Z       }
2026-08-28T09:54:48.3452653Z     },
2026-08-28T09:54:48.3452899Z     {
2026-08-28T09:54:48.3453263Z       "id": "REQ-SHELL-CLI-SPAWN-JOB-EXPOSURE",
2026-08-28T09:54:48.3496639Z       "title": "HARDENING SEED (inactive — no defect claimed): a CLI-side `spt shell spawn` rises inside the launching terminal's Job Object when that job denies breakaway. Launch-path census (2026-07-25): `spt shell spawn` calls `shellhost::launch_shell` IN the CLI process, so the shell binary is spawned by a terminal-resident process and is subject to whatever job the terminal wrapped the CLI in; daemon-side (re)launches (`shellwake` relaunch-on-wake, linkhost relink) spawn from the daemon, which is job-neutral once its own cold-start ladder (WMI → schtasks → breakaway → in-job; REQ-HAZARD-VIEWER-CLOSE-DETACH) escaped. The shared spawn primitive (`daemon::detached_no_inherit`) requests CREATE_BREAKAWAY_FROM_JOB best-effort: a job without JOB_OBJECT_LIMIT_BREAKAWAY_OK denies it (ERROR_ACCESS_DENIED) and the DELIBERATE fallback spawns IN-JOB with the loud diagnostic 'DETACH_BREAKAWAY_DENIED: launching Job Object forbids breakaway; spawned IN-JOB (may be reaped if the launching terminal closes)' — chosen so a spawn that once worked never regresses to failure. spt CANNOT grant itself breakaway: BREAKAWAY_OK is a limit only the job's CREATOR (the terminal) sets on the job; a member process has no say. CONSEQUENCE, field-observed (flynn 2026-07-25, verbatim diagnostic in hand, alchemy #22): job membership is inherited by EVERY descendant regardless of parentage — an adapter's detached service that survives the /T tree kill via a relay hop (dead ParentProcessId, alchemy ADR-0013) does NOT thereby escape the job, so if the job sets JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, closing the launching terminal reaps shell + detached service together, relay hop notwithstanding. Whether any given terminal's job sets KILL_ON_JOB_CLOSE is node-dependent and was NOT measured — the exposure is conditional; the diagnostic is the tell. SELF-HEALING PROPERTY, already true today: the exposure is launch-path-scoped, not instance-permanent — the first daemon-side wake/relaunch re-spawns the binary from the job-neutral daemon while the same canonical id + perch survive (REQ-HAZARD-SHELL-STALE-ONLINE recovery), so cycling an instance through a daemon wake is the zero-code mitigation available now. Option space for the ruling: (a) route CLI-side launch_shell through the same job-neutral ladder the daemon cold-start uses; (b) broker the first spawn through the daemon so no shell ever rises terminal-jobbed; (c) status quo + publicly document the diagnostic as contract, so adapters can read DETACH_BREAKAWAY_DENIED as 'this instance is terminal-coupled until its first daemon wake'. Seeded from flynn's observation; census + fallback semantics code-read by doyle at seed time. FIELD FIRING (2026-07-25 17:47, this node — flynn's owlery fact set + doyle's broker-stderr forensics): the conditional exposure is no longer unmeasured — one field event consistent with KILL_ON_JOB_CLOSE firing. At daemon-stop-begin, flynn's shell (last pid 29036, relaunched 17:15 from flynn's context) and the relay-hopped alchemy Hub Daemon (pid 35472, spawned 16:51 off a DIFFERENT, earlier shell — parent long dead) died in ONE two-second window (17:47:56–58), both abruptly with bookkeeping unrun (info.json still status=online on disk), while the broker itself kept draining to final exit 2m10s LATER (stderr abrupt-end 17:50:05.8) — so the closing job's handle owner was NOT the broker; it was some stop-begin casualty (leading read: the restart-initiating context, see REQ-DAEMON-RESTART-SELF-INTERRUPTION). Disjoint parentage + disjoint spawning contexts + one instant means the job spanned processes from DIFFERENT agent contexts — an INFRA-level job, not a per-terminal one — upgrading the worst case from 'this instance is terminal-coupled' to 'one infra job-close can sweep every shell-descendant on the node at once'. The handle owner is unpinnable post-mortem (4689 process-termination auditing off on this node); recorded open. ⚠ CORRECTION 2026-07-26 (doyle, source-verified answering liam — supersedes this title's launch-path census and its SELF-HEALING claim): local `spt shell relink` AND local wake ALSO spawn IN-PROCESS from the CLI — `spt_daemon::relink_shell` is a LIBRARY call in the CLI process (cli.rs ~12559) → `launch_shell` → `detached_no_inherit` runs its breakaway attempt in the CALLER, so the child inherits the terminal's job on denial; ONLY the cross-node arm (`ref@node`) and daemon-originated relaunches (`shellwake` from the daemon, reconcile) spawn daemon-side. Therefore 'cycling an instance through relink' is NOT the zero-code mitigation for a terminal-invoked local relink — the recorded self-heal holds only for daemon-ORIGINATED wake/relaunch, and a DETACH_BREAKAWAY_DENIED on CLI stdout is local truth about THIS spawn, not a relayed daemon diagnostic. FIX RULED IN (FIELD-TRUTH W1, doyle 2026-07-26, option (b) of the option space scoped to the reachable case): when a daemon is RUNNING, CLI-side `shell spawn`/`relink`/local-wake route the spawn THROUGH the daemon (job-neutral by the cold-start ladder) instead of spawning in-process; daemon not running → today's in-process path UNCHANGED as the fallback, with the diagnostic upgraded to name WHOSE job coupled the child (the launching terminal's, via this CLI process) so a field report can distinguish the paths. The first-spawn-brokered variant (option (b) full) and ladder-in-CLI (option (a)) stay open beyond the reachable-daemon case.",
2026-08-28T09:54:48.3497489Z       "requiredStages": [
2026-08-28T09:54:48.3497744Z         "impl",
2026-08-28T09:54:48.3498004Z         "unit"
2026-08-28T09:54:48.3498258Z       ],
2026-08-28T09:54:48.3498525Z       "stages": {
2026-08-28T09:54:48.3498787Z         "doc": {
2026-08-28T09:54:48.3499163Z           "complete": false,
2026-08-28T09:54:48.3499445Z           "evidence": []
2026-08-28T09:54:48.3499692Z         },
2026-08-28T09:54:48.3499949Z         "impl": {
2026-08-28T09:54:48.3500303Z           "complete": true,
2026-08-28T09:54:48.3500583Z           "evidence": [
2026-08-28T09:54:48.3500841Z             {
2026-08-28T09:54:48.3501250Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.3501531Z               "line": 1339
2026-08-28T09:54:48.3501784Z             },
2026-08-28T09:54:48.3502043Z             {
2026-08-28T09:54:48.3502413Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3502687Z               "line": 91
2026-08-28T09:54:48.3502942Z             },
2026-08-28T09:54:48.3503201Z             {
2026-08-28T09:54:48.3503569Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3503850Z               "line": 96
2026-08-28T09:54:48.3504112Z             },
2026-08-28T09:54:48.3504361Z             {
2026-08-28T09:54:48.3504728Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3504999Z               "line": 101
2026-08-28T09:54:48.3505262Z             },
2026-08-28T09:54:48.3505511Z             {
2026-08-28T09:54:48.3505890Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3506160Z               "line": 155
2026-08-28T09:54:48.3506427Z             },
2026-08-28T09:54:48.3506689Z             {
2026-08-28T09:54:48.3507052Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3507323Z               "line": 172
2026-08-28T09:54:48.3507580Z             },
2026-08-28T09:54:48.3507838Z             {
2026-08-28T09:54:48.3508271Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3508546Z               "line": 182
2026-08-28T09:54:48.3508804Z             },
2026-08-28T09:54:48.3509142Z             {
2026-08-28T09:54:48.3509518Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3509790Z               "line": 198
2026-08-28T09:54:48.3510043Z             },
2026-08-28T09:54:48.3510297Z             {
2026-08-28T09:54:48.3510649Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3510926Z               "line": 234
2026-08-28T09:54:48.3511248Z             },
2026-08-28T09:54:48.3511505Z             {
2026-08-28T09:54:48.3511878Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3512154Z               "line": 252
2026-08-28T09:54:48.3512407Z             },
2026-08-28T09:54:48.3512659Z             {
2026-08-28T09:54:48.3513036Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3513307Z               "line": 260
2026-08-28T09:54:48.3513560Z             },
2026-08-28T09:54:48.3513815Z             {
2026-08-28T09:54:48.3514173Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3514440Z               "line": 305
2026-08-28T09:54:48.3514701Z             },
2026-08-28T09:54:48.3514954Z             {
2026-08-28T09:54:48.3515316Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3515584Z               "line": 503
2026-08-28T09:54:48.3515846Z             },
2026-08-28T09:54:48.3516095Z             {
2026-08-28T09:54:48.3516469Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3516740Z               "line": 515
2026-08-28T09:54:48.3516997Z             },
2026-08-28T09:54:48.3517254Z             {
2026-08-28T09:54:48.3517621Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3517897Z               "line": 535
2026-08-28T09:54:48.3518217Z             },
2026-08-28T09:54:48.3518474Z             {
2026-08-28T09:54:48.3518845Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3519191Z               "line": 587
2026-08-28T09:54:48.3519453Z             },
2026-08-28T09:54:48.3519697Z             {
2026-08-28T09:54:48.3520059Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3520331Z               "line": 632
2026-08-28T09:54:48.3520584Z             },
2026-08-28T09:54:48.3520842Z             {
2026-08-28T09:54:48.3521266Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3521533Z               "line": 647
2026-08-28T09:54:48.3521774Z             },
2026-08-28T09:54:48.3522046Z             {
2026-08-28T09:54:48.3522418Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3522689Z               "line": 503
2026-08-28T09:54:48.3522948Z             },
2026-08-28T09:54:48.3523205Z             {
2026-08-28T09:54:48.3523567Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3523831Z               "line": 627
2026-08-28T09:54:48.3524086Z             },
2026-08-28T09:54:48.3524336Z             {
2026-08-28T09:54:48.3524709Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3524970Z               "line": 726
2026-08-28T09:54:48.3525228Z             },
2026-08-28T09:54:48.3525486Z             {
2026-08-28T09:54:48.3525843Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3526114Z               "line": 736
2026-08-28T09:54:48.3526355Z             },
2026-08-28T09:54:48.3526603Z             {
2026-08-28T09:54:48.3526953Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3527256Z               "line": 258
2026-08-28T09:54:48.3527513Z             },
2026-08-28T09:54:48.3527761Z             {
2026-08-28T09:54:48.3528138Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3528405Z               "line": 269
2026-08-28T09:54:48.3528729Z             },
2026-08-28T09:54:48.3529059Z             {
2026-08-28T09:54:48.3529443Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3529713Z               "line": 289
2026-08-28T09:54:48.3529966Z             },
2026-08-28T09:54:48.3530224Z             {
2026-08-28T09:54:48.3530591Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3530863Z               "line": 300
2026-08-28T09:54:48.3531117Z             },
2026-08-28T09:54:48.3531373Z             {
2026-08-28T09:54:48.3531741Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3532070Z               "line": 321
2026-08-28T09:54:48.3532320Z             },
2026-08-28T09:54:48.3532583Z             {
2026-08-28T09:54:48.3532954Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3533226Z               "line": 341
2026-08-28T09:54:48.3533484Z             },
2026-08-28T09:54:48.3533737Z             {
2026-08-28T09:54:48.3534118Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3534381Z               "line": 406
2026-08-28T09:54:48.3534641Z             },
2026-08-28T09:54:48.3534887Z             {
2026-08-28T09:54:48.3535202Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3535464Z               "line": 22588
2026-08-28T09:54:48.3535708Z             },
2026-08-28T09:54:48.3535970Z             {
2026-08-28T09:54:48.3536276Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3536552Z               "line": 22633
2026-08-28T09:54:48.3536814Z             },
2026-08-28T09:54:48.3537071Z             {
2026-08-28T09:54:48.3537380Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3537654Z               "line": 22812
2026-08-28T09:54:48.3537912Z             },
2026-08-28T09:54:48.3538170Z             {
2026-08-28T09:54:48.3538490Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3538814Z               "line": 23093
2026-08-28T09:54:48.3539152Z             }
2026-08-28T09:54:48.3539405Z           ]
2026-08-28T09:54:48.3539662Z         },
2026-08-28T09:54:48.3539923Z         "int": {
2026-08-28T09:54:48.3540197Z           "complete": false,
2026-08-28T09:54:48.3540475Z           "evidence": []
2026-08-28T09:54:48.3540728Z         },
2026-08-28T09:54:48.3540994Z         "unit": {
2026-08-28T09:54:48.3541274Z           "complete": true,
2026-08-28T09:54:48.3541561Z           "evidence": [
2026-08-28T09:54:48.3541814Z             {
2026-08-28T09:54:48.3542185Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3542515Z               "line": 1128
2026-08-28T09:54:48.3542771Z             },
2026-08-28T09:54:48.3543030Z             {
2026-08-28T09:54:48.3543401Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3543668Z               "line": 1146
2026-08-28T09:54:48.3543921Z             },
2026-08-28T09:54:48.3544178Z             {
2026-08-28T09:54:48.3544546Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3544827Z               "line": 1165
2026-08-28T09:54:48.3545272Z             },
2026-08-28T09:54:48.3545524Z             {
2026-08-28T09:54:48.3545892Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3546154Z               "line": 1184
2026-08-28T09:54:48.3546415Z             },
2026-08-28T09:54:48.3546673Z             {
2026-08-28T09:54:48.3547040Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3547307Z               "line": 1207
2026-08-28T09:54:48.3547564Z             },
2026-08-28T09:54:48.3547874Z             {
2026-08-28T09:54:48.3548243Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3548515Z               "line": 1236
2026-08-28T09:54:48.3548768Z             },
2026-08-28T09:54:48.3549140Z             {
2026-08-28T09:54:48.3549512Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3549792Z               "line": 1255
2026-08-28T09:54:48.3550042Z             },
2026-08-28T09:54:48.3550394Z             {
2026-08-28T09:54:48.3550758Z               "path": "crates/spt-daemon/src/drivehub.rs",
2026-08-28T09:54:48.3551030Z               "line": 1308
2026-08-28T09:54:48.3551288Z             },
2026-08-28T09:54:48.3551544Z             {
2026-08-28T09:54:48.3551922Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3552188Z               "line": 1051
2026-08-28T09:54:48.3552450Z             },
2026-08-28T09:54:48.3552708Z             {
2026-08-28T09:54:48.3553084Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3553421Z               "line": 1064
2026-08-28T09:54:48.3553670Z             },
2026-08-28T09:54:48.3553928Z             {
2026-08-28T09:54:48.3554299Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3554571Z               "line": 1080
2026-08-28T09:54:48.3554825Z             },
2026-08-28T09:54:48.3555082Z             {
2026-08-28T09:54:48.3555464Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3555748Z               "line": 1093
2026-08-28T09:54:48.3556007Z             },
2026-08-28T09:54:48.3556251Z             {
2026-08-28T09:54:48.3556631Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3556899Z               "line": 1109
2026-08-28T09:54:48.3557157Z             },
2026-08-28T09:54:48.3557414Z             {
2026-08-28T09:54:48.3557786Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3558063Z               "line": 1128
2026-08-28T09:54:48.3558317Z             },
2026-08-28T09:54:48.3558581Z             {
2026-08-28T09:54:48.3559028Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3559305Z               "line": 1155
2026-08-28T09:54:48.3559552Z             },
2026-08-28T09:54:48.3559813Z             {
2026-08-28T09:54:48.3560206Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3560554Z               "line": 1170
2026-08-28T09:54:48.3560826Z             },
2026-08-28T09:54:48.3561081Z             {
2026-08-28T09:54:48.3561441Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3561717Z               "line": 1202
2026-08-28T09:54:48.3561971Z             },
2026-08-28T09:54:48.3562224Z             {
2026-08-28T09:54:48.3562600Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3562877Z               "line": 1230
2026-08-28T09:54:48.3563126Z             }
2026-08-28T09:54:48.3563460Z           ]
2026-08-28T09:54:48.3563713Z         }
2026-08-28T09:54:48.3563972Z       }
2026-08-28T09:54:48.3564220Z     },
2026-08-28T09:54:48.3564473Z     {
2026-08-28T09:54:48.3564778Z       "id": "REQ-SHELL-FRAME-VOCAB",
2026-08-28T09:54:48.3578940Z       "title": "The shell relay frame vocabulary is a PUBLISHED contract, not a reverse-engineered one. (flynn spt-alchemy clean-room audit 2026-07-21, doyle code-verified, seed pair item 1.) TODAY: shellchan.rs composes the exact frames a shell binary must parse — shell_command / shell_text / shell_file (+ shell_close, sensory, drive) — but the published export (docs-site/src/shells/) carries ZERO occurrences of those type names; the docs say only 'the shell child parses its own vocabulary', so every adapter author (notify-shell, alchemy) reverse-engineers the frame shapes compatibly from source. FIX: publish, in the shells section of the docs-site export, the frame type names + their attrs (op, xfer-id, path) + body encodings — a shell_command body is a JSON object of named args (positionals zipped against the manifest's declared arg names), a shell_text body is the raw text, a shell_file body is the original filename with the perch-relative landed path in the path attr, a shell_close body is the manifest's pre_close instruction (NOT vocabulary-checked — the vocabulary gates agent commands, the manifest is its own authority over its own binary). Fold in the quoted-composite-tail sharp edge: the vocabulary check REFUSES extra positionals (an op given more args than its declared arity errs, so a quoted composite tail must be ONE argv element). Docs-drift-gated like every published page. Gate: doc — the shells export carries the full frame vocabulary (type names, attrs, body encodings, shell_close) + the files/ landing contract (published together with REQ-SHELL-PERCH-DIR's key so the path attr is resolvable the day it is documented) + the arity sharp edge.",
2026-08-28T09:54:48.3579484Z       "requiredStages": [
2026-08-28T09:54:48.3579769Z         "doc"
2026-08-28T09:54:48.3580024Z       ],
2026-08-28T09:54:48.3580286Z       "stages": {
2026-08-28T09:54:48.3580610Z         "doc": {
2026-08-28T09:54:48.3580886Z           "complete": true,
2026-08-28T09:54:48.3581163Z           "evidence": [
2026-08-28T09:54:48.3581416Z             {
2026-08-28T09:54:48.3581773Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:48.3582032Z               "line": 3
2026-08-28T09:54:48.3582292Z             }
2026-08-28T09:54:48.3582556Z           ]
2026-08-28T09:54:48.3582833Z         },
2026-08-28T09:54:48.3583091Z         "impl": {
2026-08-28T09:54:48.3583373Z           "complete": false,
2026-08-28T09:54:48.3583659Z           "evidence": []
2026-08-28T09:54:48.3583908Z         },
2026-08-28T09:54:48.3584169Z         "int": {
2026-08-28T09:54:48.3584454Z           "complete": false,
2026-08-28T09:54:48.3584732Z           "evidence": []
2026-08-28T09:54:48.3584984Z         },
2026-08-28T09:54:48.3585237Z         "unit": {
2026-08-28T09:54:48.3585522Z           "complete": false,
2026-08-28T09:54:48.3585799Z           "evidence": []
2026-08-28T09:54:48.3586055Z         }
2026-08-28T09:54:48.3586304Z       }
2026-08-28T09:54:48.3586562Z     },
2026-08-28T09:54:48.3586810Z     {
2026-08-28T09:54:48.3587140Z       "id": "REQ-SHELL-KILL-AUTHENTICATED",
2026-08-28T09:54:48.3630024Z       "title": "A RECORDED PID IS NOT KILL AUTHORITY ON THE PRODUCT PATH EITHER: no shell-lifecycle kill fires until the pid+birth PAIR proves the process at that pid is still the one we launched. BAROMETER W2 authenticated the DERIVATION path (`shellinfo::shell_pid_provably_dead` runs the pair test) and left the KILL path believing a bare pid, so the same recycled-pid state that the derived read correctly calls a corpse still routes to `taskkill /PID <pid> /T /F` (unix `kill -9`) against whatever unrelated process now wears that number -- and `/T` takes its whole subtree with it, on the user's machine. Proven reachable by probe, not inferred: a live stranger's pid parked beside a foreign birth stamp is killed by `kill_shell_at` while `shell_pid_provably_dead` calls the same pair a corpse. SITE SHAPE IS TWO CHOKEPOINTS, NOT THREE CALL SITES: `shellhost::kill_shell_at` (reached by `close_shell` and the `spt shell teardown` force path) and `shellwake::kill_waker_at` (reached by `launch_shell`, `close_shell`, `stop_watcher`, and the reconciler), both funnelling into the single `kill_shell_pid` taskkill; the gate therefore lands in the two chokepoints and NO caller changes. THE WAKER HALF NEEDED A WRITE-SIDE MINT BEFORE ANY GATE COULD MEAN ANYTHING: `waker.pid` was written bare, and `relay_liveness(live_pid, None)` is HELD by design (pre-stamp records fail toward alive), so a read-side gate there would have returned Held for every record that exists today and every one written tomorrow -- a VACUOUS gate that proves green. The pair is therefore minted in the waker's single existing write as a two-line `waker.pid` (`<pid>\\n<birth>`): ONE file, ONE write, so the pair is atomic -- a second file has a torn window in which the pid is on disk and the stamp is not, and that window reads Held, which is the vacuous arm reintroduced as a race. Write and every reader move through ONE shared record/read function pair, mirroring `record_shell_launch`/`read_shell_launch`. FAIL-TOWARD-ALIVE IS THE PARSE ARM TOO: an unparseable record reads None and REFUSES the kill while LEAVING the record, because kill-nothing-and-retire-the-pid-file-anyway orphans a live waker while presenting success -- worse than the defect being fixed. UNPROVEN REFUSES: the destructive arm treats unknown as do-not-fire (consequence asymmetry -- a mis-fire force-kills a stranger's tree, a missed kill leaves our own binary running and observable), which FALSIFIES the shipped unconditional promise that a link-break's force-close always kills and \"the binary never survives\", so `close_shell`'s step 3, the REQ-SHELL-2 language, the CONTEXT lifecycle line and KNOWN-HAZARDS 7.58 are amended together with the code rather than one comment patched. THE REFUSAL IS LOUD: every declined kill names the reason and the pid on the channel the close path already speaks, and the bounded confirm loop reports a binary that outlived it -- a quiet wrong state is the un-RCA-able one, and the harm-asymmetry argument has to hold in the log and not only in principle. THIS NARROWS THE MIS-FIRE, IT DOES NOT ELIMINATE IT, AND THE TEXT SAYS SO: on Linux `process_started_at` reads /proc/<pid>/stat field 22, which counts CLK_TCK=100 jiffies, so two processes whose starts fall in the SAME 10ms tick carry an identical stamp and the pair cannot separate them. The window closes from ANY recycled pid to A PID RECYCLED INTO THE SAME 10ms TICK AS THE RECORDED START -- which requires our process to die AND the OS to hand its number to a new process inside one tick, a precondition that is its own mitigation. Windows is unaffected (FILETIME, far finer resolution). Measured by hertz on kitsubito; recorded verbatim so nobody re-derives it. THE ASYMMETRY IS WHY THIS IS THE KILL PATH'S SENTENCE TO WRITE: the same predicate with the same imprecision is SAFE on the derivation side and UNSAFE here -- Held means 'stays stale' for a derived read and 'fire the kill' for a destructive one, so only the kill side carries the residual harm and only the kill side has to declare it. Image-path corroboration (which would unify this rule with the rig-side technique in KNOWN-HAZARDS 7.58) is filed past as releases#120, deliberately not taken in a closing milestone. MIGRATION WINDOW, NAMED NOT SILENT: pre-W2 shell records and pre-fix waker records carry no stamp, read Held on existence alone, and keep today's bare-pid kill until their next launch writes a pair. DOWNGRADE DIRECTION, NAMED: an OLD binary reading the NEW two-line `waker.pid` parse-fails to None, which reads as no-pid and refuses the kill -- missed-kill, not mis-fire, the safe polarity. Gate: impl -- the pair gate in both chokepoints, the shared waker record/read pair with the two-line format, every waker.pid reader moved onto it, the loud refusal arms, and the confirm-loop survivor report; unit -- a recycled pid (live, birth mismatch) is NOT killed where the shipped code kills it, a genuine own-process pair (Held) IS still killed so the gate is not vacuous, an absent stamp keeps the pre-stamp kill, Unproven refuses, an unparseable waker record refuses AND leaves the record in place (asserted together, since retire-anyway passes a kill-count assertion alone), and the refusal is observable rather than silent; int -- hertz's probe inverted: a live stranger parked beside a foreign stamp SURVIVES `kill_shell_at` while `shell_pid_provably_dead` still calls the pair a corpse (the control), with the victim checked through `try_wait` on the held handle rather than a pid-existence probe, which reads alive for an already-killed process while the handle is open.",
2026-08-28T09:54:48.3630834Z       "requiredStages": [
2026-08-28T09:54:48.3631116Z         "doc",
2026-08-28T09:54:48.3631407Z         "impl",
2026-08-28T09:54:48.3631693Z         "unit",
2026-08-28T09:54:48.3631975Z         "int"
2026-08-28T09:54:48.3632257Z       ],
2026-08-28T09:54:48.3632546Z       "stages": {
2026-08-28T09:54:48.3632834Z         "doc": {
2026-08-28T09:54:48.3633134Z           "complete": true,
2026-08-28T09:54:48.3633439Z           "evidence": [
2026-08-28T09:54:48.3633716Z             {
2026-08-28T09:54:48.3634088Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:48.3634422Z               "line": 896
2026-08-28T09:54:48.3634786Z             }
2026-08-28T09:54:48.3635605Z           ]
2026-08-28T09:54:48.3636011Z         },
2026-08-28T09:54:48.3636445Z         "impl": {
2026-08-28T09:54:48.3636789Z           "complete": true,
2026-08-28T09:54:48.3637061Z           "evidence": [
2026-08-28T09:54:48.3637319Z             {
2026-08-28T09:54:48.3637846Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3638155Z               "line": 676
2026-08-28T09:54:48.3638414Z             },
2026-08-28T09:54:48.3638676Z             {
2026-08-28T09:54:48.3639219Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3639626Z               "line": 708
2026-08-28T09:54:48.3639883Z             },
2026-08-28T09:54:48.3640143Z             {
2026-08-28T09:54:48.3640522Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3640803Z               "line": 843
2026-08-28T09:54:48.3641070Z             },
2026-08-28T09:54:48.3641333Z             {
2026-08-28T09:54:48.3641714Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3641990Z               "line": 163
2026-08-28T09:54:48.3642253Z             },
2026-08-28T09:54:48.3642507Z             {
2026-08-28T09:54:48.3642882Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3643162Z               "line": 181
2026-08-28T09:54:48.3643413Z             },
2026-08-28T09:54:48.3643680Z             {
2026-08-28T09:54:48.3644043Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3644324Z               "line": 205
2026-08-28T09:54:48.3644572Z             },
2026-08-28T09:54:48.3644834Z             {
2026-08-28T09:54:48.3645211Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3645492Z               "line": 307
2026-08-28T09:54:48.3645757Z             }
2026-08-28T09:54:48.3646013Z           ]
2026-08-28T09:54:48.3646280Z         },
2026-08-28T09:54:48.3646542Z         "int": {
2026-08-28T09:54:48.3646900Z           "complete": true,
2026-08-28T09:54:48.3647181Z           "evidence": [
2026-08-28T09:54:48.3647444Z             {
2026-08-28T09:54:48.3647864Z               "path": "crates/spt-daemon/tests/shell_kill_auth.rs",
2026-08-28T09:54:48.3648165Z               "line": 43
2026-08-28T09:54:48.3648430Z             }
2026-08-28T09:54:48.3648688Z           ]
2026-08-28T09:54:48.3648940Z         },
2026-08-28T09:54:48.3649293Z         "unit": {
2026-08-28T09:54:48.3649584Z           "complete": true,
2026-08-28T09:54:48.3649852Z           "evidence": [
2026-08-28T09:54:48.3650176Z             {
2026-08-28T09:54:48.3650543Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3650818Z               "line": 1724
2026-08-28T09:54:48.3651078Z             },
2026-08-28T09:54:48.3651330Z             {
2026-08-28T09:54:48.3651712Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3651993Z               "line": 1739
2026-08-28T09:54:48.3652259Z             },
2026-08-28T09:54:48.3652513Z             {
2026-08-28T09:54:48.3652894Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3653170Z               "line": 1773
2026-08-28T09:54:48.3653429Z             },
2026-08-28T09:54:48.3653690Z             {
2026-08-28T09:54:48.3654060Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3654346Z               "line": 1795
2026-08-28T09:54:48.3654598Z             },
2026-08-28T09:54:48.3654855Z             {
2026-08-28T09:54:48.3655228Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3655504Z               "line": 1890
2026-08-28T09:54:48.3655766Z             },
2026-08-28T09:54:48.3656023Z             {
2026-08-28T09:54:48.3656402Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3656674Z               "line": 1917
2026-08-28T09:54:48.3656937Z             },
2026-08-28T09:54:48.3657185Z             {
2026-08-28T09:54:48.3657565Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3657899Z               "line": 1945
2026-08-28T09:54:48.3658162Z             },
2026-08-28T09:54:48.3658434Z             {
2026-08-28T09:54:48.3658806Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3659177Z               "line": 1963
2026-08-28T09:54:48.3659434Z             }
2026-08-28T09:54:48.3659695Z           ]
2026-08-28T09:54:48.3659948Z         }
2026-08-28T09:54:48.3660201Z       }
2026-08-28T09:54:48.3660450Z     },
2026-08-28T09:54:48.3660717Z     {
2026-08-28T09:54:48.3661084Z       "id": "REQ-SHELL-LIST-DERIVED-PROVENANCE",
2026-08-28T09:54:48.3671324Z       "title": "SEED (inactive — observability, perri-backed 2026-07-26): a status a reader can act on should be distinguishable from a status a record actually holds. Since REQ-HAZARD-SHELL-STALE-ONLINE, `shell list` renders DERIVED online-ness (recorded status AND pid-liveness), deliberately healing poisoned records at the read gate — but nothing marks WHICH rows were healed, so an agent doing forensics reads the healed view and infers a clean record (field, twice on 2026-07-26: liam inferred close_shell had run when the raw info.json still said online over a corpse pid and proposed spending flynn's live instance to manufacture a specimen they already owned; perri independently named the same misread class from their own work). Shape at activation: an additive marker on the --json row when derived != recorded (e.g. recorded_status alongside status, or derived=true) — additive-evolution posture, text view unchanged or minimally annotated; NEVER a behavior change to the derivation itself. Kin: REQ-DAEMON-BITS-AMBIGUITY (silent wrong-state a human catches only by staring at the right field) and the NEVER-SEALING-OBSERVABILITY candidate — same class, view-vs-truth.",
2026-08-28T09:54:48.3671677Z       "requiredStages": [],
2026-08-28T09:54:48.3671942Z       "stages": {
2026-08-28T09:54:48.3672198Z         "doc": {
2026-08-28T09:54:48.3672575Z           "complete": false,
2026-08-28T09:54:48.3672847Z           "evidence": []
2026-08-28T09:54:48.3673108Z         },
2026-08-28T09:54:48.3673371Z         "impl": {
2026-08-28T09:54:48.3673657Z           "complete": false,
2026-08-28T09:54:48.3673938Z           "evidence": []
2026-08-28T09:54:48.3674192Z         },
2026-08-28T09:54:48.3674459Z         "int": {
2026-08-28T09:54:48.3674743Z           "complete": false,
2026-08-28T09:54:48.3675022Z           "evidence": []
2026-08-28T09:54:48.3675274Z         },
2026-08-28T09:54:48.3675538Z         "unit": {
2026-08-28T09:54:48.3675900Z           "complete": false,
2026-08-28T09:54:48.3676176Z           "evidence": []
2026-08-28T09:54:48.3676449Z         }
2026-08-28T09:54:48.3676697Z       }
2026-08-28T09:54:48.3676958Z     },
2026-08-28T09:54:48.3677205Z     {
2026-08-28T09:54:48.3677522Z       "id": "REQ-SHELL-PERCH-DIR",
2026-08-28T09:54:48.3693223Z       "title": "A shell binary can mechanically resolve where its files land. (flynn spt-alchemy clean-room audit 2026-07-21, doyle code-verified, seed pair item 2, P1 — HARD-GATES flynn's alchemy W4.) TODAY: `spt shell send --file` lands the blob at <shell-perch>/files/<xfer-id>-<name> and the shell_file frame's path attr is PERCH-RELATIVE (files/...) — but the spawn template substitution keys are ONLY {id}/{adapter_name}/{link_token} (shellhost.rs fill_spawn_command) and the spawned child inherits the BROKER's cwd, so no mechanical perch resolution exists: the binary cannot turn the frame's path into a real file without guessing SPT_HOME layout. DOYLE RULING, both halves binding: the frame KEEPS the perch-relative path (an absolute path in a spooled frame LIES across perch moves and node boundaries — frames outlive layouts); the fix is an ADDITIVE {perch_dir} spawn-template substitution key (opt-in — templates that do not use it are byte-identical, N-1-safe by construction) filled with the shell perch dir so the binary receives its root at spawn and joins the frame's relative path against it. REFUSED, recorded so it is not re-proposed: blessing SPT_HOME layout guessing as an interim contract. Published landing contract rides REQ-SHELL-FRAME-VOCAB's page. Sequence-not-version given to flynn (no version floor before it ships). Gate: doc — the {perch_dir} key on the manifest spawn-template docs + the files/<xfer-id>-<name> landing shape on the frame-vocab page; impl — fill_spawn_command passes perch_dir alongside id/adapter_name/link_token; unit — the filled template carries the perch dir as ONE argv element (the multi-word/space path shape the argv-fill hazard exists for) and a template WITHOUT the key is byte-identical pre/post (the N-1 guarantee); int — a real spawned shell binary given {perch_dir} resolves a shell_file frame's perch-relative path to the landed blob and proves the read.",
2026-08-28T09:54:48.3693734Z       "requiredStages": [
2026-08-28T09:54:48.3693992Z         "doc",
2026-08-28T09:54:48.3694258Z         "impl",
2026-08-28T09:54:48.3694524Z         "unit",
2026-08-28T09:54:48.3694787Z         "int"
2026-08-28T09:54:48.3695049Z       ],
2026-08-28T09:54:48.3695307Z       "stages": {
2026-08-28T09:54:48.3695575Z         "doc": {
2026-08-28T09:54:48.3695858Z           "complete": true,
2026-08-28T09:54:48.3696137Z           "evidence": [
2026-08-28T09:54:48.3696395Z             {
2026-08-28T09:54:48.3696752Z               "path": "docs-site/src/shells/frames.md",
2026-08-28T09:54:48.3697025Z               "line": 141
2026-08-28T09:54:48.3697277Z             }
2026-08-28T09:54:48.3697540Z           ]
2026-08-28T09:54:48.3697793Z         },
2026-08-28T09:54:48.3698059Z         "impl": {
2026-08-28T09:54:48.3698349Z           "complete": true,
2026-08-28T09:54:48.3698637Z           "evidence": [
2026-08-28T09:54:48.3698896Z             {
2026-08-28T09:54:48.3699357Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3699638Z               "line": 211
2026-08-28T09:54:48.3699897Z             }
2026-08-28T09:54:48.3700150Z           ]
2026-08-28T09:54:48.3700474Z         },
2026-08-28T09:54:48.3700864Z         "int": {
2026-08-28T09:54:48.3706437Z           "complete": true,
2026-08-28T09:54:48.3706784Z           "evidence": [
2026-08-28T09:54:48.3707041Z             {
2026-08-28T09:54:48.3707447Z               "path": "crates/spt/tests/shell_perch_dir_e2e.rs",
2026-08-28T09:54:48.3707713Z               "line": 55
2026-08-28T09:54:48.3707975Z             }
2026-08-28T09:54:48.3708238Z           ]
2026-08-28T09:54:48.3708495Z         },
2026-08-28T09:54:48.3708749Z         "unit": {
2026-08-28T09:54:48.3709155Z           "complete": true,
2026-08-28T09:54:48.3709540Z           "evidence": [
2026-08-28T09:54:48.3709799Z             {
2026-08-28T09:54:48.3710194Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3710471Z               "line": 1367
2026-08-28T09:54:48.3710729Z             },
2026-08-28T09:54:48.3710982Z             {
2026-08-28T09:54:48.3711358Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3711636Z               "line": 1462
2026-08-28T09:54:48.3711900Z             }
2026-08-28T09:54:48.3712167Z           ]
2026-08-28T09:54:48.3712419Z         }
2026-08-28T09:54:48.3712679Z       }
2026-08-28T09:54:48.3712926Z     },
2026-08-28T09:54:48.3713179Z     {
2026-08-28T09:54:48.3713547Z       "id": "REQ-SHELL-PERSISTENT-BOOT-RESTORE",
2026-08-28T09:54:48.3746324Z       "title": "A `persistent` SHELL COMES BACK AFTER A NODE RESTART, WHICH IS THE ONE CASE THE CONTRACT'S OWN SENTENCE PROMISES AND THE IMPLEMENTATION NEVER HANDLED. CONTEXT.md states it plainly -- a persistent shell is automatically brought online whenever its owner endpoint is online -- and the shipped code honors that across a graceful suspend->wake rest edge ONLY. A machine restart produces no such edge and there is no boot-time restoration at all, so after a reboot every persistent shell on the node stays down until a human runs `relink` by hand, with no surface saying so. Field, HFENDULEAM 2026-08-01: the fleet came up at 01:11 and NOT ONE persistent shell came back; the two instances that did were relaunched by a human at 01:27, sixteen minutes later. TWO INDEPENDENT GATES, both of which must fall or the promise stays broken. GATE 1, no restoration path: the five launch sites all require either an explicit command, a rest edge, or a `wake_command` the adapter may deliberately not declare, and daemon boot starts only the servicehost sweep and the wake reconciler. GATE 2, the stale record blocks the cascade even when an edge DOES arrive: the to_active arm gates on the RECORDED status being offline, and a machine death breaks no link, so the close that would write offline never runs and the record says online over a corpse forever. LEG (a) HEALS THE RECORD TO THE TRUTH, with a BIRTH-STAMPED probe rather than bare pid liveness -- a pid namespace resets at boot, so a corpse pid can be REUSED by an unrelated process, and a reused pid reads alive, makes the derived status read online, and makes `relink` refuse SHELL_ALREADY_ONLINE: the one command that recovers the instance refusing on the very state that is wrong. TWO STAMPS ARE PARKED, NOT ONE, AND THE REASON IS A PLATFORM ASYMMETRY THAT WOULD OTHERWISE SHIP SILENTLY BROKEN ON LINUX: `process_started_at` returns a Windows FILETIME (absolute, comparable across boots) but on Linux returns field 22 of /proc/<pid>/stat, which is JIFFIES SINCE BOOT and resets every boot, so a value recorded before a restart is indistinguishable from a fresh one after it. The NATIVE stamp is therefore used for one question only -- the same-pid-different-process PAIR test within a single boot, mirroring `liveness::relay_liveness` -- and an ABSOLUTE epoch-ms launch stamp is parked beside it for the cross-boot question. LEG (b) IS A ONCE-PER-DAEMON-GENERATION BOOT SWEEP relaunching persistent instances whose owners are online, and its discriminant is THE LAUNCH STAMP PREDATES THE BOOT INSTANT, which preserves the class-c force-kill ruling BY CONSTRUCTION rather than by a second rule: a force-kill during steady-state operation leaves a corpse launched AFTER boot, so it is never spontaneously relaunched and the mid-deploy exe-overwrite hazard that ruling protects is untouched. A NAMED SLACK CONSTANT absorbs boot-instant jitter so a process launched moments after boot is never misclassified as a corpse. Gate: impl -- the two stamps parked at the two production pid-write sites (the census is authoritative: five LAUNCH sites funnel through exactly TWO pid writes), the birth-stamped death probe, the record heal in the daemon-side reconciler guarded on an actual change of the recorded value, the boot-instant helper on both platforms, and the boot sweep with its predates-boot discriminant plus slack; unit -- a reused pid (same pid, different birth stamp) reads GONE where bare-pid liveness reads alive (the row the shipped probe cannot pass), a same-pid-same-birth process reads HELD, the heal writes offline over a stale online record and writes NOTHING when the record already matches the truth (the guard asserted by counting writes, since a heal that rewrites every cycle passes any state-only assertion), a corpse launched BEFORE the boot instant is eligible for restore while one launched AFTER it is NOT (the class-c pair, asserted together since either alone passes an implementation that restores everything or nothing), and an instance whose OWNER is offline is not restored even though its corpse predates boot.",
2026-08-28T09:54:48.3747010Z       "requiredStages": [
2026-08-28T09:54:48.3747273Z         "doc",
2026-08-28T09:54:48.3747531Z         "impl",
2026-08-28T09:54:48.3747907Z         "unit"
2026-08-28T09:54:48.3748283Z       ],
2026-08-28T09:54:48.3748611Z       "stages": {
2026-08-28T09:54:48.3748871Z         "doc": {
2026-08-28T09:54:48.3749262Z           "complete": true,
2026-08-28T09:54:48.3749534Z           "evidence": [
2026-08-28T09:54:48.3749783Z             {
2026-08-28T09:54:48.3750092Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.3750365Z               "line": 386
2026-08-28T09:54:48.3750632Z             }
2026-08-28T09:54:48.3750894Z           ]
2026-08-28T09:54:48.3751150Z         },
2026-08-28T09:54:48.3751505Z         "impl": {
2026-08-28T09:54:48.3751781Z           "complete": true,
2026-08-28T09:54:48.3752058Z           "evidence": [
2026-08-28T09:54:48.3752311Z             {
2026-08-28T09:54:48.3752693Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3752969Z               "line": 506
2026-08-28T09:54:48.3753232Z             },
2026-08-28T09:54:48.3753494Z             {
2026-08-28T09:54:48.3753871Z               "path": "crates/spt-daemon/src/shellhost.rs",
2026-08-28T09:54:48.3754151Z               "line": 565
2026-08-28T09:54:48.3754408Z             },
2026-08-28T09:54:48.3754727Z             {
2026-08-28T09:54:48.3755100Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3755381Z               "line": 614
2026-08-28T09:54:48.3755638Z             },
2026-08-28T09:54:48.3755886Z             {
2026-08-28T09:54:48.3756266Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3756536Z               "line": 658
2026-08-28T09:54:48.3756804Z             },
2026-08-28T09:54:48.3757056Z             {
2026-08-28T09:54:48.3757447Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3757733Z               "line": 696
2026-08-28T09:54:48.3757996Z             },
2026-08-28T09:54:48.3758253Z             {
2026-08-28T09:54:48.3758621Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3758897Z               "line": 730
2026-08-28T09:54:48.3759243Z             },
2026-08-28T09:54:48.3759512Z             {
2026-08-28T09:54:48.3759856Z               "path": "crates/spt-store/src/proc.rs",
2026-08-28T09:54:48.3760142Z               "line": 348
2026-08-28T09:54:48.3760400Z             },
2026-08-28T09:54:48.3760662Z             {
2026-08-28T09:54:48.3761034Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3761310Z               "line": 164
2026-08-28T09:54:48.3761569Z             },
2026-08-28T09:54:48.3761896Z             {
2026-08-28T09:54:48.3762267Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3762538Z               "line": 213
2026-08-28T09:54:48.3762805Z             }
2026-08-28T09:54:48.3763057Z           ]
2026-08-28T09:54:48.3763314Z         },
2026-08-28T09:54:48.3763582Z         "int": {
2026-08-28T09:54:48.3763862Z           "complete": false,
2026-08-28T09:54:48.3764154Z           "evidence": []
2026-08-28T09:54:48.3764408Z         },
2026-08-28T09:54:48.3764682Z         "unit": {
2026-08-28T09:54:48.3765016Z           "complete": true,
2026-08-28T09:54:48.3765287Z           "evidence": [
2026-08-28T09:54:48.3765549Z             {
2026-08-28T09:54:48.3766280Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3767153Z               "line": 944
2026-08-28T09:54:48.3767792Z             },
2026-08-28T09:54:48.3768350Z             {
2026-08-28T09:54:48.3769108Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3769963Z               "line": 1031
2026-08-28T09:54:48.3770607Z             },
2026-08-28T09:54:48.3771166Z             {
2026-08-28T09:54:48.3771847Z               "path": "crates/spt-daemon/src/shellwake.rs",
2026-08-28T09:54:48.3772702Z               "line": 1566
2026-08-28T09:54:48.3773337Z             },
2026-08-28T09:54:48.3773884Z             {
2026-08-28T09:54:48.3774552Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3775405Z               "line": 443
2026-08-28T09:54:48.3776030Z             },
2026-08-28T09:54:48.3776602Z             {
2026-08-28T09:54:48.3777269Z               "path": "crates/spt-store/src/shellinfo.rs",
2026-08-28T09:54:48.3778152Z               "line": 488
2026-08-28T09:54:48.3778821Z             }
2026-08-28T09:54:48.3779474Z           ]
2026-08-28T09:54:48.3780018Z         }
2026-08-28T09:54:48.3780581Z       }
2026-08-28T09:54:48.3781106Z     },
2026-08-28T09:54:48.3781630Z     {
2026-08-28T09:54:48.3782225Z       "id": "REQ-SHELL-RELINK-FORCE",
2026-08-28T09:54:48.3824733Z       "title": "`spt shell relink --force` STOPS A RUNNING SHELL BINARY, PROVES IT STOPPED, AND ONLY THEN RELINKS -- and the already-online refusal stays the DEFAULT, because an unflagged relink that silently killed a running binary would make the recovery verb destructive. Today `relink` is the online switch for an OFFLINE instance and refuses `AlreadyOnline` when the DERIVED liveness probe (REQ-HAZARD-SHELL-STALE-ONLINE: local, record-independent) says the binary is really up; the field ask (releases#6) is the instance that IS up and needs a stop-then-restart without churning its canonical id through teardown+spawn. The stop half is the EXISTING link-break close (`shellhost::close_shell`, REQ-SHELL-2): pre_close instruction, close_timeout_ms termination window, the AUTHENTICATED force-kill (REQ-SHELL-KILL-AUTHENTICATED), link token retired to RETIRED_TOKEN_FILE so pending spool rows survive the rotation, drive slot + tunnel cleared. No second stop path is minted -- a force relink that closed the link any other way would be a second, divergent definition of a link-break. TWO REFUSALS ARE PART OF THE DELIVERABLE, NOT HARDENING AROUND IT. (1) EPHEMERAL REFUSES: `close_shell`'s divergence is `ephemeral => TornDown` -- perch and spool history ERASED, mint slot freed -- so a stop-then-restart built on it converts an ephemeral instance into a teardown and then relinks a record that no longer exists. Force therefore refuses on `ephemeral` with its own diagnostic BEFORE the close runs; an erase is irreversible and a refusal is recoverable, the same polarity KNOWN-HAZARDS applies to every perch-directory decision. THE REFUSAL NAMES THE ESCAPE (doyle, 2026-08-04): it states that an ephemeral instance has no stop-and-restart shape and points at the teardown + spawn pair that does what was meant, so the refusal TEACHES rather than dead-ends -- a consumer who is told only 'no' discovers the reason by losing a spool somewhere else. (2) A SURVIVOR REFUSES THE RELAUNCH: `close_shell` returns `Ok(Offline)` even when it printed `SHELL_CLOSE_SURVIVOR` -- the kill can be REFUSED by the pid+birth authentication (a recycled pid), or the binary can outlive the window -- and launching there yields TWO binaries for one instance, one of them unreachable through the retired token and invisible to the record. Force re-probes the recorded pid after the close and refuses the launch while it is still alive, naming the pid, rather than doubling the instance. THE RE-PROBE IS THE KILL PATH'S OWN AUTHENTICATION, NEVER A BARE PID-ALIVE CHECK (doyle, 2026-08-04): pid reuse is MEASURED on this fleet (a same-boot recycle inside 30s, both processes user-owned), so a bare probe manufactures a false survivor and the refusal then names an innocent process -- it runs `relay_liveness` over the pid+birth PAIR, the identical predicate `kill_shell_at` authenticates with, and the diagnostic states WHICH verdict it got (pair matched = our binary outlived the close; a live pid with no stamp = survivor and recycled pid indistinguishable; unprovable identity) so a reader can tell a true survivor from a stale record. The pair is captured BEFORE the close, because the close retires the record it lives in -- `close_shell` removes the pid file and an authentication-refused kill retires it too, so a probe reading the perch afterwards finds nothing and calls every survivor a success. A pid whose stamp DISAGREES reads Gone and RELAUNCHES: our binary is genuinely dead and the number was recycled, which is the case a bare probe would have called a survivor. Neither refusal is inferable from `CloseOutcome`, which is why the force arm carries them rather than the close. CROSS-NODE WITHOUT A WIRE BUMP: `shell_link_remote` already carries `args: &[String]` and the serve's SHELL_LINK_RELINK arm ignores args today, so an OLD peer handed a force flag runs a PLAIN relink and replies `ok: already online` -- the caller would read its force as honored. The discriminator needs no new op and no version gate: when force was requested, `already online` is a FAILURE, not the goal state. The serve's idempotent-ok reading of AlreadyOnline is correct for an unflagged relink and false under the flag, so the flag changes how the reply is read on both sides. Gate: doc -- the shells overview states the flag, both refusals, and the cross-node skew reading, since the ephemeral refusal is the one a consumer will otherwise discover by losing a spool; impl -- the flag on the CLI verb, the force parameter threaded through relink_shell_from/relink_shell, the pre-close ephemeral refusal, the post-close survivor probe, the remote arm passing the flag and re-reading `already online` as failure; unit -- an ephemeral instance is REFUSED and its perch SURVIVES the call (asserted together: a refusal that still erased would pass a return-value assertion alone), a surviving pid refuses the launch and NO second binary is spawned, an unflagged relink on a genuinely-online instance still refuses AlreadyOnline (the default is not vacuously widened), and a forced relink on an already-OFFLINE instance is the plain relink (the flag is not a second code path for the ordinary case); int -- the e2e stops a real running mock shell binary and relinks it under the SAME canonical id, with the pre-close/kill/relaunch ordering observable rather than assumed.",
2026-08-28T09:54:48.3866349Z       "requiredStages": [
2026-08-28T09:54:48.3867026Z         "doc",
2026-08-28T09:54:48.3867796Z         "impl",
2026-08-28T09:54:48.3868363Z         "unit",
2026-08-28T09:54:48.3868925Z         "int"
2026-08-28T09:54:48.3869593Z       ],
2026-08-28T09:54:48.3870150Z       "stages": {
2026-08-28T09:54:48.3870737Z         "doc": {
2026-08-28T09:54:48.3871338Z           "complete": true,
2026-08-28T09:54:48.3872005Z           "evidence": [
2026-08-28T09:54:48.3872616Z             {
2026-08-28T09:54:48.3873208Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.3873937Z               "line": 356
2026-08-28T09:54:48.3874553Z             },
2026-08-28T09:54:48.3875112Z             {
2026-08-28T09:54:48.3875875Z               "path": "docs-site/src/shells/overview.md",
2026-08-28T09:54:48.3876729Z               "line": 114
2026-08-28T09:54:48.3877354Z             }
2026-08-28T09:54:48.3877899Z           ]
2026-08-28T09:54:48.3878456Z         },
2026-08-28T09:54:48.3879100Z         "impl": {
2026-08-28T09:54:48.3879705Z           "complete": true,
2026-08-28T09:54:48.3880367Z           "evidence": [
2026-08-28T09:54:48.3880987Z             {
2026-08-28T09:54:48.3881659Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3882509Z               "line": 540
2026-08-28T09:54:48.3883207Z             },
2026-08-28T09:54:48.3883783Z             {
2026-08-28T09:54:48.3884460Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3885314Z               "line": 568
2026-08-28T09:54:48.3885936Z             },
2026-08-28T09:54:48.3886506Z             {
2026-08-28T09:54:48.3887183Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3888027Z               "line": 660
2026-08-28T09:54:48.3888654Z             },
2026-08-28T09:54:48.3889312Z             {
2026-08-28T09:54:48.3889989Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3890857Z               "line": 681
2026-08-28T09:54:48.3891486Z             },
2026-08-28T09:54:48.3892053Z             {
2026-08-28T09:54:48.3892726Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3893567Z               "line": 864
2026-08-28T09:54:48.3894203Z             },
2026-08-28T09:54:48.3894781Z             {
2026-08-28T09:54:48.3895463Z               "path": "crates/spt-net/src/net/shelllink.rs",
2026-08-28T09:54:48.3896322Z               "line": 46
2026-08-28T09:54:48.3896938Z             },
2026-08-28T09:54:48.3897506Z             {
2026-08-28T09:54:48.3898121Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3898907Z               "line": 23077
2026-08-28T09:54:48.3899666Z             },
2026-08-28T09:54:48.3900229Z             {
2026-08-28T09:54:48.3900850Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3901769Z               "line": 23137
2026-08-28T09:54:48.3902418Z             },
2026-08-28T09:54:48.3902976Z             {
2026-08-28T09:54:48.3903596Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3904345Z               "line": 23147
2026-08-28T09:54:48.3905256Z             },
2026-08-28T09:54:48.3905913Z             {
2026-08-28T09:54:48.3907057Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3907899Z               "line": 23186
2026-08-28T09:54:48.3908739Z             }
2026-08-28T09:54:48.3909444Z           ]
2026-08-28T09:54:48.3910095Z         },
2026-08-28T09:54:48.3910652Z         "int": {
2026-08-28T09:54:48.3911248Z           "complete": true,
2026-08-28T09:54:48.3911911Z           "evidence": [
2026-08-28T09:54:48.3912534Z             {
2026-08-28T09:54:48.3913226Z               "path": "crates/spt/tests/shell_relink_force_e2e.rs",
2026-08-28T09:54:48.3914113Z               "line": 78
2026-08-28T09:54:48.3914721Z             }
2026-08-28T09:54:48.3915286Z           ]
2026-08-28T09:54:48.3915849Z         },
2026-08-28T09:54:48.3916389Z         "unit": {
2026-08-28T09:54:48.3917014Z           "complete": true,
2026-08-28T09:54:48.3917684Z           "evidence": [
2026-08-28T09:54:48.3918297Z             {
2026-08-28T09:54:48.3919050Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3919895Z               "line": 1196
2026-08-28T09:54:48.3920534Z             },
2026-08-28T09:54:48.3921101Z             {
2026-08-28T09:54:48.3921769Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3922617Z               "line": 1244
2026-08-28T09:54:48.3923252Z             },
2026-08-28T09:54:48.3923814Z             {
2026-08-28T09:54:48.3924486Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3925338Z               "line": 1279
2026-08-28T09:54:48.3925951Z             },
2026-08-28T09:54:48.3926596Z             {
2026-08-28T09:54:48.3927278Z               "path": "crates/spt-daemon/src/linkhost.rs",
2026-08-28T09:54:48.3928129Z               "line": 1301
2026-08-28T09:54:48.3928770Z             },
2026-08-28T09:54:48.3929414Z             {
2026-08-28T09:54:48.3930034Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.3930815Z               "line": 31890
2026-08-28T09:54:48.3931443Z             }
2026-08-28T09:54:48.3932010Z           ]
2026-08-28T09:54:48.3932539Z         }
2026-08-28T09:54:48.3933084Z       }
2026-08-28T09:54:48.3933620Z     },
2026-08-28T09:54:48.3934226Z     {
2026-08-28T09:54:48.3935099Z       "id": "REQ-SOFT-END-PRESERVES-LIVE-LISTENER",
2026-08-28T09:54:48.3951566Z       "title": "F-2 (REMOTE-TRUTH triage §F-2, field-repro'd hall-bf 2026-07-04): a /clear must not sever a SURVIVING poll listener's relay address — post-clear owl-path send hit NO_PERCH while ready was present and the inject path healthy. ROOT (source-certain): the relay registry row (id→addr + owning pid, registered by the LISTENER process itself at PollListener::bind, listener.rs:109) is DELETED by the adapter's soft `api session-end` (reporting.rs:231) fired for the DEPARTING session at /clear; but the poll listener SURVIVES /clear (a session-independent process, still bound on its port), so the deletion destroys a TRUE row. The C-2 boundary re-stamp (REQ-HAZARD-BOUNDARY-READY-STRAND) restores ready + status online but CANNOT re-register — only the listener process knows its socket addr — so every subsequent send lookup misses → NO_PERCH forever (until a listener restart re-binds). FIX: the SOFT arm of cmd_session_end unregisters CONDITIONALLY through the single liveness resolver (liveness::is_registry_entry_alive — the KH 2.5-aware resolver clean_stale_entries routes through): a row whose owner is still ALIVE is PRESERVED (the row is LISTENER-scoped truth, not session-scoped; the listener outliving /clear is the designed shape), a dead/offline row is removed (today's cleanup kept). The ERASE arm stays unconditional (a hard wipe orphans any listener; its row dies with the endpoint). Every legitimate teardown keeps its OWN unregister untouched: PollListener close/close_busy/Drop (listener.rs) and the stop verbs (cli.rs:5574/:10924). Defense-in-depth unchanged: a wrongly-preserved dead row still self-heals at delivery (deliver.rs failed-dial sweep, REQ-HAZARD-REGISTRY-STALE-CLEAN). Red-first: soft session-end with a live registered owner → row survives and lookup still resolves (pre-fix: deleted → NO_PERCH).",
2026-08-28T09:54:48.3967218Z       "requiredStages": [
2026-08-28T09:54:48.3967892Z         "impl",
2026-08-28T09:54:48.3968477Z         "unit"
2026-08-28T09:54:48.3969222Z       ],
2026-08-28T09:54:48.3969771Z       "stages": {
2026-08-28T09:54:48.3970351Z         "doc": {
2026-08-28T09:54:48.3970959Z           "complete": false,
2026-08-28T09:54:48.3971640Z           "evidence": []
2026-08-28T09:54:48.3972275Z         },
2026-08-28T09:54:48.3972819Z         "impl": {
2026-08-28T09:54:48.3973441Z           "complete": true,
2026-08-28T09:54:48.3974108Z           "evidence": [
2026-08-28T09:54:48.3974723Z             {
2026-08-28T09:54:48.3975394Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3976238Z               "line": 348
2026-08-28T09:54:48.3976868Z             }
2026-08-28T09:54:48.3977434Z           ]
2026-08-28T09:54:48.3977963Z         },
2026-08-28T09:54:48.3978509Z         "int": {
2026-08-28T09:54:48.3979186Z           "complete": false,
2026-08-28T09:54:48.3980145Z           "evidence": []
2026-08-28T09:54:48.3981059Z         },
2026-08-28T09:54:48.3981905Z         "unit": {
2026-08-28T09:54:48.3982497Z           "complete": true,
2026-08-28T09:54:48.3983159Z           "evidence": [
2026-08-28T09:54:48.3983776Z             {
2026-08-28T09:54:48.3984443Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3985283Z               "line": 1592
2026-08-28T09:54:48.3985922Z             },
2026-08-28T09:54:48.3986707Z             {
2026-08-28T09:54:48.3987724Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3988590Z               "line": 1614
2026-08-28T09:54:48.3989308Z             },
2026-08-28T09:54:48.3989879Z             {
2026-08-28T09:54:48.3990538Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.3991377Z               "line": 1633
2026-08-28T09:54:48.3991999Z             }
2026-08-28T09:54:48.3992553Z           ]
2026-08-28T09:54:48.3993095Z         }
2026-08-28T09:54:48.3993643Z       }
2026-08-28T09:54:48.3994162Z     },
2026-08-28T09:54:48.3994775Z     {
2026-08-28T09:54:48.3995415Z       "id": "REQ-SPAWN-COLLISION-GUARD-LIVE-DUP",
2026-08-28T09:54:48.4002954Z       "title": "W4 (LIFECYCLE-TRUTH): single-flight wake per endpoint — the WAKE/RESUME respawn seam must not launch twice for one wake. ROOT (perri parentage + recovered filing): one wake processed TWICE within 1s — broker (306368) spawned two identical `launch --cli ccs --id flynn --resume <sid>` 1s apart, both survived; check-then-spawn TOCTOU in the spawn-side guard. DAMAGE: duplicate-perch writers STOMP info.json (the duplicate's compact re-stamped an OLD sid over a fresh /clear rotation -> injects routed to the contended record and lost). FIX: single-flight wake per endpoint (claim on the perch record or broker-side in-flight set keyed by id; second wake within the window = no-op ack), and the spawn path re-checks liveness UNDER the claim. Int: two concurrent wake requests -> exactly one launch tree.",
2026-08-28T09:54:48.4009947Z       "requiredStages": [
2026-08-28T09:54:48.4010586Z         "impl",
2026-08-28T09:54:48.4011163Z         "unit",
2026-08-28T09:54:48.4011731Z         "int"
2026-08-28T09:54:48.4012287Z       ],
2026-08-28T09:54:48.4012819Z       "stages": {
2026-08-28T09:54:48.4013415Z         "doc": {
2026-08-28T09:54:48.4014006Z           "complete": false,
2026-08-28T09:54:48.4014688Z           "evidence": []
2026-08-28T09:54:48.4015311Z         },
2026-08-28T09:54:48.4015857Z         "impl": {
2026-08-28T09:54:48.4016462Z           "complete": true,
2026-08-28T09:54:48.4017226Z           "evidence": [
2026-08-28T09:54:48.4017837Z             {
2026-08-28T09:54:48.4018503Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4019443Z               "line": 271
2026-08-28T09:54:48.4020077Z             },
2026-08-28T09:54:48.4020644Z             {
2026-08-28T09:54:48.4021293Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4022128Z               "line": 7745
2026-08-28T09:54:48.4022752Z             }
2026-08-28T09:54:48.4023314Z           ]
2026-08-28T09:54:48.4023864Z         },
2026-08-28T09:54:48.4024465Z         "int": {
2026-08-28T09:54:48.4025061Z           "complete": true,
2026-08-28T09:54:48.4025719Z           "evidence": [
2026-08-28T09:54:48.4026326Z             {
2026-08-28T09:54:48.4027080Z               "path": "crates/spt-daemon/tests/wake_single_flight.rs",
2026-08-28T09:54:48.4028005Z               "line": 127
2026-08-28T09:54:48.4028642Z             }
2026-08-28T09:54:48.4029281Z           ]
2026-08-28T09:54:48.4029821Z         },
2026-08-28T09:54:48.4030369Z         "unit": {
2026-08-28T09:54:48.4030997Z           "complete": true,
2026-08-28T09:54:48.4031668Z           "evidence": [
2026-08-28T09:54:48.4032278Z             {
2026-08-28T09:54:48.4032941Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4033783Z               "line": 12409
2026-08-28T09:54:48.4034439Z             }
2026-08-28T09:54:48.4035001Z           ]
2026-08-28T09:54:48.4035540Z         }
2026-08-28T09:54:48.4036095Z       }
2026-08-28T09:54:48.4036619Z     },
2026-08-28T09:54:48.4037150Z     {
2026-08-28T09:54:48.4037745Z       "id": "REQ-SPAWN-FRESH-TRUTHFUL",
2026-08-28T09:54:48.4048211Z       "title": "REGISTRY-LIFECYCLE W3 (ADR-0041 decision 5, spawn-fresh): endpoint create is TRUTHFUL at the broker, atomically — spawn policies split Fresh/RejectExisting vs ResumeOrReuse; new KIND_SPAWN_FRESH wire verb with TYPED conflict (distinct kind fails LOUD on an N-1 broker vs a silently-ignored serde-defaulted field), sharing the single-flight/PTY spawn body; Fresh at AlreadyLive/lost-race returns the typed conflict NEVER Spawned(existing); CLI contract exit 1 + stable ENDPOINT_CREATE_CONFLICT:<id> token + no attach + no state mutation + never kills the live session; omitted --resume keeps the documented create-default (fresh-and-conflict, same as explicit --create); preflight stays UX-only (cannot close TOCTOU). Gate: impl — policy split + verb + CLI contract; unit — intent-aware decision matrix; int — create-over-live E2E (exit 1, exact token, no attach, same broker PID) + concurrent-fresh race (one Created one Conflict, never two children, never Reused-as-success) + mixed fresh/resume race + offline/raw-Active+stale-ledger create + N-1 IPC loud-fail never-Created; doc — ADR-0041 + CLI reference regen (docs-drift gate: xtask gen, no internal codes in clap help).",
2026-08-28T09:54:48.4059095Z       "requiredStages": [
2026-08-28T09:54:48.4059763Z         "doc",
2026-08-28T09:54:48.4060327Z         "impl",
2026-08-28T09:54:48.4060933Z         "unit",
2026-08-28T09:54:48.4061492Z         "int"
2026-08-28T09:54:48.4062139Z       ],
2026-08-28T09:54:48.4062720Z       "stages": {
2026-08-28T09:54:48.4063306Z         "doc": {
2026-08-28T09:54:48.4063902Z           "complete": true,
2026-08-28T09:54:48.4064560Z           "evidence": [
2026-08-28T09:54:48.4065180Z             {
2026-08-28T09:54:48.4065901Z               "path": "docs/adr/0041-endpoint-lifecycle-truth.md",
2026-08-28T09:54:48.4066803Z               "line": 66
2026-08-28T09:54:48.4067536Z             }
2026-08-28T09:54:48.4068468Z           ]
2026-08-28T09:54:48.4069139Z         },
2026-08-28T09:54:48.4069698Z         "impl": {
2026-08-28T09:54:48.4070299Z           "complete": true,
2026-08-28T09:54:48.4070974Z           "evidence": [
2026-08-28T09:54:48.4071742Z             {
2026-08-28T09:54:48.4072433Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.4073257Z               "line": 108
2026-08-28T09:54:48.4073875Z             },
2026-08-28T09:54:48.4074538Z             {
2026-08-28T09:54:48.4075182Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.4075999Z               "line": 835
2026-08-28T09:54:48.4076631Z             },
2026-08-28T09:54:48.4077180Z             {
2026-08-28T09:54:48.4077848Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4078700Z               "line": 5737
2026-08-28T09:54:48.4079446Z             },
2026-08-28T09:54:48.4080014Z             {
2026-08-28T09:54:48.4080672Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4081564Z               "line": 6119
2026-08-28T09:54:48.4082207Z             },
2026-08-28T09:54:48.4082755Z             {
2026-08-28T09:54:48.4083433Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4084262Z               "line": 7847
2026-08-28T09:54:48.4084878Z             },
2026-08-28T09:54:48.4085460Z             {
2026-08-28T09:54:48.4086594Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.4087492Z               "line": 364
2026-08-28T09:54:48.4088131Z             },
2026-08-28T09:54:48.4088694Z             {
2026-08-28T09:54:48.4089487Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.4090359Z               "line": 377
2026-08-28T09:54:48.4090989Z             },
2026-08-28T09:54:48.4091551Z             {
2026-08-28T09:54:48.4092200Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.4100100Z               "line": 546
2026-08-28T09:54:48.4100820Z             },
2026-08-28T09:54:48.4101393Z             {
2026-08-28T09:54:48.4102004Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4102788Z               "line": 2925
2026-08-28T09:54:48.4103422Z             },
2026-08-28T09:54:48.4103981Z             {
2026-08-28T09:54:48.4104577Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4105360Z               "line": 4557
2026-08-28T09:54:48.4106104Z             },
2026-08-28T09:54:48.4106661Z             {
2026-08-28T09:54:48.4107266Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4108026Z               "line": 4655
2026-08-28T09:54:48.4108709Z             },
2026-08-28T09:54:48.4109480Z             {
2026-08-28T09:54:48.4110133Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4110932Z               "line": 4692
2026-08-28T09:54:48.4111571Z             }
2026-08-28T09:54:48.4112366Z           ]
2026-08-28T09:54:48.4112949Z         },
2026-08-28T09:54:48.4113582Z         "int": {
2026-08-28T09:54:48.4114160Z           "complete": true,
2026-08-28T09:54:48.4114828Z           "evidence": [
2026-08-28T09:54:48.4115436Z             {
2026-08-28T09:54:48.4116135Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:48.4117007Z               "line": 126
2026-08-28T09:54:48.4117632Z             },
2026-08-28T09:54:48.4118183Z             {
2026-08-28T09:54:48.4118877Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:48.4119869Z               "line": 164
2026-08-28T09:54:48.4120490Z             },
2026-08-28T09:54:48.4121076Z             {
2026-08-28T09:54:48.4121773Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:48.4122646Z               "line": 203
2026-08-28T09:54:48.4123265Z             },
2026-08-28T09:54:48.4123833Z             {
2026-08-28T09:54:48.4124520Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:48.4125407Z               "line": 253
2026-08-28T09:54:48.4126168Z             },
2026-08-28T09:54:48.4127209Z             {
2026-08-28T09:54:48.4128053Z               "path": "crates/spt-daemon/tests/spawn_truth.rs",
2026-08-28T09:54:48.4128929Z               "line": 282
2026-08-28T09:54:48.4129680Z             },
2026-08-28T09:54:48.4130234Z             {
2026-08-28T09:54:48.4130930Z               "path": "crates/spt/tests/run_no_dup_session_e2e.rs",
2026-08-28T09:54:48.4131886Z               "line": 304
2026-08-28T09:54:48.4132614Z             }
2026-08-28T09:54:48.4133168Z           ]
2026-08-28T09:54:48.4133703Z         },
2026-08-28T09:54:48.4134239Z         "unit": {
2026-08-28T09:54:48.4134840Z           "complete": true,
2026-08-28T09:54:48.4135784Z           "evidence": [
2026-08-28T09:54:48.4136493Z             {
2026-08-28T09:54:48.4137145Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4137932Z               "line": 5005
2026-08-28T09:54:48.4138566Z             }
2026-08-28T09:54:48.4139209Z           ]
2026-08-28T09:54:48.4139779Z         }
2026-08-28T09:54:48.4140312Z       }
2026-08-28T09:54:48.4140965Z     },
2026-08-28T09:54:48.4141634Z     {
2026-08-28T09:54:48.4142220Z       "id": "REQ-SPOOL-TAKE-AUDIT",
2026-08-28T09:54:48.4145353Z       "title": "W5 (LIFECYCLE-TRUTH, RCA cost: proving WHO took delivered=1 rows burned an hour): the spool records the taker per row — leg enum (relay-backlog / hook-poll / idle-inject / psyche) + sid/pid + taken_at ms — surfaced by a --json debug read. Additive column, no schema break (delivered rows already retained).",
2026-08-28T09:54:48.4149060Z       "requiredStages": [
2026-08-28T09:54:48.4149765Z         "impl",
2026-08-28T09:54:48.4150339Z         "unit"
2026-08-28T09:54:48.4150886Z       ],
2026-08-28T09:54:48.4151430Z       "stages": {
2026-08-28T09:54:48.4152012Z         "doc": {
2026-08-28T09:54:48.4152602Z           "complete": false,
2026-08-28T09:54:48.4153268Z           "evidence": []
2026-08-28T09:54:48.4153892Z         },
2026-08-28T09:54:48.4154451Z         "impl": {
2026-08-28T09:54:48.4155057Z           "complete": true,
2026-08-28T09:54:48.4156233Z           "evidence": [
2026-08-28T09:54:48.4157129Z             {
2026-08-28T09:54:48.4157855Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.4158714Z               "line": 143
2026-08-28T09:54:48.4159505Z             },
2026-08-28T09:54:48.4160067Z             {
2026-08-28T09:54:48.4160842Z               "path": "crates/spt-daemon/src/relay.rs",
2026-08-28T09:54:48.4161681Z               "line": 64
2026-08-28T09:54:48.4162290Z             },
2026-08-28T09:54:48.4162859Z             {
2026-08-28T09:54:48.4163499Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:48.4164314Z               "line": 154
2026-08-28T09:54:48.4164944Z             },
2026-08-28T09:54:48.4165516Z             {
2026-08-28T09:54:48.4166159Z               "path": "crates/spt-msg/src/ready.rs",
2026-08-28T09:54:48.4166975Z               "line": 194
2026-08-28T09:54:48.4167586Z             },
2026-08-28T09:54:48.4168217Z             {
2026-08-28T09:54:48.4168878Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4169808Z               "line": 460
2026-08-28T09:54:48.4170433Z             },
2026-08-28T09:54:48.4170994Z             {
2026-08-28T09:54:48.4171639Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4172461Z               "line": 478
2026-08-28T09:54:48.4173137Z             },
2026-08-28T09:54:48.4173713Z             {
2026-08-28T09:54:48.4174369Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4175179Z               "line": 577
2026-08-28T09:54:48.4175814Z             },
2026-08-28T09:54:48.4176375Z             {
2026-08-28T09:54:48.4177014Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4177826Z               "line": 657
2026-08-28T09:54:48.4178445Z             },
2026-08-28T09:54:48.4179099Z             {
2026-08-28T09:54:48.4179758Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4180582Z               "line": 717
2026-08-28T09:54:48.4181226Z             },
2026-08-28T09:54:48.4181809Z             {
2026-08-28T09:54:48.4182449Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.4183307Z               "line": 534
2026-08-28T09:54:48.4183947Z             },
2026-08-28T09:54:48.4184514Z             {
2026-08-28T09:54:48.4185173Z               "path": "crates/spt/src/api/delivery.rs",
2026-08-28T09:54:48.4185997Z               "line": 564
2026-08-28T09:54:48.4186713Z             },
2026-08-28T09:54:48.4187274Z             {
2026-08-28T09:54:48.4187917Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:48.4189078Z               "line": 136
2026-08-28T09:54:48.4189737Z             },
2026-08-28T09:54:48.4190299Z             {
2026-08-28T09:54:48.4190919Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4192176Z               "line": 2452
2026-08-28T09:54:48.4192871Z             },
2026-08-28T09:54:48.4193475Z             {
2026-08-28T09:54:48.4194096Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4194983Z               "line": 2498
2026-08-28T09:54:48.4195618Z             }
2026-08-28T09:54:48.4196194Z           ]
2026-08-28T09:54:48.4196744Z         },
2026-08-28T09:54:48.4197287Z         "int": {
2026-08-28T09:54:48.4197896Z           "complete": false,
2026-08-28T09:54:48.4198573Z           "evidence": []
2026-08-28T09:54:48.4199318Z         },
2026-08-28T09:54:48.4199874Z         "unit": {
2026-08-28T09:54:48.4200481Z           "complete": true,
2026-08-28T09:54:48.4201164Z           "evidence": [
2026-08-28T09:54:48.4201794Z             {
2026-08-28T09:54:48.4202472Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4203301Z               "line": 972
2026-08-28T09:54:48.4203926Z             },
2026-08-28T09:54:48.4204498Z             {
2026-08-28T09:54:48.4205156Z               "path": "crates/spt-store/src/spool.rs",
2026-08-28T09:54:48.4205983Z               "line": 1012
2026-08-28T09:54:48.4206618Z             }
2026-08-28T09:54:48.4207194Z           ]
2026-08-28T09:54:48.4207737Z         }
2026-08-28T09:54:48.4208271Z       }
2026-08-28T09:54:48.4208804Z     },
2026-08-28T09:54:48.4209414Z     {
2026-08-28T09:54:48.4210020Z       "id": "REQ-STAMP-CONVERGENCE-ORDER",
2026-08-28T09:54:48.4218292Z       "title": "RETIRED at W2 verify-first (doyle 2026-07-22): the C3 poll-vs-reap ordering race (hertz emphasys RCA 2026-07-16, P1) was ALREADY CLOSED by REQ-CONTROL-STAMP-CONVERGENCE (ADR-0041 decision 4, REGISTRY-LIFECYCLE W2 build todlando 2026-07-17 — one day after the RCA). Code-verified chain: the exit-waiter reap (broker.rs stamp_reaped) bumps a per-endpoint StampSlot generation UNDER the stamp-write serial then clears (the comment names the emphasys C3 window); the KIND_SESSIONS handler snapshots stamp_gen under the log lock; converge_perch_stamps validates snap_gen under the same write serial and REFUSES stale (STAMP_STALE_SKIP) — a pre-reap snapshot can never relatch controlled=true. Full stage coverage rides that REQ: unit stale_snapshot_stamp_write_refused_after_reap_generation_bump + int endpoint_lifecycle.rs:488. Kept as a stable pointer; no build owed.",
2026-08-28T09:54:48.4226309Z       "requiredStages": [],
2026-08-28T09:54:48.4226974Z       "stages": {
2026-08-28T09:54:48.4227542Z         "doc": {
2026-08-28T09:54:48.4228133Z           "complete": false,
2026-08-28T09:54:48.4228824Z           "evidence": []
2026-08-28T09:54:48.4229638Z         },
2026-08-28T09:54:48.4230196Z         "impl": {
2026-08-28T09:54:48.4230807Z           "complete": false,
2026-08-28T09:54:48.4231488Z           "evidence": []
2026-08-28T09:54:48.4232133Z         },
2026-08-28T09:54:48.4232701Z         "int": {
2026-08-28T09:54:48.4233307Z           "complete": false,
2026-08-28T09:54:48.4233988Z           "evidence": []
2026-08-28T09:54:48.4234606Z         },
2026-08-28T09:54:48.4235155Z         "unit": {
2026-08-28T09:54:48.4235745Z           "complete": false,
2026-08-28T09:54:48.4236428Z           "evidence": []
2026-08-28T09:54:48.4237050Z         }
2026-08-28T09:54:48.4237586Z       }
2026-08-28T09:54:48.4238112Z     },
2026-08-28T09:54:48.4238642Z     {
2026-08-28T09:54:48.4239342Z       "id": "REQ-START-1",
2026-08-28T09:54:48.4240300Z       "title": "Adapters never resolve SPT_HOME; binary on PATH; api bridging only",
2026-08-28T09:54:48.4241386Z       "requiredStages": [
2026-08-28T09:54:48.4242048Z         "impl",
2026-08-28T09:54:48.4242618Z         "unit"
2026-08-28T09:54:48.4243252Z       ],
2026-08-28T09:54:48.4243791Z       "stages": {
2026-08-28T09:54:48.4244364Z         "doc": {
2026-08-28T09:54:48.4244972Z           "complete": false,
2026-08-28T09:54:48.4245652Z           "evidence": []
2026-08-28T09:54:48.4246267Z         },
2026-08-28T09:54:48.4246829Z         "impl": {
2026-08-28T09:54:48.4247472Z           "complete": true,
2026-08-28T09:54:48.4248137Z           "evidence": [
2026-08-28T09:54:48.4248809Z             {
2026-08-28T09:54:48.4249550Z               "path": "crates/spt-store/src/seed.rs",
2026-08-28T09:54:48.4250440Z               "line": 16
2026-08-28T09:54:48.4251069Z             }
2026-08-28T09:54:48.4251621Z           ]
2026-08-28T09:54:48.4252175Z         },
2026-08-28T09:54:48.4252727Z         "int": {
2026-08-28T09:54:48.4253321Z           "complete": false,
2026-08-28T09:54:48.4254008Z           "evidence": []
2026-08-28T09:54:48.4254648Z         },
2026-08-28T09:54:48.4255190Z         "unit": {
2026-08-28T09:54:48.4255792Z           "complete": true,
2026-08-28T09:54:48.4256449Z           "evidence": [
2026-08-28T09:54:48.4257228Z             {
2026-08-28T09:54:48.4257886Z               "path": "crates/spt-store/src/seed.rs",
2026-08-28T09:54:48.4258697Z               "line": 48
2026-08-28T09:54:48.4259409Z             },
2026-08-28T09:54:48.4259965Z             {
2026-08-28T09:54:48.4260605Z               "path": "crates/spt-store/src/seed.rs",
2026-08-28T09:54:48.4261424Z               "line": 63
2026-08-28T09:54:48.4262045Z             }
2026-08-28T09:54:48.4262598Z           ]
2026-08-28T09:54:48.4263140Z         }
2026-08-28T09:54:48.4263672Z       }
2026-08-28T09:54:48.4264220Z     },
2026-08-28T09:54:48.4264777Z     {
2026-08-28T09:54:48.4265345Z       "id": "REQ-START-2",
2026-08-28T09:54:48.4266568Z       "title": "Harness-hosted startup: api seed then listen",
2026-08-28T09:54:48.4267545Z       "requiredStages": [
2026-08-28T09:54:48.4268385Z         "impl",
2026-08-28T09:54:48.4269043Z         "unit",
2026-08-28T09:54:48.4269639Z         "int"
2026-08-28T09:54:48.4270201Z       ],
2026-08-28T09:54:48.4270759Z       "stages": {
2026-08-28T09:54:48.4271333Z         "doc": {
2026-08-28T09:54:48.4271947Z           "complete": false,
2026-08-28T09:54:48.4272619Z           "evidence": []
2026-08-28T09:54:48.4273244Z         },
2026-08-28T09:54:48.4273795Z         "impl": {
2026-08-28T09:54:48.4274384Z           "complete": true,
2026-08-28T09:54:48.4275061Z           "evidence": [
2026-08-28T09:54:48.4275676Z             {
2026-08-28T09:54:48.4276111Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4276388Z               "line": 16
2026-08-28T09:54:48.4276652Z             },
2026-08-28T09:54:48.4276903Z             {
2026-08-28T09:54:48.4277255Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4277527Z               "line": 136
2026-08-28T09:54:48.4277781Z             },
2026-08-28T09:54:48.4278053Z             {
2026-08-28T09:54:48.4278400Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4278677Z               "line": 824
2026-08-28T09:54:48.4278931Z             }
2026-08-28T09:54:48.4279291Z           ]
2026-08-28T09:54:48.4279541Z         },
2026-08-28T09:54:48.4279803Z         "int": {
2026-08-28T09:54:48.4280085Z           "complete": true,
2026-08-28T09:54:48.4280352Z           "evidence": [
2026-08-28T09:54:48.4280610Z             {
2026-08-28T09:54:48.4280981Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:48.4281272Z               "line": 171
2026-08-28T09:54:48.4281521Z             }
2026-08-28T09:54:48.4281788Z           ]
2026-08-28T09:54:48.4282039Z         },
2026-08-28T09:54:48.4282301Z         "unit": {
2026-08-28T09:54:48.4282578Z           "complete": true,
2026-08-28T09:54:48.4282850Z           "evidence": [
2026-08-28T09:54:48.4283108Z             {
2026-08-28T09:54:48.4283456Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4283733Z               "line": 1810
2026-08-28T09:54:48.4284086Z             },
2026-08-28T09:54:48.4284340Z             {
2026-08-28T09:54:48.4284687Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4284963Z               "line": 1843
2026-08-28T09:54:48.4285220Z             }
2026-08-28T09:54:48.4285469Z           ]
2026-08-28T09:54:48.4285727Z         }
2026-08-28T09:54:48.4285979Z       }
2026-08-28T09:54:48.4286231Z     },
2026-08-28T09:54:48.4286480Z     {
2026-08-28T09:54:48.4286774Z       "id": "REQ-START-3",
2026-08-28T09:54:48.4287303Z       "title": "spt-hosted startup: spawn-session then api bind (no file)",
2026-08-28T09:54:48.4287654Z       "requiredStages": [
2026-08-28T09:54:48.4287917Z         "impl",
2026-08-28T09:54:48.4288173Z         "unit",
2026-08-28T09:54:48.4288435Z         "int"
2026-08-28T09:54:48.4288684Z       ],
2026-08-28T09:54:48.4289027Z       "stages": {
2026-08-28T09:54:48.4289289Z         "doc": {
2026-08-28T09:54:48.4289581Z           "complete": false,
2026-08-28T09:54:48.4289856Z           "evidence": []
2026-08-28T09:54:48.4290111Z         },
2026-08-28T09:54:48.4290387Z         "impl": {
2026-08-28T09:54:48.4290673Z           "complete": true,
2026-08-28T09:54:48.4290950Z           "evidence": [
2026-08-28T09:54:48.4291208Z             {
2026-08-28T09:54:48.4291589Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:48.4291856Z               "line": 23
2026-08-28T09:54:48.4292232Z             },
2026-08-28T09:54:48.4292613Z             {
2026-08-28T09:54:48.4293038Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:48.4293319Z               "line": 221
2026-08-28T09:54:48.4293576Z             },
2026-08-28T09:54:48.4293830Z             {
2026-08-28T09:54:48.4294192Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:48.4294458Z               "line": 237
2026-08-28T09:54:48.4294712Z             },
2026-08-28T09:54:48.4294967Z             {
2026-08-28T09:54:48.4295396Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4295671Z               "line": 17
2026-08-28T09:54:48.4295929Z             },
2026-08-28T09:54:48.4296191Z             {
2026-08-28T09:54:48.4296540Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4296806Z               "line": 36
2026-08-28T09:54:48.4297059Z             },
2026-08-28T09:54:48.4297311Z             {
2026-08-28T09:54:48.4297663Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4297925Z               "line": 137
2026-08-28T09:54:48.4298234Z             }
2026-08-28T09:54:48.4298487Z           ]
2026-08-28T09:54:48.4298743Z         },
2026-08-28T09:54:48.4299092Z         "int": {
2026-08-28T09:54:48.4299431Z           "complete": true,
2026-08-28T09:54:48.4299707Z           "evidence": [
2026-08-28T09:54:48.4299964Z             {
2026-08-28T09:54:48.4300329Z               "path": "crates/spt/tests/contract_e2e.rs",
2026-08-28T09:54:48.4300604Z               "line": 463
2026-08-28T09:54:48.4300862Z             }
2026-08-28T09:54:48.4301124Z           ]
2026-08-28T09:54:48.4301392Z         },
2026-08-28T09:54:48.4301654Z         "unit": {
2026-08-28T09:54:48.4301939Z           "complete": true,
2026-08-28T09:54:48.4302216Z           "evidence": [
2026-08-28T09:54:48.4302469Z             {
2026-08-28T09:54:48.4302831Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:48.4303107Z               "line": 525
2026-08-28T09:54:48.4303360Z             },
2026-08-28T09:54:48.4303617Z             {
2026-08-28T09:54:48.4303980Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:48.4304257Z               "line": 546
2026-08-28T09:54:48.4304514Z             },
2026-08-28T09:54:48.4304761Z             {
2026-08-28T09:54:48.4305119Z               "path": "crates/spt-daemon/src/seedmap.rs",
2026-08-28T09:54:48.4305394Z               "line": 556
2026-08-28T09:54:48.4305664Z             },
2026-08-28T09:54:48.4305917Z             {
2026-08-28T09:54:48.4306270Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4306608Z               "line": 1811
2026-08-28T09:54:48.4306871Z             },
2026-08-28T09:54:48.4307124Z             {
2026-08-28T09:54:48.4307477Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4307744Z               "line": 1844
2026-08-28T09:54:48.4308006Z             },
2026-08-28T09:54:48.4308266Z             {
2026-08-28T09:54:48.4309047Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4309486Z               "line": 1877
2026-08-28T09:54:48.4309824Z             }
2026-08-28T09:54:48.4310128Z           ]
2026-08-28T09:54:48.4310500Z         }
2026-08-28T09:54:48.4310767Z       }
2026-08-28T09:54:48.4311010Z     },
2026-08-28T09:54:48.4311260Z     {
2026-08-28T09:54:48.4311560Z       "id": "REQ-START-4",
2026-08-28T09:54:48.4311980Z       "title": "Adapter-injected env aliases (SPT/OWL/LIVE)",
2026-08-28T09:54:48.4312276Z       "requiredStages": [
2026-08-28T09:54:48.4312538Z         "impl",
2026-08-28T09:54:48.4312800Z         "unit"
2026-08-28T09:54:48.4313053Z       ],
2026-08-28T09:54:48.4313319Z       "stages": {
2026-08-28T09:54:48.4313573Z         "doc": {
2026-08-28T09:54:48.4313872Z           "complete": false,
2026-08-28T09:54:48.4314153Z           "evidence": []
2026-08-28T09:54:48.4314400Z         },
2026-08-28T09:54:48.4314668Z         "impl": {
2026-08-28T09:54:48.4314945Z           "complete": true,
2026-08-28T09:54:48.4315221Z           "evidence": [
2026-08-28T09:54:48.4315470Z             {
2026-08-28T09:54:48.4315850Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.4316121Z               "line": 930
2026-08-28T09:54:48.4316381Z             }
2026-08-28T09:54:48.4316643Z           ]
2026-08-28T09:54:48.4316896Z         },
2026-08-28T09:54:48.4317154Z         "int": {
2026-08-28T09:54:48.4317450Z           "complete": false,
2026-08-28T09:54:48.4317727Z           "evidence": []
2026-08-28T09:54:48.4318046Z         },
2026-08-28T09:54:48.4318304Z         "unit": {
2026-08-28T09:54:48.4318590Z           "complete": true,
2026-08-28T09:54:48.4318869Z           "evidence": [
2026-08-28T09:54:48.4319234Z             {
2026-08-28T09:54:48.4319602Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.4319883Z               "line": 1944
2026-08-28T09:54:48.4320130Z             }
2026-08-28T09:54:48.4320389Z           ]
2026-08-28T09:54:48.4320641Z         }
2026-08-28T09:54:48.4320899Z       }
2026-08-28T09:54:48.4321147Z     },
2026-08-28T09:54:48.4321408Z     {
2026-08-28T09:54:48.4321762Z       "id": "REQ-START-5",
2026-08-28T09:54:48.4329990Z       "title": "Adapter-agnostic harness-hosted seed + bind-time adapter/profile resolution (ADR-0021): `api seed` carries only parent_pid + session_id (+ optional cwd), no --adapter — a pure \"a harness session exists at this pid\" record; --adapter becomes an OPTIONAL override across the whole api group (an explicit name[:profile] for adapter dev, never required). Omitted, listen/poll resolve the owning adapter/profile AT BIND as a pure read against the live registry — never a seed-time snapshot that can drift: seed parent_pid → exe basename → host_binaries candidate set (REQ-MANIFEST-8) → active-profile pointer (REQ-INSTALL-12) primary, else greatest-registered_at_ms candidate base profile (name-asc tie) → friendly zero-match error. Covers BOTH LiveAgent (listen) and ReadyAgent (poll) bringup. Restores legacy parity: `$LIVE start <id>` → `$SPT listen <id>` with no mandatory --adapter, one generic SessionStart hook per harness binary. (v0.9.0)",
2026-08-28T09:54:48.4330323Z       "requiredStages": [
2026-08-28T09:54:48.4330591Z         "doc",
2026-08-28T09:54:48.4330849Z         "impl",
2026-08-28T09:54:48.4331116Z         "unit",
2026-08-28T09:54:48.4331368Z         "int"
2026-08-28T09:54:48.4331621Z       ],
2026-08-28T09:54:48.4331892Z       "stages": {
2026-08-28T09:54:48.4332148Z         "doc": {
2026-08-28T09:54:48.4332433Z           "complete": true,
2026-08-28T09:54:48.4332705Z           "evidence": [
2026-08-28T09:54:48.4333048Z             {
2026-08-28T09:54:48.4333335Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.4333611Z               "line": 210
2026-08-28T09:54:48.4333863Z             },
2026-08-28T09:54:48.4334115Z             {
2026-08-28T09:54:48.4334507Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:48.4334778Z               "line": 41
2026-08-28T09:54:48.4335036Z             }
2026-08-28T09:54:48.4335327Z           ]
2026-08-28T09:54:48.4335708Z         },
2026-08-28T09:54:48.4336184Z         "impl": {
2026-08-28T09:54:48.4342457Z           "complete": true,
2026-08-28T09:54:48.4342887Z           "evidence": [
2026-08-28T09:54:48.4343140Z             {
2026-08-28T09:54:48.4343527Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:48.4343794Z               "line": 26
2026-08-28T09:54:48.4344051Z             },
2026-08-28T09:54:48.4344300Z             {
2026-08-28T09:54:48.4344681Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:48.4344948Z               "line": 218
2026-08-28T09:54:48.4345197Z             },
2026-08-28T09:54:48.4345471Z             {
2026-08-28T09:54:48.4345839Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:48.4346115Z               "line": 227
2026-08-28T09:54:48.4346367Z             },
2026-08-28T09:54:48.4346626Z             {
2026-08-28T09:54:48.4346940Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.4347212Z               "line": 878
2026-08-28T09:54:48.4347475Z             },
2026-08-28T09:54:48.4347726Z             {
2026-08-28T09:54:48.4348081Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4348410Z               "line": 37
2026-08-28T09:54:48.4348662Z             },
2026-08-28T09:54:48.4348920Z             {
2026-08-28T09:54:48.4349369Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4349636Z               "line": 139
2026-08-28T09:54:48.4349965Z             },
2026-08-28T09:54:48.4350232Z             {
2026-08-28T09:54:48.4350588Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.4350871Z               "line": 929
2026-08-28T09:54:48.4351120Z             }
2026-08-28T09:54:48.4351373Z           ]
2026-08-28T09:54:48.4351626Z         },
2026-08-28T09:54:48.4351892Z         "int": {
2026-08-28T09:54:48.4352168Z           "complete": true,
2026-08-28T09:54:48.4352440Z           "evidence": [
2026-08-28T09:54:48.4352702Z             {
2026-08-28T09:54:48.4353078Z               "path": "crates/spt/tests/live_resolve_e2e.rs",
2026-08-28T09:54:48.4353414Z               "line": 17
2026-08-28T09:54:48.4353667Z             }
2026-08-28T09:54:48.4353921Z           ]
2026-08-28T09:54:48.4354169Z         },
2026-08-28T09:54:48.4354431Z         "unit": {
2026-08-28T09:54:48.4354701Z           "complete": true,
2026-08-28T09:54:48.4354974Z           "evidence": [
2026-08-28T09:54:48.4355231Z             {
2026-08-28T09:54:48.4355660Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:48.4355940Z               "line": 364
2026-08-28T09:54:48.4356190Z             },
2026-08-28T09:54:48.4356447Z             {
2026-08-28T09:54:48.4356814Z               "path": "crates/spt-runtime/src/resolve.rs",
2026-08-28T09:54:48.4357086Z               "line": 377
2026-08-28T09:54:48.4357339Z             },
2026-08-28T09:54:48.4357595Z             {
2026-08-28T09:54:48.4357915Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.4358181Z               "line": 1009
2026-08-28T09:54:48.4358437Z             }
2026-08-28T09:54:48.4358689Z           ]
2026-08-28T09:54:48.4359042Z         }
2026-08-28T09:54:48.4359290Z       }
2026-08-28T09:54:48.4359547Z     },
2026-08-28T09:54:48.4359789Z     {
2026-08-28T09:54:48.4360077Z       "id": "REQ-STORE-1",
2026-08-28T09:54:48.4362724Z       "title": "spt-store::BranchStore (git branch as versioned KV; commit=checkpoint/tip=resume, atomic multi-key, merge-native sync) is the substrate for coarse/durable/audited state (context, registry snapshot+distribution, daemon checkpoint); hot paths (B5 fsync journal) + indexed queries (SQLite spool) excluded (ADR-0011)",
2026-08-28T09:54:48.4363078Z       "requiredStages": [
2026-08-28T09:54:48.4363339Z         "impl",
2026-08-28T09:54:48.4363601Z         "unit"
2026-08-28T09:54:48.4363889Z       ],
2026-08-28T09:54:48.4364152Z       "stages": {
2026-08-28T09:54:48.4364410Z         "doc": {
2026-08-28T09:54:48.4364695Z           "complete": false,
2026-08-28T09:54:48.4364966Z           "evidence": []
2026-08-28T09:54:48.4365228Z         },
2026-08-28T09:54:48.4365534Z         "impl": {
2026-08-28T09:54:48.4365825Z           "complete": true,
2026-08-28T09:54:48.4366087Z           "evidence": [
2026-08-28T09:54:48.4366332Z             {
2026-08-28T09:54:48.4366721Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4366988Z               "line": 35
2026-08-28T09:54:48.4367250Z             },
2026-08-28T09:54:48.4367506Z             {
2026-08-28T09:54:48.4367884Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4368145Z               "line": 60
2026-08-28T09:54:48.4368403Z             },
2026-08-28T09:54:48.4368656Z             {
2026-08-28T09:54:48.4369125Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4369391Z               "line": 162
2026-08-28T09:54:48.4369645Z             },
2026-08-28T09:54:48.4369903Z             {
2026-08-28T09:54:48.4370269Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4370546Z               "line": 199
2026-08-28T09:54:48.4370799Z             },
2026-08-28T09:54:48.4371056Z             {
2026-08-28T09:54:48.4371425Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4371698Z               "line": 314
2026-08-28T09:54:48.4371958Z             },
2026-08-28T09:54:48.4372207Z             {
2026-08-28T09:54:48.4372578Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4372907Z               "line": 338
2026-08-28T09:54:48.4373165Z             },
2026-08-28T09:54:48.4373419Z             {
2026-08-28T09:54:48.4373794Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4374067Z               "line": 578
2026-08-28T09:54:48.4374327Z             },
2026-08-28T09:54:48.4374582Z             {
2026-08-28T09:54:48.4374970Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4375246Z               "line": 25
2026-08-28T09:54:48.4375575Z             },
2026-08-28T09:54:48.4375832Z             {
2026-08-28T09:54:48.4376214Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4376485Z               "line": 120
2026-08-28T09:54:48.4376747Z             },
2026-08-28T09:54:48.4376999Z             {
2026-08-28T09:54:48.4377380Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4377648Z               "line": 167
2026-08-28T09:54:48.4377910Z             },
2026-08-28T09:54:48.4378164Z             {
2026-08-28T09:54:48.4378545Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4378808Z               "line": 184
2026-08-28T09:54:48.4379155Z             },
2026-08-28T09:54:48.4379415Z             {
2026-08-28T09:54:48.4379785Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4380057Z               "line": 199
2026-08-28T09:54:48.4380309Z             },
2026-08-28T09:54:48.4380562Z             {
2026-08-28T09:54:48.4380943Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4381211Z               "line": 217
2026-08-28T09:54:48.4381469Z             },
2026-08-28T09:54:48.4381722Z             {
2026-08-28T09:54:48.4382107Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4382373Z               "line": 226
2026-08-28T09:54:48.4382634Z             },
2026-08-28T09:54:48.4382886Z             {
2026-08-28T09:54:48.4383330Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:48.4383687Z               "line": 16
2026-08-28T09:54:48.4383979Z             },
2026-08-28T09:54:48.4384236Z             {
2026-08-28T09:54:48.4384599Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:48.4384873Z               "line": 63
2026-08-28T09:54:48.4385132Z             },
2026-08-28T09:54:48.4385390Z             {
2026-08-28T09:54:48.4385743Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:48.4386019Z               "line": 92
2026-08-28T09:54:48.4386273Z             }
2026-08-28T09:54:48.4386527Z           ]
2026-08-28T09:54:48.4386837Z         },
2026-08-28T09:54:48.4387089Z         "int": {
2026-08-28T09:54:48.4387380Z           "complete": false,
2026-08-28T09:54:48.4387650Z           "evidence": []
2026-08-28T09:54:48.4387907Z         },
2026-08-28T09:54:48.4388160Z         "unit": {
2026-08-28T09:54:48.4388437Z           "complete": true,
2026-08-28T09:54:48.4388704Z           "evidence": [
2026-08-28T09:54:48.4389044Z             {
2026-08-28T09:54:48.4389424Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4389776Z               "line": 842
2026-08-28T09:54:48.4390033Z             },
2026-08-28T09:54:48.4390288Z             {
2026-08-28T09:54:48.4390670Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4390937Z               "line": 852
2026-08-28T09:54:48.4391198Z             },
2026-08-28T09:54:48.4391456Z             {
2026-08-28T09:54:48.4391886Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4392162Z               "line": 874
2026-08-28T09:54:48.4392415Z             },
2026-08-28T09:54:48.4392677Z             {
2026-08-28T09:54:48.4393436Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4394042Z               "line": 890
2026-08-28T09:54:48.4394409Z             },
2026-08-28T09:54:48.4394714Z             {
2026-08-28T09:54:48.4395211Z               "path": "crates/spt-store/src/branchstore.rs",
2026-08-28T09:54:48.4395495Z               "line": 974
2026-08-28T09:54:48.4395751Z             },
2026-08-28T09:54:48.4395998Z             {
2026-08-28T09:54:48.4396409Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4396676Z               "line": 598
2026-08-28T09:54:48.4396971Z             },
2026-08-28T09:54:48.4397243Z             {
2026-08-28T09:54:48.4397721Z               "path": "crates/spt-store/src/contextstore.rs",
2026-08-28T09:54:48.4398012Z               "line": 633
2026-08-28T09:54:48.4398334Z             },
2026-08-28T09:54:48.4398591Z             {
2026-08-28T09:54:48.4399059Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:48.4399336Z               "line": 151
2026-08-28T09:54:48.4399584Z             },
2026-08-28T09:54:48.4399845Z             {
2026-08-28T09:54:48.4400199Z               "path": "crates/spt-store/src/project.rs",
2026-08-28T09:54:48.4400474Z               "line": 159
2026-08-28T09:54:48.4400734Z             }
2026-08-28T09:54:48.4400987Z           ]
2026-08-28T09:54:48.4401240Z         }
2026-08-28T09:54:48.4401483Z       }
2026-08-28T09:54:48.4401735Z     },
2026-08-28T09:54:48.4401978Z     {
2026-08-28T09:54:48.4402321Z       "id": "REQ-STORE-CONTEXT-BRANCH-FILL",
2026-08-28T09:54:48.4407122Z       "title": "#1 SI-1 (RCA, operator-promoted 2026-07-03): the context store (tracked/.seed.git) holds ZERO p-* branches on a box with months of live-agent use, while kitsubito/enlyzeam stores carry them. Context commits never land -> picker history has no store source (REQ-PICKER-PROJECT-HISTORY-TRUTH's fallback ships regardless, but the store must ALSO fill). RCA the contextstore write->branch-commit path with evidence (commune-ingest/context-commit regression vs store re-init), contrast the healthy stores, land whatever fix the RCA names. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md #1 SI-1.",
2026-08-28T09:54:48.4407441Z       "requiredStages": [
2026-08-28T09:54:48.4407703Z         "doc",
2026-08-28T09:54:48.4408046Z         "impl",
2026-08-28T09:54:48.4408305Z         "unit",
2026-08-28T09:54:48.4408558Z         "int"
2026-08-28T09:54:48.4408812Z       ],
2026-08-28T09:54:48.4409171Z       "stages": {
2026-08-28T09:54:48.4409423Z         "doc": {
2026-08-28T09:54:48.4409709Z           "complete": true,
2026-08-28T09:54:48.4409972Z           "evidence": [
2026-08-28T09:54:48.4410230Z             {
2026-08-28T09:54:48.4410559Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:48.4410832Z               "line": 650
2026-08-28T09:54:48.4411087Z             }
2026-08-28T09:54:48.4411404Z           ]
2026-08-28T09:54:48.4411661Z         },
2026-08-28T09:54:48.4411918Z         "impl": {
2026-08-28T09:54:48.4412201Z           "complete": true,
2026-08-28T09:54:48.4412477Z           "evidence": [
2026-08-28T09:54:48.4412735Z             {
2026-08-28T09:54:48.4413115Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.4413393Z               "line": 386
2026-08-28T09:54:48.4413646Z             },
2026-08-28T09:54:48.4413915Z             {
2026-08-28T09:54:48.4414290Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.4414561Z               "line": 898
2026-08-28T09:54:48.4414819Z             },
2026-08-28T09:54:48.4415072Z             {
2026-08-28T09:54:48.4415593Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.4416054Z               "line": 53
2026-08-28T09:54:48.4416350Z             },
2026-08-28T09:54:48.4416611Z             {
2026-08-28T09:54:48.4416967Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.4417248Z               "line": 217
2026-08-28T09:54:48.4417501Z             }
2026-08-28T09:54:48.4417757Z           ]
2026-08-28T09:54:48.4418006Z         },
2026-08-28T09:54:48.4418263Z         "int": {
2026-08-28T09:54:48.4418540Z           "complete": true,
2026-08-28T09:54:48.4418813Z           "evidence": [
2026-08-28T09:54:48.4419259Z             {
2026-08-28T09:54:48.4419635Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.4419908Z               "line": 3061
2026-08-28T09:54:48.4420160Z             }
2026-08-28T09:54:48.4420418Z           ]
2026-08-28T09:54:48.4420665Z         },
2026-08-28T09:54:48.4420927Z         "unit": {
2026-08-28T09:54:48.4421209Z           "complete": true,
2026-08-28T09:54:48.4421485Z           "evidence": [
2026-08-28T09:54:48.4421742Z             {
2026-08-28T09:54:48.4422103Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.4422437Z               "line": 2987
2026-08-28T09:54:48.4422689Z             },
2026-08-28T09:54:48.4422942Z             {
2026-08-28T09:54:48.4423309Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.4423581Z               "line": 3014
2026-08-28T09:54:48.4423833Z             },
2026-08-28T09:54:48.4424090Z             {
2026-08-28T09:54:48.4424447Z               "path": "crates/spt-live/src/ingest.rs",
2026-08-28T09:54:48.4424716Z               "line": 605
2026-08-28T09:54:48.4424975Z             }
2026-08-28T09:54:48.4425228Z           ]
2026-08-28T09:54:48.4425485Z         }
2026-08-28T09:54:48.4425737Z       }
2026-08-28T09:54:48.4425990Z     },
2026-08-28T09:54:48.4426238Z     {
2026-08-28T09:54:48.4426576Z       "id": "REQ-STREAM-INFOS-SERVER-FILTER",
2026-08-28T09:54:48.4432293Z       "title": "REGISTRY-LIFECYCLE W1 (ADR-0040 decision 2, hertz defect B leg 2): broker stream_infos excludes initiated_locally rows SERVER-SIDE (retired already excluded) before cloning/serializing to the dispatcher — the O(history) IPC enumeration cost dies at the source. Dispatcher keeps its client-side guard (double-filter harmless; N-1 compatible both directions: older dispatcher skips those rows anyway, older broker just keeps the old cost). Gate: impl — server-side filter; unit — local rows absent from the reply while peer-initiated rows with bytes remain, opener/re-attach enumeration semantics unchanged.",
2026-08-28T09:54:48.4432634Z       "requiredStages": [
2026-08-28T09:54:48.4433006Z         "impl",
2026-08-28T09:54:48.4433259Z         "unit"
2026-08-28T09:54:48.4433512Z       ],
2026-08-28T09:54:48.4433778Z       "stages": {
2026-08-28T09:54:48.4434040Z         "doc": {
2026-08-28T09:54:48.4434331Z           "complete": false,
2026-08-28T09:54:48.4434602Z           "evidence": []
2026-08-28T09:54:48.4434866Z         },
2026-08-28T09:54:48.4435121Z         "impl": {
2026-08-28T09:54:48.4435401Z           "complete": true,
2026-08-28T09:54:48.4435663Z           "evidence": [
2026-08-28T09:54:48.4435992Z             {
2026-08-28T09:54:48.4436364Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4436694Z               "line": 9239
2026-08-28T09:54:48.4436951Z             },
2026-08-28T09:54:48.4437208Z             {
2026-08-28T09:54:48.4437583Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4437858Z               "line": 1951
2026-08-28T09:54:48.4438120Z             }
2026-08-28T09:54:48.4438378Z           ]
2026-08-28T09:54:48.4438636Z         },
2026-08-28T09:54:48.4438897Z         "int": {
2026-08-28T09:54:48.4439265Z           "complete": true,
2026-08-28T09:54:48.4439536Z           "evidence": [
2026-08-28T09:54:48.4439784Z             {
2026-08-28T09:54:48.4440171Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:48.4440436Z               "line": 427
2026-08-28T09:54:48.4440694Z             }
2026-08-28T09:54:48.4440961Z           ]
2026-08-28T09:54:48.4441214Z         },
2026-08-28T09:54:48.4441481Z         "unit": {
2026-08-28T09:54:48.4441761Z           "complete": true,
2026-08-28T09:54:48.4442043Z           "evidence": [
2026-08-28T09:54:48.4442296Z             {
2026-08-28T09:54:48.4442657Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4442923Z               "line": 3224
2026-08-28T09:54:48.4443185Z             }
2026-08-28T09:54:48.4443447Z           ]
2026-08-28T09:54:48.4443762Z         }
2026-08-28T09:54:48.4444023Z       }
2026-08-28T09:54:48.4444285Z     },
2026-08-28T09:54:48.4444539Z     {
2026-08-28T09:54:48.4444862Z       "id": "REQ-STREAM-LEASE-CLASSES",
2026-08-28T09:54:48.4454855Z       "title": "REGISTRY-LIFECYCLE W2 (ADR-0040 decision 6 + ADR-0041, emphasys C2 P0): streams declare a lifetime class at open — RC attach/view streams are ConnectionBound (opener conn EOF means the target sees FIN, serve_attach runs detach_session, controller slot + CONTROLLED stamps clear — a dead viewer can never pin a controller across its own connection death; today the raw-closed viewport attach stream is restart-durable forever); inter-brain streams stay Durable (NEVER globally retire on Brain disconnect — brain-swap correctness depends on it). Late-close identity validated (stale opener A close cannot evict newer controller B — rides ADR-0038 Amendment fix-6 generation tokens + W1 seat teardown machinery; same neighborhood, built once per the standing C2 coordination ruling). Lifetime class = additive open field, absent = Durable (N-1 openers keep exact current semantics). Gate: impl — class at open + ConnectionBound EOF chain; unit — class routing + absent-defaults-Durable + late-close identity refusal; int — raw viewport close frees the controller full-chain incl. across broker restart, brain_swap/daemon_refresh/redispatch legs stay green; doc — ADR-0040/0041.",
2026-08-28T09:54:48.4455413Z       "requiredStages": [
2026-08-28T09:54:48.4455653Z         "doc",
2026-08-28T09:54:48.4455986Z         "impl",
2026-08-28T09:54:48.4456261Z         "unit",
2026-08-28T09:54:48.4456603Z         "int"
2026-08-28T09:54:48.4456927Z       ],
2026-08-28T09:54:48.4457337Z       "stages": {
2026-08-28T09:54:48.4457699Z         "doc": {
2026-08-28T09:54:48.4458109Z           "complete": true,
2026-08-28T09:54:48.4458501Z           "evidence": [
2026-08-28T09:54:48.4458894Z             {
2026-08-28T09:54:48.4459950Z               "path": "docs/adr/0040-bounded-stream-seat-lifecycle-one-way-terminal.md",
2026-08-28T09:54:48.4460414Z               "line": 79
2026-08-28T09:54:48.4460947Z             }
2026-08-28T09:54:48.4461354Z           ]
2026-08-28T09:54:48.4461719Z         },
2026-08-28T09:54:48.4462106Z         "impl": {
2026-08-28T09:54:48.4462539Z           "complete": true,
2026-08-28T09:54:48.4462824Z           "evidence": [
2026-08-28T09:54:48.4463097Z             {
2026-08-28T09:54:48.4463531Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.4463868Z               "line": 906
2026-08-28T09:54:48.4464223Z             },
2026-08-28T09:54:48.4464582Z             {
2026-08-28T09:54:48.4465067Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.4465540Z               "line": 1985
2026-08-28T09:54:48.4465888Z             },
2026-08-28T09:54:48.4466236Z             {
2026-08-28T09:54:48.4466687Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4466962Z               "line": 5715
2026-08-28T09:54:48.4467220Z             },
2026-08-28T09:54:48.4467478Z             {
2026-08-28T09:54:48.4467849Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4468126Z               "line": 5862
2026-08-28T09:54:48.4468379Z             },
2026-08-28T09:54:48.4468635Z             {
2026-08-28T09:54:48.4469099Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4469383Z               "line": 6086
2026-08-28T09:54:48.4469648Z             },
2026-08-28T09:54:48.4469900Z             {
2026-08-28T09:54:48.4470272Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4470544Z               "line": 9128
2026-08-28T09:54:48.4470825Z             },
2026-08-28T09:54:48.4471088Z             {
2026-08-28T09:54:48.4471436Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.4471703Z               "line": 1110
2026-08-28T09:54:48.4471971Z             },
2026-08-28T09:54:48.4472226Z             {
2026-08-28T09:54:48.4472570Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.4472937Z               "line": 1191
2026-08-28T09:54:48.4473195Z             },
2026-08-28T09:54:48.4473456Z             {
2026-08-28T09:54:48.4473820Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4474095Z               "line": 859
2026-08-28T09:54:48.4474357Z             }
2026-08-28T09:54:48.4474607Z           ]
2026-08-28T09:54:48.4474865Z         },
2026-08-28T09:54:48.4475122Z         "int": {
2026-08-28T09:54:48.4475408Z           "complete": true,
2026-08-28T09:54:48.4475679Z           "evidence": [
2026-08-28T09:54:48.4475999Z             {
2026-08-28T09:54:48.4476448Z               "path": "crates/spt-daemon/tests/endpoint_lifecycle.rs",
2026-08-28T09:54:48.4476726Z               "line": 555
2026-08-28T09:54:48.4476988Z             }
2026-08-28T09:54:48.4477238Z           ]
2026-08-28T09:54:48.4477498Z         },
2026-08-28T09:54:48.4477757Z         "unit": {
2026-08-28T09:54:48.4478038Z           "complete": true,
2026-08-28T09:54:48.4478310Z           "evidence": [
2026-08-28T09:54:48.4478571Z             {
2026-08-28T09:54:48.4479039Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4479330Z               "line": 12020
2026-08-28T09:54:48.4479583Z             },
2026-08-28T09:54:48.4479838Z             {
2026-08-28T09:54:48.4480184Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.4480450Z               "line": 1904
2026-08-28T09:54:48.4480709Z             },
2026-08-28T09:54:48.4481000Z             {
2026-08-28T09:54:48.4481423Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4481705Z               "line": 2515
2026-08-28T09:54:48.4481972Z             }
2026-08-28T09:54:48.4482235Z           ]
2026-08-28T09:54:48.4482484Z         }
2026-08-28T09:54:48.4482748Z       }
2026-08-28T09:54:48.4483005Z     },
2026-08-28T09:54:48.4483269Z     {
2026-08-28T09:54:48.4483584Z       "id": "REQ-STREAM-LIFETIME-CLASS",
2026-08-28T09:54:48.4545797Z       "title": "RESCOPED at W2 activation 2026-07-22 (doyle verify-first, C3-retirement precedent): the CLEAN-CASE chain this REQ was minted for is ALREADY SHIPPED under REQ-STREAM-LEASE-CLASSES / ADR-0040 decision 6, verified against @7c0f12d — StreamLifetime is opener-declared and on the wire, serde-default Durable so N-1 openers keep exact today-semantics (msg.rs:810-836 + the additive-wire unit @msg.rs:1408); rc attach/view is the SOLE ConnectionBound opener (attach.rs:667-677); the broker binds the class at open (broker.rs:5689) and nethost carries it per StreamEntry (nethost.rs:1059-1076); the conn-exit sweep FINs each ConnectionBound stream toward its target and terminal-retires the local row while Durable rows never enter it (broker.rs:4118-4123/4227-4235/4429-4446); the target's serve_attach EOF arm runs detach_session_gen(serve_gen) so controller/viewer stamps clear on exactly one generation (attach.rs:580-597); the late-close gen guard (broker.rs:2179-2192, unit @8416) and converge_perch_stamps close the race; int coverage rides endpoint_lifecycle.rs:241. Building that again would re-implement shipped code — the C3 lesson. WHAT REMAINS, and what this REQ now owns: RESTART-REPLAY RE-ESTABLISHMENT. ADR-0038 dispatch replay re-serves every retained opener Attach across a dispatcher generation, and a ConnectionBound opener REPLAYING is a class contradiction — the conn that declared the class cannot exist after the restart that killed it, so re-serving resurrects a seat whose declared lifetime already ended. FIX: the dispatcher's restart-durable classification (ADR-0038 decision 2, dispatch.rs first_line) gains lifetime, and the replay filter TERMINAL-RETIRES ConnectionBound openers instead of re-serving them. Deliberately PRECISE, not ADR-0038's rejected clear-table-on-restart: Durable/brain-swap semantics are untouched and the brain_swap / daemon_refresh / redispatch D1+D1b families staying green IS the proof. The filter runs UPSTREAM of the W1 idempotence key (endpoint/session, by, conn, gen, from_seq) — a filtered opener never reaches serve, so the two mechanisms compose rather than overlap. Gate: impl — lifetime on the replay classification + the terminal-retire filter; unit — the filter predicate (ConnectionBound retires / Durable replays / unclassifiable stays terminal as today); int — RED-first: kill the rc opener raw, restart the broker, pre-fix the seat and CONTROLLED stamps re-establish via replay, post-fix they stay clear, with the D-legs green alongside. Kin REQ-STREAM-LEASE-CLASSES (the shipped clean case), REQ-ATTACH-IDEMPOTENT-REPLAY (downstream), REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT (the live no-FIN sibling, same wave). RESCOPE 2 — MEASURED 2026-07-22 (todlando, Leg A rig `restart_replay_lifetime.rs`, GREEN with its sibling probe passing): the FIX ABOVE IS NOT OWED. The premise was pre-registered as falsifiable by doyle BEFORE the rig was built, and the rig falsified it: in the residual ordering (dispatcher generation dies FIRST so no serve worker and no Served report, THEN the rc opener dies RAW with no detach frame) a fresh generation does NOT resurrect the seat — stamps stay clear and no DISPATCH line touches the dead opener's row. The population is closed BY COMPOSITION: the conn-exit sweep fires for this kill shape (`STREAM_CONNBOUND_RETIRE:<id>: opener conn exited — FIN + terminal retire`), the ConnectionBound opener row leaves the table entirely, its peer row carries the FIN as finished=true, and the worker's family-aware finished_row_is_terminal(Attach,true) retires it UNSERVED. TWO PRE-REGISTERED SUB-QUESTIONS ANSWERED, and the first is the non-obvious finding: (1) `retire` does NOT exclude from the CLAIM condition on this path — the dead opener's row is STILL in the dispatcher's claimable enumeration, merely finished=true, so what stops the replay sits DOWNSTREAM of the claim (retire-on-sight in the worker), which is ADR-0038 decision 1's `excluded by lifecycle state` arm and NOT its `removed from the enumeration` arm; (2) the sweep DID run for this kill shape. Consequently NO wire field (already settled independently: the re-served row registers Durable, class-blind by design at nethost.rs:1028-1041 / 1763-1771, so a lifetime field on the opener reply would report Durable for exactly the population a filter exists to catch) and NO broker-side enumeration filter are built. Stages drop to int ONLY — impl/unit are deactivated rather than pre-failed (the `activate, don't pre-fail` rule; the C2/C3 verify-first precedent), and the int evidence is the standing regression guard the property never had. SCOPE LIMIT STATED, NOT IMPLIED — and TIGHTENED 2026-07-22 (doyle rider, todlando self-flagged): the measurement rides the IN-PROCESS DUPLEX, which is the honest word and is tighter than the `loopback` this text first said. net_dial_loopback / open_loopback_pair yield a RecvHalf::Loopback duplex with NO QUIC ANYWHERE and NO idle timeout — a different transport leaf from RecvHalf::Quic; BindScope::Loopback plus a real net_dial WOULD be real QUIC over 127.0.0.1, and the two senses of `loopback` in this repo are NOT the same thing (the naming collision is itself an ADR-0040 amendment item, so future rigs pick their venue deliberately). Consequently the cross-node `conn.closed()` arm (nethost.rs:1000-1021) is a different mechanism reaching the same outcome and is NOT exercised, and a real-QUIC transport death sans FIN remains Leg B's instrument-first residual under REQ-HAZARD-DRIVEN-BY-IDLE-REMOTE-EVICT.",
2026-08-28T09:54:48.4547087Z       "requiredStages": [
2026-08-28T09:54:48.4547412Z         "int"
2026-08-28T09:54:48.4547722Z       ],
2026-08-28T09:54:48.4547993Z       "stages": {
2026-08-28T09:54:48.4548264Z         "doc": {
2026-08-28T09:54:48.4548590Z           "complete": true,
2026-08-28T09:54:48.4548867Z           "evidence": [
2026-08-28T09:54:48.4549224Z             {
2026-08-28T09:54:48.4549868Z               "path": "docs/adr/0040-bounded-stream-seat-lifecycle-one-way-terminal.md",
2026-08-28T09:54:48.4550140Z               "line": 117
2026-08-28T09:54:48.4550397Z             }
2026-08-28T09:54:48.4550726Z           ]
2026-08-28T09:54:48.4550981Z         },
2026-08-28T09:54:48.4551250Z         "impl": {
2026-08-28T09:54:48.4551528Z           "complete": false,
2026-08-28T09:54:48.4551801Z           "evidence": []
2026-08-28T09:54:48.4552058Z         },
2026-08-28T09:54:48.4552316Z         "int": {
2026-08-28T09:54:48.4552597Z           "complete": true,
2026-08-28T09:54:48.4552880Z           "evidence": [
2026-08-28T09:54:48.4553131Z             {
2026-08-28T09:54:48.4553618Z               "path": "crates/spt-daemon/tests/restart_replay_lifetime.rs",
2026-08-28T09:54:48.4553893Z               "line": 345
2026-08-28T09:54:48.4554206Z             }
2026-08-28T09:54:48.4554463Z           ]
2026-08-28T09:54:48.4554710Z         },
2026-08-28T09:54:48.4554973Z         "unit": {
2026-08-28T09:54:48.4555254Z           "complete": false,
2026-08-28T09:54:48.4555536Z           "evidence": []
2026-08-28T09:54:48.4555794Z         }
2026-08-28T09:54:48.4556047Z       }
2026-08-28T09:54:48.4556298Z     },
2026-08-28T09:54:48.4556555Z     {
2026-08-28T09:54:48.4556879Z       "id": "REQ-STREAM-OPENER-DURABLE",
2026-08-28T09:54:48.4567792Z       "title": "REDISPATCH-TRUTH W1 (ADR-0038, hertz fix B): stream classification identity is RESTART-DURABLE and independent of the evictable data ring — today reconstruction classifies via peek_first_line from ring seq 0, but StreamLog is a bounded 4096-transport-chunk ring (DEFAULT_STREAM_RING_CHUNKS, nethost.rs:111), so a high-traffic ACTIVE stream's opener/Request record evicts and replay classifies Unknown/Failed = active stream permanently abandoned. Pin an immutable bounded opener/classification fact (the complete first NDJSON record, or its derived family+cursor facts) OUTSIDE the data ring per broker-held inbound stream, held until stream close; recovery classifies from that metadata, never ring seq 0. Ring semantics and size untouched (enlarging the ring for a correctness fact is REJECTED). Gate: impl — the pinned opener fact + classification cutover; unit — classification survives full ring roll-over; int — production-path regression D2: push >4096 transport chunks on an active Attach (opener evicted), restart dispatcher, prove durable classification resumes the SAME operator stream. HEAVY nextest group at birth. Kin REQ-DISPATCH-CLAIM-RETRY, REQ-HAZARD-REDISPATCH-CONTROL-STEAL.",
2026-08-28T09:54:48.4568270Z       "requiredStages": [
2026-08-28T09:54:48.4568537Z         "impl",
2026-08-28T09:54:48.4568798Z         "unit",
2026-08-28T09:54:48.4569128Z         "int"
2026-08-28T09:54:48.4569389Z       ],
2026-08-28T09:54:48.4569649Z       "stages": {
2026-08-28T09:54:48.4569921Z         "doc": {
2026-08-28T09:54:48.4570203Z           "complete": false,
2026-08-28T09:54:48.4570550Z           "evidence": []
2026-08-28T09:54:48.4570803Z         },
2026-08-28T09:54:48.4571064Z         "impl": {
2026-08-28T09:54:48.4571341Z           "complete": true,
2026-08-28T09:54:48.4571623Z           "evidence": [
2026-08-28T09:54:48.4571880Z             {
2026-08-28T09:54:48.4572246Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.4572530Z               "line": 447
2026-08-28T09:54:48.4572788Z             },
2026-08-28T09:54:48.4573051Z             {
2026-08-28T09:54:48.4573408Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.4573680Z               "line": 2142
2026-08-28T09:54:48.4573936Z             },
2026-08-28T09:54:48.4574184Z             {
2026-08-28T09:54:48.4574566Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4574837Z               "line": 9308
2026-08-28T09:54:48.4575097Z             },
2026-08-28T09:54:48.4575360Z             {
2026-08-28T09:54:48.4575736Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.4576003Z               "line": 1140
2026-08-28T09:54:48.4576257Z             },
2026-08-28T09:54:48.4576513Z             {
2026-08-28T09:54:48.4576852Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.4577133Z               "line": 228
2026-08-28T09:54:48.4577448Z             },
2026-08-28T09:54:48.4577709Z             {
2026-08-28T09:54:48.4578061Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.4578338Z               "line": 1186
2026-08-28T09:54:48.4578591Z             },
2026-08-28T09:54:48.4578853Z             {
2026-08-28T09:54:48.4579306Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4579578Z               "line": 445
2026-08-28T09:54:48.4579841Z             },
2026-08-28T09:54:48.4580096Z             {
2026-08-28T09:54:48.4580467Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4580800Z               "line": 2075
2026-08-28T09:54:48.4581063Z             }
2026-08-28T09:54:48.4581315Z           ]
2026-08-28T09:54:48.4581576Z         },
2026-08-28T09:54:48.4581840Z         "int": {
2026-08-28T09:54:48.4582116Z           "complete": true,
2026-08-28T09:54:48.4582389Z           "evidence": [
2026-08-28T09:54:48.4582642Z             {
2026-08-28T09:54:48.4583039Z               "path": "crates/spt-daemon/tests/redispatch.rs",
2026-08-28T09:54:48.4583320Z               "line": 570
2026-08-28T09:54:48.4583586Z             }
2026-08-28T09:54:48.4583829Z           ]
2026-08-28T09:54:48.4584087Z         },
2026-08-28T09:54:48.4584353Z         "unit": {
2026-08-28T09:54:48.4584631Z           "complete": true,
2026-08-28T09:54:48.4584908Z           "evidence": [
2026-08-28T09:54:48.4585161Z             {
2026-08-28T09:54:48.4585540Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4585810Z               "line": 2705
2026-08-28T09:54:48.4586076Z             },
2026-08-28T09:54:48.4586329Z             {
2026-08-28T09:54:48.4586701Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4586977Z               "line": 2730
2026-08-28T09:54:48.4587230Z             }
2026-08-28T09:54:48.4587489Z           ]
2026-08-28T09:54:48.4587742Z         }
2026-08-28T09:54:48.4587998Z       }
2026-08-28T09:54:48.4588250Z     },
2026-08-28T09:54:48.4588513Z     {
2026-08-28T09:54:48.4588893Z       "id": "REQ-STREAMLOG-SUBSCRIBER-DISCIPLINE",
2026-08-28T09:54:48.4601264Z       "title": "REDISPATCH-STALL W1 (ADR-0038 Amendment, fixes 2+3+4): StreamLog subscriber write discipline — (a) replay and live fan-out HALT at the first failed subscriber write and the failed subscriber is REMOVED, at ALL sites (attach replay, append, finish; PresenceLog mirrors ride the same change — today let _ = sub.write() discards errors and iteration continues, nethost.rs:322-346); (b) subscriber I/O moves OFF the StreamLog mutex: bounded per-subscriber writer queue, enqueue-under-lock / I/O-outside, overflow = detach + resume-from-cursor (the existing gapless-resume contract), never a producer stall; (c) attach worker completion + forwarding BOUNDED and cancelable — a poisoned brain subscriber cancels its paired serve/wire worker, no orphan forwarding legs (COORDINATE with DAEMON-LIFECYCLE C2 leases at build — same neighborhood, build once). Gate: impl — halt+remove all-sites + writer queue + cancelable pairing; unit — halt-at-first-failure removes the subscriber at each site + queue overflow detaches with cursor intact + producer append never blocks past enqueue; int — T1 (poisoned-replay halt) + T3 (producer latency flat under a wedged subscriber) + T4 (paired worker canceled on poison); doc — ADR-0038 Amendment. Kin REQ-HAZARD-REDISPATCH-STALL, REQ-CONN-POISON-ATTRIBUTION (the telemetry that caught it), REQ-EP-4 (PresenceLog contract unchanged above the write leaf).",
2026-08-28T09:54:48.4601687Z       "requiredStages": [
2026-08-28T09:54:48.4602020Z         "doc",
2026-08-28T09:54:48.4602278Z         "impl",
2026-08-28T09:54:48.4602545Z         "unit",
2026-08-28T09:54:48.4602804Z         "int"
2026-08-28T09:54:48.4603065Z       ],
2026-08-28T09:54:48.4603327Z       "stages": {
2026-08-28T09:54:48.4603584Z         "doc": {
2026-08-28T09:54:48.4603866Z           "complete": true,
2026-08-28T09:54:48.4604131Z           "evidence": [
2026-08-28T09:54:48.4604392Z             {
2026-08-28T09:54:48.4604934Z               "path": "docs/adr/0038-broker-stream-lifecycle-truth.md",
2026-08-28T09:54:48.4605216Z               "line": 75
2026-08-28T09:54:48.4605474Z             }
2026-08-28T09:54:48.4605732Z           ]
2026-08-28T09:54:48.4605995Z         },
2026-08-28T09:54:48.4606286Z         "impl": {
2026-08-28T09:54:48.4606712Z           "complete": true,
2026-08-28T09:54:48.4606992Z           "evidence": [
2026-08-28T09:54:48.4607259Z             {
2026-08-28T09:54:48.4607632Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4607979Z               "line": 132
2026-08-28T09:54:48.4608242Z             },
2026-08-28T09:54:48.4608499Z             {
2026-08-28T09:54:48.4608876Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4609263Z               "line": 153
2026-08-28T09:54:48.4609528Z             },
2026-08-28T09:54:48.4609780Z             {
2026-08-28T09:54:48.4610153Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4610429Z               "line": 188
2026-08-28T09:54:48.4610700Z             },
2026-08-28T09:54:48.4611005Z             {
2026-08-28T09:54:48.4611368Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4611639Z               "line": 287
2026-08-28T09:54:48.4611899Z             },
2026-08-28T09:54:48.4612162Z             {
2026-08-28T09:54:48.4612524Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4612800Z               "line": 478
2026-08-28T09:54:48.4613059Z             },
2026-08-28T09:54:48.4613320Z             {
2026-08-28T09:54:48.4613693Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4613969Z               "line": 489
2026-08-28T09:54:48.4614230Z             },
2026-08-28T09:54:48.4614487Z             {
2026-08-28T09:54:48.4614856Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4615128Z               "line": 525
2026-08-28T09:54:48.4615391Z             },
2026-08-28T09:54:48.4615649Z             {
2026-08-28T09:54:48.4616025Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4616373Z               "line": 544
2026-08-28T09:54:48.4616626Z             },
2026-08-28T09:54:48.4616880Z             {
2026-08-28T09:54:48.4617239Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4617519Z               "line": 594
2026-08-28T09:54:48.4617771Z             },
2026-08-28T09:54:48.4618028Z             {
2026-08-28T09:54:48.4618390Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4618672Z               "line": 729
2026-08-28T09:54:48.4618930Z             },
2026-08-28T09:54:48.4619398Z             {
2026-08-28T09:54:48.4619827Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4620102Z               "line": 744
2026-08-28T09:54:48.4620364Z             },
2026-08-28T09:54:48.4620621Z             {
2026-08-28T09:54:48.4620994Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4621275Z               "line": 1902
2026-08-28T09:54:48.4621537Z             },
2026-08-28T09:54:48.4621794Z             {
2026-08-28T09:54:48.4622161Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4622440Z               "line": 1926
2026-08-28T09:54:48.4622693Z             },
2026-08-28T09:54:48.4622960Z             {
2026-08-28T09:54:48.4623318Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4623595Z               "line": 2187
2026-08-28T09:54:48.4623851Z             },
2026-08-28T09:54:48.4624108Z             {
2026-08-28T09:54:48.4624471Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4624743Z               "line": 2240
2026-08-28T09:54:48.4625004Z             }
2026-08-28T09:54:48.4625497Z           ]
2026-08-28T09:54:48.4625764Z         },
2026-08-28T09:54:48.4626022Z         "int": {
2026-08-28T09:54:48.4626313Z           "complete": true,
2026-08-28T09:54:48.4626594Z           "evidence": [
2026-08-28T09:54:48.4626928Z             {
2026-08-28T09:54:48.4627623Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:48.4628089Z               "line": 319
2026-08-28T09:54:48.4628456Z             },
2026-08-28T09:54:48.4628804Z             {
2026-08-28T09:54:48.4629471Z               "path": "crates/spt-daemon/tests/redispatch_stall.rs",
2026-08-28T09:54:48.4629848Z               "line": 404
2026-08-28T09:54:48.4630205Z             }
2026-08-28T09:54:48.4630562Z           ]
2026-08-28T09:54:48.4630905Z         },
2026-08-28T09:54:48.4631402Z         "unit": {
2026-08-28T09:54:48.4631778Z           "complete": true,
2026-08-28T09:54:48.4632111Z           "evidence": [
2026-08-28T09:54:48.4632422Z             {
2026-08-28T09:54:48.4632885Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4633222Z               "line": 2911
2026-08-28T09:54:48.4633539Z             },
2026-08-28T09:54:48.4633859Z             {
2026-08-28T09:54:48.4634316Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4634668Z               "line": 2958
2026-08-28T09:54:48.4634983Z             },
2026-08-28T09:54:48.4635341Z             {
2026-08-28T09:54:48.4635812Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4636163Z               "line": 2983
2026-08-28T09:54:48.4636473Z             },
2026-08-28T09:54:48.4636773Z             {
2026-08-28T09:54:48.4637231Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4637507Z               "line": 3019
2026-08-28T09:54:48.4637770Z             },
2026-08-28T09:54:48.4638024Z             {
2026-08-28T09:54:48.4638397Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4638672Z               "line": 3066
2026-08-28T09:54:48.4639049Z             },
2026-08-28T09:54:48.4639316Z             {
2026-08-28T09:54:48.4639679Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4639960Z               "line": 3109
2026-08-28T09:54:48.4640223Z             },
2026-08-28T09:54:48.4640567Z             {
2026-08-28T09:54:48.4640943Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4641218Z               "line": 3161
2026-08-28T09:54:48.4641479Z             },
2026-08-28T09:54:48.4641736Z             {
2026-08-28T09:54:48.4642123Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4642400Z               "line": 3201
2026-08-28T09:54:48.4642662Z             }
2026-08-28T09:54:48.4642915Z           ]
2026-08-28T09:54:48.4643178Z         }
2026-08-28T09:54:48.4643434Z       }
2026-08-28T09:54:48.4643698Z     },
2026-08-28T09:54:48.4644013Z     {
2026-08-28T09:54:48.4644303Z       "id": "REQ-SUBNET-1",
2026-08-28T09:54:48.4645325Z       "title": "spt subnet noun namespace: status view (bare + status [NAME] [--nodes]), create (QR/otpauth), show-code; spt pair deleted",
2026-08-28T09:54:48.4645620Z       "requiredStages": [
2026-08-28T09:54:48.4645887Z         "impl",
2026-08-28T09:54:48.4646148Z         "unit"
2026-08-28T09:54:48.4646410Z       ],
2026-08-28T09:54:48.4646676Z       "stages": {
2026-08-28T09:54:48.4647042Z         "doc": {
2026-08-28T09:54:48.4647362Z           "complete": false,
2026-08-28T09:54:48.4647906Z           "evidence": []
2026-08-28T09:54:48.4648197Z         },
2026-08-28T09:54:48.4648531Z         "impl": {
2026-08-28T09:54:48.4654731Z           "complete": true,
2026-08-28T09:54:48.4655055Z           "evidence": [
2026-08-28T09:54:48.4655318Z             {
2026-08-28T09:54:48.4655727Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4656013Z               "line": 272
2026-08-28T09:54:48.4656276Z             },
2026-08-28T09:54:48.4656539Z             {
2026-08-28T09:54:48.4656946Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4657226Z               "line": 922
2026-08-28T09:54:48.4657478Z             },
2026-08-28T09:54:48.4657735Z             {
2026-08-28T09:54:48.4658151Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4658432Z               "line": 12594
2026-08-28T09:54:48.4658684Z             },
2026-08-28T09:54:48.4658937Z             {
2026-08-28T09:54:48.4659342Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4659611Z               "line": 13205
2026-08-28T09:54:48.4659874Z             },
2026-08-28T09:54:48.4660127Z             {
2026-08-28T09:54:48.4660437Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4660704Z               "line": 13265
2026-08-28T09:54:48.4660961Z             },
2026-08-28T09:54:48.4661285Z             {
2026-08-28T09:54:48.4661590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4661871Z               "line": 13400
2026-08-28T09:54:48.4662119Z             },
2026-08-28T09:54:48.4662377Z             {
2026-08-28T09:54:48.4662682Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4662949Z               "line": 13450
2026-08-28T09:54:48.4663210Z             },
2026-08-28T09:54:48.4663458Z             {
2026-08-28T09:54:48.4663773Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4664044Z               "line": 13627
2026-08-28T09:54:48.4664303Z             },
2026-08-28T09:54:48.4664549Z             {
2026-08-28T09:54:48.4664862Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4665123Z               "line": 13710
2026-08-28T09:54:48.4665381Z             },
2026-08-28T09:54:48.4665634Z             {
2026-08-28T09:54:48.4665930Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4666207Z               "line": 14017
2026-08-28T09:54:48.4666465Z             },
2026-08-28T09:54:48.4666721Z             {
2026-08-28T09:54:48.4667031Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4667302Z               "line": 15138
2026-08-28T09:54:48.4667558Z             },
2026-08-28T09:54:48.4667816Z             {
2026-08-28T09:54:48.4668145Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.4668416Z               "line": 1254
2026-08-28T09:54:48.4668745Z             }
2026-08-28T09:54:48.4669055Z           ]
2026-08-28T09:54:48.4669307Z         },
2026-08-28T09:54:48.4669560Z         "int": {
2026-08-28T09:54:48.4669845Z           "complete": false,
2026-08-28T09:54:48.4670125Z           "evidence": []
2026-08-28T09:54:48.4670377Z         },
2026-08-28T09:54:48.4670639Z         "unit": {
2026-08-28T09:54:48.4670915Z           "complete": true,
2026-08-28T09:54:48.4671187Z           "evidence": [
2026-08-28T09:54:48.4671440Z             {
2026-08-28T09:54:48.4671836Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4672155Z               "line": 2441
2026-08-28T09:54:48.4672417Z             },
2026-08-28T09:54:48.4672674Z             {
2026-08-28T09:54:48.4672994Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4673266Z               "line": 33534
2026-08-28T09:54:48.4673519Z             },
2026-08-28T09:54:48.4673775Z             {
2026-08-28T09:54:48.4674089Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4674371Z               "line": 33780
2026-08-28T09:54:48.4674619Z             },
2026-08-28T09:54:48.4674877Z             {
2026-08-28T09:54:48.4675185Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4675446Z               "line": 33787
2026-08-28T09:54:48.4675708Z             },
2026-08-28T09:54:48.4675956Z             {
2026-08-28T09:54:48.4676261Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4676523Z               "line": 33851
2026-08-28T09:54:48.4676795Z             },
2026-08-28T09:54:48.4677068Z             {
2026-08-28T09:54:48.4677387Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4677654Z               "line": 33868
2026-08-28T09:54:48.4677914Z             },
2026-08-28T09:54:48.4678170Z             {
2026-08-28T09:54:48.4678475Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4678752Z               "line": 34101
2026-08-28T09:54:48.4679142Z             },
2026-08-28T09:54:48.4679409Z             {
2026-08-28T09:54:48.4679724Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4680001Z               "line": 34226
2026-08-28T09:54:48.4680254Z             },
2026-08-28T09:54:48.4680514Z             {
2026-08-28T09:54:48.4680826Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4681093Z               "line": 34463
2026-08-28T09:54:48.4681347Z             }
2026-08-28T09:54:48.4681600Z           ]
2026-08-28T09:54:48.4681853Z         }
2026-08-28T09:54:48.4682100Z       }
2026-08-28T09:54:48.4682415Z     },
2026-08-28T09:54:48.4682663Z     {
2026-08-28T09:54:48.4682953Z       "id": "REQ-SUBNET-2",
2026-08-28T09:54:48.4683672Z       "title": "Guided join e2e: spt subnet join CLI initiator + always-on daemon pairing responder",
2026-08-28T09:54:48.4683958Z       "requiredStages": [
2026-08-28T09:54:48.4684226Z         "impl",
2026-08-28T09:54:48.4684479Z         "unit",
2026-08-28T09:54:48.4684737Z         "int"
2026-08-28T09:54:48.4684989Z       ],
2026-08-28T09:54:48.4685255Z       "stages": {
2026-08-28T09:54:48.4685513Z         "doc": {
2026-08-28T09:54:48.4685792Z           "complete": true,
2026-08-28T09:54:48.4686064Z           "evidence": [
2026-08-28T09:54:48.4686316Z             {
2026-08-28T09:54:48.4686801Z               "path": "docs/adr/0005-totp-seeded-spake2-node-pairing.md",
2026-08-28T09:54:48.4687060Z               "line": 60
2026-08-28T09:54:48.4687332Z             }
2026-08-28T09:54:48.4687590Z           ]
2026-08-28T09:54:48.4687851Z         },
2026-08-28T09:54:48.4688123Z         "impl": {
2026-08-28T09:54:48.4688403Z           "complete": true,
2026-08-28T09:54:48.4688682Z           "evidence": [
2026-08-28T09:54:48.4688931Z             {
2026-08-28T09:54:48.4689354Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.4689627Z               "line": 1811
2026-08-28T09:54:48.4689889Z             },
2026-08-28T09:54:48.4690142Z             {
2026-08-28T09:54:48.4690514Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.4690857Z               "line": 8957
2026-08-28T09:54:48.4691113Z             },
2026-08-28T09:54:48.4691372Z             {
2026-08-28T09:54:48.4691735Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4692007Z               "line": 1279
2026-08-28T09:54:48.4692264Z             },
2026-08-28T09:54:48.4692526Z             {
2026-08-28T09:54:48.4692890Z               "path": "crates/spt-daemon/src/nethost.rs",
2026-08-28T09:54:48.4693166Z               "line": 1489
2026-08-28T09:54:48.4693429Z             },
2026-08-28T09:54:48.4693682Z             {
2026-08-28T09:54:48.4694138Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4694405Z               "line": 26
2026-08-28T09:54:48.4694658Z             },
2026-08-28T09:54:48.4694910Z             {
2026-08-28T09:54:48.4695278Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4695539Z               "line": 60
2026-08-28T09:54:48.4695792Z             },
2026-08-28T09:54:48.4696049Z             {
2026-08-28T09:54:48.4696413Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4696686Z               "line": 168
2026-08-28T09:54:48.4696938Z             },
2026-08-28T09:54:48.4697196Z             {
2026-08-28T09:54:48.4697559Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4697840Z               "line": 295
2026-08-28T09:54:48.4698091Z             },
2026-08-28T09:54:48.4698349Z             {
2026-08-28T09:54:48.4698726Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4699106Z               "line": 429
2026-08-28T09:54:48.4699365Z             },
2026-08-28T09:54:48.4699619Z             {
2026-08-28T09:54:48.4700014Z               "path": "crates/spt-net/src/net/pairing/meet.rs",
2026-08-28T09:54:48.4700286Z               "line": 252
2026-08-28T09:54:48.4700549Z             },
2026-08-28T09:54:48.4700806Z             {
2026-08-28T09:54:48.4701187Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4701549Z               "line": 13352
2026-08-28T09:54:48.4701843Z             },
2026-08-28T09:54:48.4702101Z             {
2026-08-28T09:54:48.4702415Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4702691Z               "line": 13901
2026-08-28T09:54:48.4702945Z             },
2026-08-28T09:54:48.4703206Z             {
2026-08-28T09:54:48.4703516Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4703788Z               "line": 14968
2026-08-28T09:54:48.4704117Z             }
2026-08-28T09:54:48.4704374Z           ]
2026-08-28T09:54:48.4704632Z         },
2026-08-28T09:54:48.4704884Z         "int": {
2026-08-28T09:54:48.4705194Z           "complete": true,
2026-08-28T09:54:48.4705451Z           "evidence": [
2026-08-28T09:54:48.4705704Z             {
2026-08-28T09:54:48.4706100Z               "path": "crates/spt-daemon/tests/pairjoin.rs",
2026-08-28T09:54:48.4706362Z               "line": 22
2026-08-28T09:54:48.4706623Z             },
2026-08-28T09:54:48.4706880Z             {
2026-08-28T09:54:48.4707255Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.4707522Z               "line": 989
2026-08-28T09:54:48.4707780Z             },
2026-08-28T09:54:48.4708032Z             {
2026-08-28T09:54:48.4708405Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.4708681Z               "line": 1804
2026-08-28T09:54:48.4708933Z             }
2026-08-28T09:54:48.4709267Z           ]
2026-08-28T09:54:48.4709523Z         },
2026-08-28T09:54:48.4709789Z         "unit": {
2026-08-28T09:54:48.4710070Z           "complete": true,
2026-08-28T09:54:48.4710352Z           "evidence": [
2026-08-28T09:54:48.4710604Z             {
2026-08-28T09:54:48.4710976Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4711248Z               "line": 1086
2026-08-28T09:54:48.4711500Z             },
2026-08-28T09:54:48.4711752Z             {
2026-08-28T09:54:48.4712062Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4712393Z               "line": 33589
2026-08-28T09:54:48.4712637Z             },
2026-08-28T09:54:48.4712899Z             {
2026-08-28T09:54:48.4713210Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4713485Z               "line": 38044
2026-08-28T09:54:48.4713742Z             }
2026-08-28T09:54:48.4713995Z           ]
2026-08-28T09:54:48.4714248Z         }
2026-08-28T09:54:48.4714497Z       }
2026-08-28T09:54:48.4714750Z     },
2026-08-28T09:54:48.4715005Z     {
2026-08-28T09:54:48.4715291Z       "id": "REQ-SUBNET-3",
2026-08-28T09:54:48.4716197Z       "title": "Node labels: hostname-default, gossiped, addressable in @node qualifiers (refuse-on-ambiguity)",
2026-08-28T09:54:48.4716493Z       "requiredStages": [
2026-08-28T09:54:48.4716756Z         "impl",
2026-08-28T09:54:48.4717008Z         "unit"
2026-08-28T09:54:48.4717269Z       ],
2026-08-28T09:54:48.4717524Z       "stages": {
2026-08-28T09:54:48.4717788Z         "doc": {
2026-08-28T09:54:48.4718078Z           "complete": false,
2026-08-28T09:54:48.4718355Z           "evidence": []
2026-08-28T09:54:48.4718607Z         },
2026-08-28T09:54:48.4718868Z         "impl": {
2026-08-28T09:54:48.4719231Z           "complete": true,
2026-08-28T09:54:48.4719502Z           "evidence": [
2026-08-28T09:54:48.4719760Z             {
2026-08-28T09:54:48.4720150Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4720424Z               "line": 173
2026-08-28T09:54:48.4720683Z             },
2026-08-28T09:54:48.4720940Z             {
2026-08-28T09:54:48.4721332Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4721607Z               "line": 387
2026-08-28T09:54:48.4721871Z             },
2026-08-28T09:54:48.4722123Z             {
2026-08-28T09:54:48.4722519Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4722788Z               "line": 632
2026-08-28T09:54:48.4723110Z             },
2026-08-28T09:54:48.4723363Z             {
2026-08-28T09:54:48.4723765Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4724046Z               "line": 743
2026-08-28T09:54:48.4724293Z             },
2026-08-28T09:54:48.4724551Z             {
2026-08-28T09:54:48.4724922Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4725194Z               "line": 125
2026-08-28T09:54:48.4725447Z             },
2026-08-28T09:54:48.4725704Z             {
2026-08-28T09:54:48.4726076Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4726410Z               "line": 434
2026-08-28T09:54:48.4726672Z             },
2026-08-28T09:54:48.4726924Z             {
2026-08-28T09:54:48.4727293Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4727564Z               "line": 445
2026-08-28T09:54:48.4727824Z             },
2026-08-28T09:54:48.4728085Z             {
2026-08-28T09:54:48.4728465Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4728733Z               "line": 466
2026-08-28T09:54:48.4729028Z             },
2026-08-28T09:54:48.4729310Z             {
2026-08-28T09:54:48.4729672Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4729934Z               "line": 886
2026-08-28T09:54:48.4730212Z             },
2026-08-28T09:54:48.4730484Z             {
2026-08-28T09:54:48.4730844Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4731114Z               "line": 897
2026-08-28T09:54:48.4731385Z             },
2026-08-28T09:54:48.4731637Z             {
2026-08-28T09:54:48.4732149Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4732582Z               "line": 957
2026-08-28T09:54:48.4732954Z             },
2026-08-28T09:54:48.4733401Z             {
2026-08-28T09:54:48.4733976Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:48.4734391Z               "line": 61
2026-08-28T09:54:48.4734772Z             },
2026-08-28T09:54:48.4735364Z             {
2026-08-28T09:54:48.4735865Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:48.4736144Z               "line": 90
2026-08-28T09:54:48.4736392Z             },
2026-08-28T09:54:48.4736650Z             {
2026-08-28T09:54:48.4737036Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:48.4737313Z               "line": 130
2026-08-28T09:54:48.4737566Z             },
2026-08-28T09:54:48.4737824Z             {
2026-08-28T09:54:48.4738210Z               "path": "crates/spt-store/src/hostlabel.rs",
2026-08-28T09:54:48.4738565Z               "line": 9
2026-08-28T09:54:48.4738830Z             },
2026-08-28T09:54:48.4739170Z             {
2026-08-28T09:54:48.4739517Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4739789Z               "line": 13710
2026-08-28T09:54:48.4740051Z             },
2026-08-28T09:54:48.4740303Z             {
2026-08-28T09:54:48.4740642Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.4740924Z               "line": 1281
2026-08-28T09:54:48.4741176Z             }
2026-08-28T09:54:48.4741517Z           ]
2026-08-28T09:54:48.4741916Z         },
2026-08-28T09:54:48.4742337Z         "int": {
2026-08-28T09:54:48.4742761Z           "complete": false,
2026-08-28T09:54:48.4743099Z           "evidence": []
2026-08-28T09:54:48.4743353Z         },
2026-08-28T09:54:48.4743615Z         "unit": {
2026-08-28T09:54:48.4743890Z           "complete": true,
2026-08-28T09:54:48.4744164Z           "evidence": [
2026-08-28T09:54:48.4744416Z             {
2026-08-28T09:54:48.4744826Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4745103Z               "line": 2004
2026-08-28T09:54:48.4745361Z             },
2026-08-28T09:54:48.4745614Z             {
2026-08-28T09:54:48.4746010Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4746285Z               "line": 2616
2026-08-28T09:54:48.4746642Z             },
2026-08-28T09:54:48.4747009Z             {
2026-08-28T09:54:48.4747420Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:48.4747696Z               "line": 1124
2026-08-28T09:54:48.4747948Z             },
2026-08-28T09:54:48.4748211Z             {
2026-08-28T09:54:48.4748578Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4748854Z               "line": 1677
2026-08-28T09:54:48.4749229Z             },
2026-08-28T09:54:48.4749486Z             {
2026-08-28T09:54:48.4749953Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4750234Z               "line": 1733
2026-08-28T09:54:48.4750492Z             },
2026-08-28T09:54:48.4750745Z             {
2026-08-28T09:54:48.4751112Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4751379Z               "line": 1792
2026-08-28T09:54:48.4751642Z             },
2026-08-28T09:54:48.4751902Z             {
2026-08-28T09:54:48.4752282Z               "path": "crates/spt-net/src/net/replicate.rs",
2026-08-28T09:54:48.4752559Z               "line": 245
2026-08-28T09:54:48.4752810Z             },
2026-08-28T09:54:48.4753073Z             {
2026-08-28T09:54:48.4753435Z               "path": "crates/spt-store/src/hostlabel.rs",
2026-08-28T09:54:48.4753712Z               "line": 67
2026-08-28T09:54:48.4753960Z             },
2026-08-28T09:54:48.4754218Z             {
2026-08-28T09:54:48.4754545Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4754819Z               "line": 34226
2026-08-28T09:54:48.4755091Z             },
2026-08-28T09:54:48.4755348Z             {
2026-08-28T09:54:48.4755672Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4756089Z               "line": 34418
2026-08-28T09:54:48.4756365Z             },
2026-08-28T09:54:48.4756622Z             {
2026-08-28T09:54:48.4756932Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4757207Z               "line": 38010
2026-08-28T09:54:48.4757462Z             }
2026-08-28T09:54:48.4757800Z           ]
2026-08-28T09:54:48.4758048Z         }
2026-08-28T09:54:48.4758309Z       }
2026-08-28T09:54:48.4758562Z     },
2026-08-28T09:54:48.4758810Z     {
2026-08-28T09:54:48.4759191Z       "id": "REQ-SUBNET-4",
2026-08-28T09:54:48.4760117Z       "title": "Subnet membership mutations elevation-gated (create = seed reveal; join = trust-boundary enrollment)",
2026-08-28T09:54:48.4760417Z       "requiredStages": [
2026-08-28T09:54:48.4760676Z         "impl",
2026-08-28T09:54:48.4760933Z         "unit"
2026-08-28T09:54:48.4761191Z       ],
2026-08-28T09:54:48.4761457Z       "stages": {
2026-08-28T09:54:48.4761777Z         "doc": {
2026-08-28T09:54:48.4762063Z           "complete": true,
2026-08-28T09:54:48.4762390Z           "evidence": [
2026-08-28T09:54:48.4762646Z             {
2026-08-28T09:54:48.4763124Z               "path": "docs/adr/0005-totp-seeded-spake2-node-pairing.md",
2026-08-28T09:54:48.4763395Z               "line": 60
2026-08-28T09:54:48.4763657Z             }
2026-08-28T09:54:48.4763910Z           ]
2026-08-28T09:54:48.4764167Z         },
2026-08-28T09:54:48.4764426Z         "impl": {
2026-08-28T09:54:48.4764712Z           "complete": true,
2026-08-28T09:54:48.4764991Z           "evidence": [
2026-08-28T09:54:48.4765241Z             {
2026-08-28T09:54:48.4765574Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4765842Z               "line": 12594
2026-08-28T09:54:48.4766100Z             },
2026-08-28T09:54:48.4766353Z             {
2026-08-28T09:54:48.4766678Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4766950Z               "line": 14874
2026-08-28T09:54:48.4767216Z             },
2026-08-28T09:54:48.4767478Z             {
2026-08-28T09:54:48.4767782Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4768064Z               "line": 14968
2026-08-28T09:54:48.4768312Z             }
2026-08-28T09:54:48.4768565Z           ]
2026-08-28T09:54:48.4768879Z         },
2026-08-28T09:54:48.4769203Z         "int": {
2026-08-28T09:54:48.4769490Z           "complete": false,
2026-08-28T09:54:48.4769766Z           "evidence": []
2026-08-28T09:54:48.4770027Z         },
2026-08-28T09:54:48.4770283Z         "unit": {
2026-08-28T09:54:48.4770569Z           "complete": true,
2026-08-28T09:54:48.4770831Z           "evidence": [
2026-08-28T09:54:48.4771088Z             {
2026-08-28T09:54:48.4771403Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4771669Z               "line": 33712
2026-08-28T09:54:48.4771922Z             },
2026-08-28T09:54:48.4772227Z             {
2026-08-28T09:54:48.4772541Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4772814Z               "line": 33851
2026-08-28T09:54:48.4773070Z             }
2026-08-28T09:54:48.4773326Z           ]
2026-08-28T09:54:48.4773583Z         }
2026-08-28T09:54:48.4773831Z       }
2026-08-28T09:54:48.4774084Z     },
2026-08-28T09:54:48.4774337Z     {
2026-08-28T09:54:48.4774633Z       "id": "REQ-SUBNET-5",
2026-08-28T09:54:48.4777971Z       "title": "Per-subnet serve-state: spt subnet detach <NAME> [--save] / attach <NAME> [--save] — daemon keeps running, stops/starts advertising + connecting for that subnet (peer pump + responder selective); --save persists the startup default in daemon config; the all-attached banner gains per-subnet states (M8 decision 6, --save renamed from --auto per decision 25 session)",
2026-08-28T09:54:48.4778271Z       "requiredStages": [
2026-08-28T09:54:48.4778529Z         "impl",
2026-08-28T09:54:48.4778786Z         "unit",
2026-08-28T09:54:48.4779129Z         "int"
2026-08-28T09:54:48.4779382Z       ],
2026-08-28T09:54:48.4779662Z       "stages": {
2026-08-28T09:54:48.4779921Z         "doc": {
2026-08-28T09:54:48.4780202Z           "complete": false,
2026-08-28T09:54:48.4780474Z           "evidence": []
2026-08-28T09:54:48.4780725Z         },
2026-08-28T09:54:48.4780989Z         "impl": {
2026-08-28T09:54:48.4781271Z           "complete": true,
2026-08-28T09:54:48.4781547Z           "evidence": [
2026-08-28T09:54:48.4781900Z             {
2026-08-28T09:54:48.4782272Z               "path": "crates/spt-daemon/src/daemon.rs",
2026-08-28T09:54:48.4782544Z               "line": 143
2026-08-28T09:54:48.4782792Z             },
2026-08-28T09:54:48.4783050Z             {
2026-08-28T09:54:48.4783416Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.4783687Z               "line": 1224
2026-08-28T09:54:48.4783938Z             },
2026-08-28T09:54:48.4784195Z             {
2026-08-28T09:54:48.4784564Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4784835Z               "line": 74
2026-08-28T09:54:48.4785144Z             },
2026-08-28T09:54:48.4785397Z             {
2026-08-28T09:54:48.4785760Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.4786154Z               "line": 475
2026-08-28T09:54:48.4786413Z             },
2026-08-28T09:54:48.4786657Z             {
2026-08-28T09:54:48.4787034Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.4787301Z               "line": 1130
2026-08-28T09:54:48.4787549Z             },
2026-08-28T09:54:48.4787802Z             {
2026-08-28T09:54:48.4788173Z               "path": "crates/spt-daemon/src/serveprobe.rs",
2026-08-28T09:54:48.4788442Z               "line": 31
2026-08-28T09:54:48.4788694Z             },
2026-08-28T09:54:48.4789007Z             {
2026-08-28T09:54:48.4789389Z               "path": "crates/spt-daemon/src/serveprobe.rs",
2026-08-28T09:54:48.4789656Z               "line": 50
2026-08-28T09:54:48.4789908Z             },
2026-08-28T09:54:48.4790166Z             {
2026-08-28T09:54:48.4790547Z               "path": "crates/spt-daemon/src/serveprobe.rs",
2026-08-28T09:54:48.4790809Z               "line": 69
2026-08-28T09:54:48.4791067Z             },
2026-08-28T09:54:48.4791323Z             {
2026-08-28T09:54:48.4791699Z               "path": "crates/spt-daemon/src/serveprobe.rs",
2026-08-28T09:54:48.4792046Z               "line": 113
2026-08-28T09:54:48.4792309Z             },
2026-08-28T09:54:48.4792557Z             {
2026-08-28T09:54:48.4792929Z               "path": "crates/spt-net/src/net/serveprobe.rs",
2026-08-28T09:54:48.4793201Z               "line": 25
2026-08-28T09:54:48.4793448Z             },
2026-08-28T09:54:48.4793706Z             {
2026-08-28T09:54:48.4794085Z               "path": "crates/spt-net/src/net/serveprobe.rs",
2026-08-28T09:54:48.4794345Z               "line": 34
2026-08-28T09:54:48.4794595Z             },
2026-08-28T09:54:48.4794852Z             {
2026-08-28T09:54:48.4795294Z               "path": "crates/spt-store/src/attachment.rs",
2026-08-28T09:54:48.4795561Z               "line": 17
2026-08-28T09:54:48.4795820Z             },
2026-08-28T09:54:48.4796073Z             {
2026-08-28T09:54:48.4796392Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4796661Z               "line": 14832
2026-08-28T09:54:48.4796922Z             },
2026-08-28T09:54:48.4797180Z             {
2026-08-28T09:54:48.4797513Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.4797790Z               "line": 1255
2026-08-28T09:54:48.4798034Z             }
2026-08-28T09:54:48.4798276Z           ]
2026-08-28T09:54:48.4798519Z         },
2026-08-28T09:54:48.4798781Z         "int": {
2026-08-28T09:54:48.4799139Z           "complete": true,
2026-08-28T09:54:48.4799419Z           "evidence": [
2026-08-28T09:54:48.4799673Z             {
2026-08-28T09:54:48.4800054Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:48.4800335Z               "line": 1051
2026-08-28T09:54:48.4800593Z             }
2026-08-28T09:54:48.4800855Z           ]
2026-08-28T09:54:48.4801103Z         },
2026-08-28T09:54:48.4801364Z         "unit": {
2026-08-28T09:54:48.4801646Z           "complete": true,
2026-08-28T09:54:48.4801916Z           "evidence": [
2026-08-28T09:54:48.4802177Z             {
2026-08-28T09:54:48.4802540Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:48.4802821Z               "line": 447
2026-08-28T09:54:48.4803145Z             },
2026-08-28T09:54:48.4803402Z             {
2026-08-28T09:54:48.4803766Z               "path": "crates/spt-daemon/src/pump/mod.rs",
2026-08-28T09:54:48.4804042Z               "line": 1992
2026-08-28T09:54:48.4804294Z             },
2026-08-28T09:54:48.4804551Z             {
2026-08-28T09:54:48.4804948Z               "path": "crates/spt-daemon/src/serveprobe.rs",
2026-08-28T09:54:48.4805220Z               "line": 151
2026-08-28T09:54:48.4805479Z             },
2026-08-28T09:54:48.4805741Z             {
2026-08-28T09:54:48.4806121Z               "path": "crates/spt-net/src/net/serveprobe.rs",
2026-08-28T09:54:48.4806441Z               "line": 61
2026-08-28T09:54:48.4806705Z             },
2026-08-28T09:54:48.4806948Z             {
2026-08-28T09:54:48.4807317Z               "path": "crates/spt-store/src/attachment.rs",
2026-08-28T09:54:48.4807592Z               "line": 111
2026-08-28T09:54:48.4807844Z             },
2026-08-28T09:54:48.4808101Z             {
2026-08-28T09:54:48.4808478Z               "path": "crates/spt-store/src/attachment.rs",
2026-08-28T09:54:48.4808754Z               "line": 138
2026-08-28T09:54:48.4809089Z             },
2026-08-28T09:54:48.4809351Z             {
2026-08-28T09:54:48.4809728Z               "path": "crates/spt-store/src/attachment.rs",
2026-08-28T09:54:48.4810003Z               "line": 148
2026-08-28T09:54:48.4810262Z             },
2026-08-28T09:54:48.4810514Z             {
2026-08-28T09:54:48.4810834Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4811110Z               "line": 33613
2026-08-28T09:54:48.4811367Z             }
2026-08-28T09:54:48.4811624Z           ]
2026-08-28T09:54:48.4811882Z         }
2026-08-28T09:54:48.4812136Z       }
2026-08-28T09:54:48.4812386Z     },
2026-08-28T09:54:48.4812641Z     {
2026-08-28T09:54:48.4812923Z       "id": "REQ-SUBNET-6",
2026-08-28T09:54:48.4815135Z       "title": "Trust lifecycle verbs, elevation-gated: spt subnet leave <NAME> (membership exit) and spt subnet prune <node> (removes a dead identity's trust + registry rows, killing its dead dials; trust mutation = security surface, REQ-PAIR-6 gate machinery) (M8 decisions 6-7)",
2026-08-28T09:54:48.4815494Z       "requiredStages": [
2026-08-28T09:54:48.4815757Z         "impl",
2026-08-28T09:54:48.4816010Z         "unit"
2026-08-28T09:54:48.4816272Z       ],
2026-08-28T09:54:48.4816539Z       "stages": {
2026-08-28T09:54:48.4816796Z         "doc": {
2026-08-28T09:54:48.4817087Z           "complete": false,
2026-08-28T09:54:48.4817358Z           "evidence": []
2026-08-28T09:54:48.4817678Z         },
2026-08-28T09:54:48.4817929Z         "impl": {
2026-08-28T09:54:48.4818215Z           "complete": true,
2026-08-28T09:54:48.4818486Z           "evidence": [
2026-08-28T09:54:48.4818743Z             {
2026-08-28T09:54:48.4819187Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4819455Z               "line": 435
2026-08-28T09:54:48.4819711Z             },
2026-08-28T09:54:48.4819973Z             {
2026-08-28T09:54:48.4820307Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4820578Z               "line": 14373
2026-08-28T09:54:48.4820836Z             },
2026-08-28T09:54:48.4821094Z             {
2026-08-28T09:54:48.4821404Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4821675Z               "line": 14390
2026-08-28T09:54:48.4821932Z             },
2026-08-28T09:54:48.4822189Z             {
2026-08-28T09:54:48.4822504Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4822780Z               "line": 14443
2026-08-28T09:54:48.4823037Z             },
2026-08-28T09:54:48.4823302Z             {
2026-08-28T09:54:48.4823612Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4823884Z               "line": 14466
2026-08-28T09:54:48.4824141Z             }
2026-08-28T09:54:48.4824394Z           ]
2026-08-28T09:54:48.4824651Z         },
2026-08-28T09:54:48.4824905Z         "int": {
2026-08-28T09:54:48.4825239Z           "complete": false,
2026-08-28T09:54:48.4825568Z           "evidence": []
2026-08-28T09:54:48.4825823Z         },
2026-08-28T09:54:48.4826087Z         "unit": {
2026-08-28T09:54:48.4826369Z           "complete": true,
2026-08-28T09:54:48.4826650Z           "evidence": [
2026-08-28T09:54:48.4826904Z             {
2026-08-28T09:54:48.4827209Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4827476Z               "line": 33627
2026-08-28T09:54:48.4827734Z             },
2026-08-28T09:54:48.4827986Z             {
2026-08-28T09:54:48.4828304Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4828583Z               "line": 33660
2026-08-28T09:54:48.4828893Z             },
2026-08-28T09:54:48.4829217Z             {
2026-08-28T09:54:48.4829528Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4829799Z               "line": 33669
2026-08-28T09:54:48.4830057Z             }
2026-08-28T09:54:48.4830315Z           ]
2026-08-28T09:54:48.4830572Z         }
2026-08-28T09:54:48.4830825Z       }
2026-08-28T09:54:48.4831077Z     },
2026-08-28T09:54:48.4831325Z     {
2026-08-28T09:54:48.4831610Z       "id": "REQ-SUBNET-7",
2026-08-28T09:54:48.4836478Z       "title": "Per-machine re-pair trust overwrite: registry rows carry a hashed stable machine identifier (OS machine id /etc/machine-id|MachineGuid, domain-separated SHA-256 before gossip, spt-minted persisted UUID fallback; additive serde-default field — old rows parse clean); a COMPLETED pairing ceremony presenting the same node label AND machine id as an existing trusted row evicts the superseded identity's trust + registry rows on the seed-holder and replicates the eviction; a gossiped claim alone never evicts trust (M8 decisions 13, 22)",
2026-08-28T09:54:48.4836797Z       "requiredStages": [
2026-08-28T09:54:48.4837055Z         "impl",
2026-08-28T09:54:48.4837311Z         "unit"
2026-08-28T09:54:48.4837568Z       ],
2026-08-28T09:54:48.4837821Z       "stages": {
2026-08-28T09:54:48.4838093Z         "doc": {
2026-08-28T09:54:48.4838445Z           "complete": false,
2026-08-28T09:54:48.4838723Z           "evidence": []
2026-08-28T09:54:48.4839054Z         },
2026-08-28T09:54:48.4839315Z         "impl": {
2026-08-28T09:54:48.4839602Z           "complete": true,
2026-08-28T09:54:48.4839878Z           "evidence": [
2026-08-28T09:54:48.4840130Z             {
2026-08-28T09:54:48.4840507Z               "path": "crates/spt-daemon/src/machineid.rs",
2026-08-28T09:54:48.4840779Z               "line": 17
2026-08-28T09:54:48.4841026Z             },
2026-08-28T09:54:48.4841285Z             {
2026-08-28T09:54:48.4841722Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4842004Z               "line": 103
2026-08-28T09:54:48.4842261Z             },
2026-08-28T09:54:48.4842514Z             {
2026-08-28T09:54:48.4842881Z               "path": "crates/spt-daemon/src/pairhost.rs",
2026-08-28T09:54:48.4843144Z               "line": 312
2026-08-28T09:54:48.4843406Z             },
2026-08-28T09:54:48.4843662Z             {
2026-08-28T09:54:48.4844067Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:48.4844341Z               "line": 236
2026-08-28T09:54:48.4844603Z             },
2026-08-28T09:54:48.4844861Z             {
2026-08-28T09:54:48.4845367Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4845648Z               "line": 181
2026-08-28T09:54:48.4845900Z             },
2026-08-28T09:54:48.4846148Z             {
2026-08-28T09:54:48.4846535Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4846815Z               "line": 636
2026-08-28T09:54:48.4847066Z             },
2026-08-28T09:54:48.4847328Z             {
2026-08-28T09:54:48.4847715Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4847986Z               "line": 941
2026-08-28T09:54:48.4848254Z             },
2026-08-28T09:54:48.4848505Z             {
2026-08-28T09:54:48.4848893Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4849269Z               "line": 1101
2026-08-28T09:54:48.4849619Z             },
2026-08-28T09:54:48.4849871Z             {
2026-08-28T09:54:48.4850257Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4850529Z               "line": 1157
2026-08-28T09:54:48.4850782Z             },
2026-08-28T09:54:48.4851038Z             {
2026-08-28T09:54:48.4851426Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4851697Z               "line": 136
2026-08-28T09:54:48.4851954Z             },
2026-08-28T09:54:48.4852211Z             {
2026-08-28T09:54:48.4852587Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4852916Z               "line": 139
2026-08-28T09:54:48.4853175Z             }
2026-08-28T09:54:48.4853427Z           ]
2026-08-28T09:54:48.4853681Z         },
2026-08-28T09:54:48.4853937Z         "int": {
2026-08-28T09:54:48.4854222Z           "complete": false,
2026-08-28T09:54:48.4854503Z           "evidence": []
2026-08-28T09:54:48.4854839Z         },
2026-08-28T09:54:48.4855230Z         "unit": {
2026-08-28T09:54:48.4855651Z           "complete": true,
2026-08-28T09:54:48.4855961Z           "evidence": [
2026-08-28T09:54:48.4856218Z             {
2026-08-28T09:54:48.4856595Z               "path": "crates/spt-daemon/src/machineid.rs",
2026-08-28T09:54:48.4862678Z               "line": 140
2026-08-28T09:54:48.4862967Z             },
2026-08-28T09:54:48.4863233Z             {
2026-08-28T09:54:48.4863630Z               "path": "crates/spt-daemon/src/machineid.rs",
2026-08-28T09:54:48.4863906Z               "line": 160
2026-08-28T09:54:48.4864167Z             },
2026-08-28T09:54:48.4864421Z             {
2026-08-28T09:54:48.4864826Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4865101Z               "line": 1556
2026-08-28T09:54:48.4865362Z             },
2026-08-28T09:54:48.4865620Z             {
2026-08-28T09:54:48.4866024Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.4866405Z               "line": 1578
2026-08-28T09:54:48.4866659Z             },
2026-08-28T09:54:48.4866911Z             {
2026-08-28T09:54:48.4867293Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4867569Z               "line": 1646
2026-08-28T09:54:48.4867823Z             },
2026-08-28T09:54:48.4868078Z             {
2026-08-28T09:54:48.4868439Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.4868715Z               "line": 1728
2026-08-28T09:54:48.4869243Z             }
2026-08-28T09:54:48.4869512Z           ]
2026-08-28T09:54:48.4869769Z         }
2026-08-28T09:54:48.4870013Z       }
2026-08-28T09:54:48.4870255Z     },
2026-08-28T09:54:48.4870497Z     {
2026-08-28T09:54:48.4870790Z       "id": "REQ-SUBNET-8",
2026-08-28T09:54:48.4874060Z       "title": "Status render honesty: zero-subnet text is daemon-aware ('No subnets registered — this node is standalone.' + daemon-running-dependent blurb, never implying messaging works while the daemon is down); hint footer prints on bare spt subnet only (status drops it); a stalled pump is surfaced in subnet status, never rendered implied-healthy (M8 decisions 11-12, 23)",
2026-08-28T09:54:48.4874375Z       "requiredStages": [
2026-08-28T09:54:48.4874642Z         "impl",
2026-08-28T09:54:48.4874895Z         "unit"
2026-08-28T09:54:48.4875154Z       ],
2026-08-28T09:54:48.4875411Z       "stages": {
2026-08-28T09:54:48.4875671Z         "doc": {
2026-08-28T09:54:48.4875955Z           "complete": false,
2026-08-28T09:54:48.4876326Z           "evidence": []
2026-08-28T09:54:48.4876636Z         },
2026-08-28T09:54:48.4876904Z         "impl": {
2026-08-28T09:54:48.4877190Z           "complete": true,
2026-08-28T09:54:48.4877467Z           "evidence": [
2026-08-28T09:54:48.4877715Z             {
2026-08-28T09:54:48.4878030Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4878307Z               "line": 13451
2026-08-28T09:54:48.4878571Z             },
2026-08-28T09:54:48.4878822Z             {
2026-08-28T09:54:48.4879333Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4879600Z               "line": 13506
2026-08-28T09:54:48.4879857Z             },
2026-08-28T09:54:48.4880110Z             {
2026-08-28T09:54:48.4880424Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4880696Z               "line": 13523
2026-08-28T09:54:48.4880950Z             },
2026-08-28T09:54:48.4881210Z             {
2026-08-28T09:54:48.4881518Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4881794Z               "line": 13546
2026-08-28T09:54:48.4882113Z             },
2026-08-28T09:54:48.4882366Z             {
2026-08-28T09:54:48.4882676Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4882953Z               "line": 14018
2026-08-28T09:54:48.4883206Z             }
2026-08-28T09:54:48.4883460Z           ]
2026-08-28T09:54:48.4883717Z         },
2026-08-28T09:54:48.4883958Z         "int": {
2026-08-28T09:54:48.4884244Z           "complete": false,
2026-08-28T09:54:48.4884521Z           "evidence": []
2026-08-28T09:54:48.4884778Z         },
2026-08-28T09:54:48.4885036Z         "unit": {
2026-08-28T09:54:48.4885322Z           "complete": true,
2026-08-28T09:54:48.4885593Z           "evidence": [
2026-08-28T09:54:48.4885855Z             {
2026-08-28T09:54:48.4886174Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4886444Z               "line": 34085
2026-08-28T09:54:48.4886702Z             },
2026-08-28T09:54:48.4886959Z             {
2026-08-28T09:54:48.4887279Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4887555Z               "line": 34101
2026-08-28T09:54:48.4887807Z             }
2026-08-28T09:54:48.4888065Z           ]
2026-08-28T09:54:48.4888327Z         }
2026-08-28T09:54:48.4888581Z       }
2026-08-28T09:54:48.4888829Z     },
2026-08-28T09:54:48.4889155Z     {
2026-08-28T09:54:48.4889477Z       "id": "REQ-SUBNET-ADMIN-CODE-JOIN",
2026-08-28T09:54:48.4897433Z       "title": "The join ceremony accepts EITHER subnet code: the SPAKE2 responder computes the member-key TOTP and the admin-key TOTP and admits a joiner proving either (ADR-0051 decision 1 — 'an admin key IS a membership key'). Indistinguishable from the joiner's side: the ceremony must not tell a joiner, or an observer of the exchange, WHICH key authenticated beyond what the protocol inherently requires — an oracle that separates admin codes from member codes turns every join attempt into a probe for which secret a machine holds. Rate limiting, transcript binding and replay defenses apply identically to both, so the second acceptable secret does not become the cheaper one to attack. Gate: doc — ADR-0051 decision 1 plus the CONTEXT.md two-key entry; impl — the responder's dual-code computation and admit path; unit — a member code joins, an admin code joins, a wrong code is refused identically to today, and the refusal/accept surface carries no key-kind discriminator.",
2026-08-28T09:54:48.4897863Z       "requiredStages": [
2026-08-28T09:54:48.4898120Z         "doc",
2026-08-28T09:54:48.4898391Z         "impl",
2026-08-28T09:54:48.4898644Z         "unit"
2026-08-28T09:54:48.4898896Z       ],
2026-08-28T09:54:48.4899268Z       "stages": {
2026-08-28T09:54:48.4899531Z         "doc": {
2026-08-28T09:54:48.4899816Z           "complete": true,
2026-08-28T09:54:48.4900086Z           "evidence": [
2026-08-28T09:54:48.4900343Z             {
2026-08-28T09:54:48.4900796Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.4901068Z               "line": 42
2026-08-28T09:54:48.4901321Z             },
2026-08-28T09:54:48.4901583Z             {
2026-08-28T09:54:48.4902027Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.4902292Z               "line": 187
2026-08-28T09:54:48.4902551Z             }
2026-08-28T09:54:48.4902800Z           ]
2026-08-28T09:54:48.4903058Z         },
2026-08-28T09:54:48.4903311Z         "impl": {
2026-08-28T09:54:48.4903597Z           "complete": true,
2026-08-28T09:54:48.4903940Z           "evidence": [
2026-08-28T09:54:48.4904197Z             {
2026-08-28T09:54:48.4904604Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:48.4904871Z               "line": 188
2026-08-28T09:54:48.4905130Z             },
2026-08-28T09:54:48.4905464Z             {
2026-08-28T09:54:48.4905927Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4906200Z               "line": 324
2026-08-28T09:54:48.4906452Z             },
2026-08-28T09:54:48.4906713Z             {
2026-08-28T09:54:48.4907106Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4907447Z               "line": 352
2026-08-28T09:54:48.4907701Z             },
2026-08-28T09:54:48.4907964Z             {
2026-08-28T09:54:48.4908345Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4908627Z               "line": 396
2026-08-28T09:54:48.4908885Z             },
2026-08-28T09:54:48.4909204Z             {
2026-08-28T09:54:48.4909590Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4909857Z               "line": 506
2026-08-28T09:54:48.4910114Z             },
2026-08-28T09:54:48.4910367Z             {
2026-08-28T09:54:48.4910756Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4911023Z               "line": 530
2026-08-28T09:54:48.4911286Z             },
2026-08-28T09:54:48.4911537Z             {
2026-08-28T09:54:48.4911920Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4912196Z               "line": 751
2026-08-28T09:54:48.4912453Z             },
2026-08-28T09:54:48.4912715Z             {
2026-08-28T09:54:48.4913093Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4913370Z               "line": 999
2026-08-28T09:54:48.4913623Z             }
2026-08-28T09:54:48.4913880Z           ]
2026-08-28T09:54:48.4914195Z         },
2026-08-28T09:54:48.4914462Z         "int": {
2026-08-28T09:54:48.4914748Z           "complete": false,
2026-08-28T09:54:48.4915019Z           "evidence": []
2026-08-28T09:54:48.4915277Z         },
2026-08-28T09:54:48.4915535Z         "unit": {
2026-08-28T09:54:48.4915821Z           "complete": true,
2026-08-28T09:54:48.4916082Z           "evidence": [
2026-08-28T09:54:48.4916329Z             {
2026-08-28T09:54:48.4916717Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:48.4916978Z               "line": 484
2026-08-28T09:54:48.4917298Z             },
2026-08-28T09:54:48.4917546Z             {
2026-08-28T09:54:48.4917949Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:48.4918210Z               "line": 506
2026-08-28T09:54:48.4918453Z             },
2026-08-28T09:54:48.4918706Z             {
2026-08-28T09:54:48.4919192Z               "path": "crates/spt-net/src/net/pairing/spake.rs",
2026-08-28T09:54:48.4919464Z               "line": 548
2026-08-28T09:54:48.4919716Z             },
2026-08-28T09:54:48.4919980Z             {
2026-08-28T09:54:48.4920374Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4920652Z               "line": 1908
2026-08-28T09:54:48.4920903Z             },
2026-08-28T09:54:48.4921163Z             {
2026-08-28T09:54:48.4921536Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4921807Z               "line": 1955
2026-08-28T09:54:48.4922064Z             },
2026-08-28T09:54:48.4922312Z             {
2026-08-28T09:54:48.4922698Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4922975Z               "line": 2055
2026-08-28T09:54:48.4923227Z             },
2026-08-28T09:54:48.4923479Z             {
2026-08-28T09:54:48.4923878Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4924145Z               "line": 2081
2026-08-28T09:54:48.4924403Z             }
2026-08-28T09:54:48.4924664Z           ]
2026-08-28T09:54:48.4924916Z         }
2026-08-28T09:54:48.4925246Z       }
2026-08-28T09:54:48.4925498Z     },
2026-08-28T09:54:48.4925752Z     {
2026-08-28T09:54:48.4926071Z       "id": "REQ-SUBNET-ADMIN-RESURFACE",
2026-08-28T09:54:48.4940375Z       "title": "Rotation re-surfaces the NEW admin key exactly once, to the human who just proved the OLD one, via a PARKED pending seed (ADR-0051 §2a + the parked-pending-key ruling, FF grill 2026-07-30). Choreography: after the revoke's admin gate passes, the pending admin seed is minted where the human is (never at the unattended rotation site), displayed with the same code-free capture-proof ceremony as create, proven captured, and PARKED on the rotation schedule BEFORE the tombstone write — so 'schedule exists but parked seed absent' is a corruption class, never a race. The window-close rotation ADOPTS the parked seed instead of minting; a later revoke in the same window re-displays the SAME parked key behind its own proofs (one pending key per window, however many humans capture it, one epoch bump at the close); --force is the same choreography with the window degenerate (park, rotate now, clear). DEGRADE, ruled: a close with the parked seed absent or corrupt rotates the MEMBER seed anyway — the evicted node must not stay inside member fabric waiting on admin choreography — keeps the OLD admin seed in force, and is LOUD (stderr + a node-scope notif naming the state and the recovery verb, revoke --force-rotate-seed); never a silent skip, never a bricked close. The parked seed is cleared on adoption. The member key never re-surfaces at revoke (show-code covers it). Gate: doc — ADR-0051 §2a; impl — the park/parked schedule fields, the adopt-not-mint rotation, the ceremony driver, and the degrade loudness; unit — park requires an existing entry, never overwrites within a window, round-trips, reads corrupt-as-absent; rotation adopts the parked seed and degrades member-only keeping the old admin key.",
2026-08-28T09:54:48.4940832Z       "requiredStages": [
2026-08-28T09:54:48.4941161Z         "doc",
2026-08-28T09:54:48.4941429Z         "impl",
2026-08-28T09:54:48.4941692Z         "unit"
2026-08-28T09:54:48.4941942Z       ],
2026-08-28T09:54:48.4942206Z       "stages": {
2026-08-28T09:54:48.4942469Z         "doc": {
2026-08-28T09:54:48.4942746Z           "complete": true,
2026-08-28T09:54:48.4943014Z           "evidence": [
2026-08-28T09:54:48.4943266Z             {
2026-08-28T09:54:48.4943891Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.4944177Z               "line": 108
2026-08-28T09:54:48.4944518Z             }
2026-08-28T09:54:48.4944773Z           ]
2026-08-28T09:54:48.4945036Z         },
2026-08-28T09:54:48.4945303Z         "impl": {
2026-08-28T09:54:48.4945585Z           "complete": true,
2026-08-28T09:54:48.4945866Z           "evidence": [
2026-08-28T09:54:48.4946123Z             {
2026-08-28T09:54:48.4946525Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:48.4946796Z               "line": 58
2026-08-28T09:54:48.4947053Z             },
2026-08-28T09:54:48.4947309Z             {
2026-08-28T09:54:48.4947709Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:48.4947991Z               "line": 110
2026-08-28T09:54:48.4948239Z             },
2026-08-28T09:54:48.4948497Z             {
2026-08-28T09:54:48.4948892Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:48.4949235Z               "line": 56
2026-08-28T09:54:48.4949493Z             },
2026-08-28T09:54:48.4949749Z             {
2026-08-28T09:54:48.4950120Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:48.4950392Z               "line": 148
2026-08-28T09:54:48.4950650Z             },
2026-08-28T09:54:48.4950901Z             {
2026-08-28T09:54:48.4951259Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:48.4951530Z               "line": 164
2026-08-28T09:54:48.4951788Z             },
2026-08-28T09:54:48.4952040Z             {
2026-08-28T09:54:48.4952398Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.4952739Z               "line": 469
2026-08-28T09:54:48.4952992Z             },
2026-08-28T09:54:48.4953249Z             {
2026-08-28T09:54:48.4953592Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.4953869Z               "line": 481
2026-08-28T09:54:48.4954126Z             },
2026-08-28T09:54:48.4954378Z             {
2026-08-28T09:54:48.4954693Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4954969Z               "line": 14641
2026-08-28T09:54:48.4955244Z             },
2026-08-28T09:54:48.4955497Z             {
2026-08-28T09:54:48.4955878Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.4956173Z               "line": 14732
2026-08-28T09:54:48.4956426Z             }
2026-08-28T09:54:48.4956669Z           ]
2026-08-28T09:54:48.4956921Z         },
2026-08-28T09:54:48.4957173Z         "int": {
2026-08-28T09:54:48.4957461Z           "complete": false,
2026-08-28T09:54:48.4957743Z           "evidence": []
2026-08-28T09:54:48.4957998Z         },
2026-08-28T09:54:48.4958260Z         "unit": {
2026-08-28T09:54:48.4958541Z           "complete": true,
2026-08-28T09:54:48.4958822Z           "evidence": [
2026-08-28T09:54:48.4959156Z             {
2026-08-28T09:54:48.4959553Z               "path": "crates/spt-daemon/src/pump/registry.rs",
2026-08-28T09:54:48.4959824Z               "line": 522
2026-08-28T09:54:48.4960086Z             },
2026-08-28T09:54:48.4960337Z             {
2026-08-28T09:54:48.4960708Z               "path": "crates/spt-store/src/rotation.rs",
2026-08-28T09:54:48.4960995Z               "line": 250
2026-08-28T09:54:48.4961252Z             },
2026-08-28T09:54:48.4961510Z             {
2026-08-28T09:54:48.4961858Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.4962125Z               "line": 805
2026-08-28T09:54:48.4962377Z             }
2026-08-28T09:54:48.4962629Z           ]
2026-08-28T09:54:48.4962972Z         }
2026-08-28T09:54:48.4963223Z       }
2026-08-28T09:54:48.4963485Z     },
2026-08-28T09:54:48.4963732Z     {
2026-08-28T09:54:48.4964096Z       "id": "REQ-SUBNET-ADMIN-SEED-REPLICATION",
2026-08-28T09:54:48.4974312Z       "title": "Every member node holds BOTH subnet seeds — the admin seed replicates at join exactly as the member seed does — because empower verification and admin-code joins are LOCAL operations any member node must be able to serve without consulting a privileged peer (ADR-0051 decision 2; the mesh stays symmetric, authority rides a key rather than a node). Carries the NO-REVEAL invariant, which is the load-bearing half: there is no admin show-code, no QR re-provision, no `--json` field, no debug/diagnostic/error/log rendering of the admin seed ANYWHERE — it is displayed exactly once, at creation, and thereafter no node can leak what no node can reveal. A lost authenticator entry is irrecoverable by design (ADR-0051 decision 3): re-mint the subnet. The invariant binds tests too — a test that asserts the seed's VALUE by printing it is itself the leak (secret-probe discipline: never expand a secret into an observable sink). Gate: doc — ADR-0051 decisions 2 and 3; impl — admin-seed replication on the join path and the absence of every reveal surface; unit — a joined node holds both seeds and can verify an admin code locally, and no CLI/JSON/diagnostic output path emits the admin seed.",
2026-08-28T09:54:48.4974722Z       "requiredStages": [
2026-08-28T09:54:48.4974980Z         "doc",
2026-08-28T09:54:48.4975242Z         "impl",
2026-08-28T09:54:48.4975499Z         "unit"
2026-08-28T09:54:48.4975770Z       ],
2026-08-28T09:54:48.4976038Z       "stages": {
2026-08-28T09:54:48.4976313Z         "doc": {
2026-08-28T09:54:48.4976588Z           "complete": true,
2026-08-28T09:54:48.4976869Z           "evidence": [
2026-08-28T09:54:48.4977126Z             {
2026-08-28T09:54:48.4977575Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.4977857Z               "line": 98
2026-08-28T09:54:48.4978123Z             },
2026-08-28T09:54:48.4978463Z             {
2026-08-28T09:54:48.4978891Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.4979248Z               "line": 160
2026-08-28T09:54:48.4979501Z             }
2026-08-28T09:54:48.4979753Z           ]
2026-08-28T09:54:48.4980015Z         },
2026-08-28T09:54:48.4980277Z         "impl": {
2026-08-28T09:54:48.4980569Z           "complete": true,
2026-08-28T09:54:48.4980844Z           "evidence": [
2026-08-28T09:54:48.4981094Z             {
2026-08-28T09:54:48.4981490Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4981824Z               "line": 283
2026-08-28T09:54:48.4982077Z             },
2026-08-28T09:54:48.4982339Z             {
2026-08-28T09:54:48.4982720Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4982993Z               "line": 421
2026-08-28T09:54:48.4983250Z             },
2026-08-28T09:54:48.4983506Z             {
2026-08-28T09:54:48.4983899Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4984172Z               "line": 571
2026-08-28T09:54:48.4984438Z             },
2026-08-28T09:54:48.4984696Z             {
2026-08-28T09:54:48.4985091Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4985363Z               "line": 686
2026-08-28T09:54:48.4985635Z             },
2026-08-28T09:54:48.4985884Z             {
2026-08-28T09:54:48.4986269Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4986541Z               "line": 834
2026-08-28T09:54:48.4986807Z             },
2026-08-28T09:54:48.4987056Z             {
2026-08-28T09:54:48.4987419Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.4987696Z               "line": 338
2026-08-28T09:54:48.4987944Z             }
2026-08-28T09:54:48.4988197Z           ]
2026-08-28T09:54:48.4988450Z         },
2026-08-28T09:54:48.4988774Z         "int": {
2026-08-28T09:54:48.4989141Z           "complete": false,
2026-08-28T09:54:48.4989432Z           "evidence": []
2026-08-28T09:54:48.4989684Z         },
2026-08-28T09:54:48.4989946Z         "unit": {
2026-08-28T09:54:48.4990241Z           "complete": true,
2026-08-28T09:54:48.4990513Z           "evidence": [
2026-08-28T09:54:48.4990770Z             {
2026-08-28T09:54:48.4991152Z               "path": "crates/spt-net/src/net/pairing/wire.rs",
2026-08-28T09:54:48.4991428Z               "line": 1814
2026-08-28T09:54:48.4991682Z             },
2026-08-28T09:54:48.4992004Z             {
2026-08-28T09:54:48.4992352Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.4992623Z               "line": 928
2026-08-28T09:54:48.4992885Z             }
2026-08-28T09:54:48.4993137Z           ]
2026-08-28T09:54:48.4993389Z         }
2026-08-28T09:54:48.4993647Z       }
2026-08-28T09:54:48.4993901Z     },
2026-08-28T09:54:48.4994149Z     {
2026-08-28T09:54:48.4994601Z       "id": "REQ-SUBNET-ADMIN-SEED-ROTATION",
2026-08-28T09:54:48.5005591Z       "title": "Evicting a node rotates BOTH subnet seeds, not just the member seed. ADR-0005 #10 made removal real revocation by rotating the seed a removed node still holds; the two-key model (ADR-0051) hands every member a SECOND durable secret, and `rotate_seed` does not touch it — so as of the two-key wave an evicted node keeps the admin seed forever. That is worse than residual admin authority: an admin key IS a membership key (REQ-SUBNET-ADMIN-CODE-JOIN), so the evicted node can REJOIN the subnet on its admin TOTP, and eviction becomes toothless against exactly the nodes that were trusted enough to hold elevated credentials. ADR-0051's consequences acknowledge admin-seed rotation as unassigned milestone work; this is that work. Minimum shape: the eviction path rotates both seeds and redistributes both over the same replication machinery the join path uses, with the one-deep prior-generation grace applying to the member seed as today (an admin seed has no re-provisioning surface, so its grace question is answered by the same replication, not by a reveal). Gate: doc — ADR-0051 amended with the rotation rule; impl — the eviction/rotation path covering both seeds; unit — a rotated subnet's admin seed changes, and a node holding only the pre-rotation admin seed neither verifies an admin operation nor rejoins.",
2026-08-28T09:54:48.5006078Z       "requiredStages": [
2026-08-28T09:54:48.5006336Z         "doc",
2026-08-28T09:54:48.5006598Z         "impl",
2026-08-28T09:54:48.5006850Z         "unit"
2026-08-28T09:54:48.5007107Z       ],
2026-08-28T09:54:48.5007371Z       "stages": {
2026-08-28T09:54:48.5007634Z         "doc": {
2026-08-28T09:54:48.5007975Z           "complete": true,
2026-08-28T09:54:48.5008249Z           "evidence": [
2026-08-28T09:54:48.5008506Z             {
2026-08-28T09:54:48.5009022Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.5009298Z               "line": 108
2026-08-28T09:54:48.5009561Z             },
2026-08-28T09:54:48.5009828Z             {
2026-08-28T09:54:48.5010275Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.5010557Z               "line": 169
2026-08-28T09:54:48.5010818Z             }
2026-08-28T09:54:48.5011070Z           ]
2026-08-28T09:54:48.5011328Z         },
2026-08-28T09:54:48.5011581Z         "impl": {
2026-08-28T09:54:48.5011867Z           "complete": true,
2026-08-28T09:54:48.5012144Z           "evidence": [
2026-08-28T09:54:48.5012402Z             {
2026-08-28T09:54:48.5012778Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.5013054Z               "line": 76
2026-08-28T09:54:48.5013313Z             },
2026-08-28T09:54:48.5013566Z             {
2026-08-28T09:54:48.5013947Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.5014214Z               "line": 740
2026-08-28T09:54:48.5014477Z             },
2026-08-28T09:54:48.5014725Z             {
2026-08-28T09:54:48.5015173Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.5015444Z               "line": 748
2026-08-28T09:54:48.5015712Z             },
2026-08-28T09:54:48.5015963Z             {
2026-08-28T09:54:48.5016343Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.5016615Z               "line": 766
2026-08-28T09:54:48.5016868Z             },
2026-08-28T09:54:48.5017119Z             {
2026-08-28T09:54:48.5017497Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.5017773Z               "line": 1184
2026-08-28T09:54:48.5018088Z             },
2026-08-28T09:54:48.5018339Z             {
2026-08-28T09:54:48.5018704Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5019042Z               "line": 304
2026-08-28T09:54:48.5019304Z             },
2026-08-28T09:54:48.5019553Z             {
2026-08-28T09:54:48.5019911Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5020182Z               "line": 349
2026-08-28T09:54:48.5020446Z             },
2026-08-28T09:54:48.5020703Z             {
2026-08-28T09:54:48.5021061Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5021335Z               "line": 468
2026-08-28T09:54:48.5021597Z             },
2026-08-28T09:54:48.5021854Z             {
2026-08-28T09:54:48.5022203Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5022475Z               "line": 524
2026-08-28T09:54:48.5022732Z             }
2026-08-28T09:54:48.5022991Z           ]
2026-08-28T09:54:48.5023248Z         },
2026-08-28T09:54:48.5023508Z         "int": {
2026-08-28T09:54:48.5023797Z           "complete": true,
2026-08-28T09:54:48.5024074Z           "evidence": [
2026-08-28T09:54:48.5024332Z             {
2026-08-28T09:54:48.5024698Z               "path": "crates/spt-daemon/tests/reseed.rs",
2026-08-28T09:54:48.5024975Z               "line": 159
2026-08-28T09:54:48.5025228Z             }
2026-08-28T09:54:48.5025486Z           ]
2026-08-28T09:54:48.5025752Z         },
2026-08-28T09:54:48.5026004Z         "unit": {
2026-08-28T09:54:48.5026361Z           "complete": true,
2026-08-28T09:54:48.5026631Z           "evidence": [
2026-08-28T09:54:48.5026884Z             {
2026-08-28T09:54:48.5027265Z               "path": "crates/spt-daemon/src/seedproofx.rs",
2026-08-28T09:54:48.5027537Z               "line": 1216
2026-08-28T09:54:48.5027790Z             },
2026-08-28T09:54:48.5028047Z             {
2026-08-28T09:54:48.5028401Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5028668Z               "line": 766
2026-08-28T09:54:48.5028928Z             },
2026-08-28T09:54:48.5029326Z             {
2026-08-28T09:54:48.5029675Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5029941Z               "line": 804
2026-08-28T09:54:48.5030198Z             },
2026-08-28T09:54:48.5030451Z             {
2026-08-28T09:54:48.5030805Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5031081Z               "line": 839
2026-08-28T09:54:48.5031330Z             },
2026-08-28T09:54:48.5031588Z             {
2026-08-28T09:54:48.5031938Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5032215Z               "line": 888
2026-08-28T09:54:48.5032467Z             }
2026-08-28T09:54:48.5032725Z           ]
2026-08-28T09:54:48.5032978Z         }
2026-08-28T09:54:48.5033232Z       }
2026-08-28T09:54:48.5033484Z     },
2026-08-28T09:54:48.5033736Z     {
2026-08-28T09:54:48.5034064Z       "id": "REQ-SUBNET-COUNT-ROUTABLE",
2026-08-28T09:54:48.5039175Z       "title": "Bug #2: a remote node endpoint count drifts (0/2, 1/3) because node_status_rows (cli.rs:5314) increments the per-node total unconditionally, counting non-routable Offline ghost rows; purge is not a registry eviction (it gossips a one-shot Offline row that is immortal on remote viewers — eviction is per whole-node only). Fix: routable-only denominator (total += status.routable()) keeping a separate raw count for the all-Offline liveness branch; plus per-row Offline-TTL eviction so purged endpoints stop accumulating on remote snapshots. See docs/NEXT-MILESTONE-BUG-TRIAGE.md #2.",
2026-08-28T09:54:48.5039583Z       "requiredStages": [
2026-08-28T09:54:48.5039843Z         "impl",
2026-08-28T09:54:48.5040097Z         "unit"
2026-08-28T09:54:48.5040354Z       ],
2026-08-28T09:54:48.5040612Z       "stages": {
2026-08-28T09:54:48.5040875Z         "doc": {
2026-08-28T09:54:48.5041164Z           "complete": false,
2026-08-28T09:54:48.5041441Z           "evidence": []
2026-08-28T09:54:48.5041694Z         },
2026-08-28T09:54:48.5042028Z         "impl": {
2026-08-28T09:54:48.5042322Z           "complete": true,
2026-08-28T09:54:48.5042590Z           "evidence": [
2026-08-28T09:54:48.5042848Z             {
2026-08-28T09:54:48.5043167Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5043448Z               "line": 13663
2026-08-28T09:54:48.5043700Z             }
2026-08-28T09:54:48.5043957Z           ]
2026-08-28T09:54:48.5044214Z         },
2026-08-28T09:54:48.5044473Z         "int": {
2026-08-28T09:54:48.5044772Z           "complete": false,
2026-08-28T09:54:48.5045041Z           "evidence": []
2026-08-28T09:54:48.5045303Z         },
2026-08-28T09:54:48.5045561Z         "unit": {
2026-08-28T09:54:48.5045847Z           "complete": true,
2026-08-28T09:54:48.5046114Z           "evidence": [
2026-08-28T09:54:48.5046368Z             {
2026-08-28T09:54:48.5046678Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5046950Z               "line": 34338
2026-08-28T09:54:48.5047211Z             }
2026-08-28T09:54:48.5047572Z           ]
2026-08-28T09:54:48.5047846Z         }
2026-08-28T09:54:48.5048099Z       }
2026-08-28T09:54:48.5048353Z     },
2026-08-28T09:54:48.5048601Z     {
2026-08-28T09:54:48.5049043Z       "id": "REQ-SUBNET-CREATE-CAPTURE-PROOF",
2026-08-28T09:54:48.5060062Z       "title": "`subnet create` proves the admin key was captured before anything persists (ADR-0051 §2b, FF grill 2026-07-30). Ceremony order, binding: the admin material displays FIRST — labelled otpauth URI + terminal QR, with NO current TOTP code anywhere on screen, because that absence is the proof's soundness (the typed-back code cannot be produced from what the screen shows, only from an authenticator that captured the seed); the human types a current admin code back, accepted within the same ±1-step window the pairing ceremonies use; the admin material is then cleared, scrollback included; and only then does the member material display, at the very end. Creation does not complete without the proof: the mint persists only after it, so a cancel, three wrong codes, or a non-interactive stdin (refused before any material is written into a pipe) leaves NO subnet — never a subnet whose admin key nobody holds, and decision 3's irrecoverability cost stays a choice rather than an accident of a missed scan. Gate: doc — ADR-0051 §2b; impl — the phased ceremony driver, the code-free capture display, the windowed proof check, and the proof-gated persist; unit — the capture display carries the provisioning material and none of the window's current codes, and the proof check accepts exactly the ±1 window.",
2026-08-28T09:54:48.5060636Z       "requiredStages": [
2026-08-28T09:54:48.5060892Z         "doc",
2026-08-28T09:54:48.5061165Z         "impl",
2026-08-28T09:54:48.5061417Z         "unit"
2026-08-28T09:54:48.5061675Z       ],
2026-08-28T09:54:48.5061941Z       "stages": {
2026-08-28T09:54:48.5062208Z         "doc": {
2026-08-28T09:54:48.5062499Z           "complete": true,
2026-08-28T09:54:48.5062775Z           "evidence": [
2026-08-28T09:54:48.5063043Z             {
2026-08-28T09:54:48.5063480Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.5063772Z               "line": 150
2026-08-28T09:54:48.5064024Z             }
2026-08-28T09:54:48.5064287Z           ]
2026-08-28T09:54:48.5064539Z         },
2026-08-28T09:54:48.5064806Z         "impl": {
2026-08-28T09:54:48.5065092Z           "complete": true,
2026-08-28T09:54:48.5065373Z           "evidence": [
2026-08-28T09:54:48.5065640Z             {
2026-08-28T09:54:48.5065953Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5066234Z               "line": 12695
2026-08-28T09:54:48.5066491Z             },
2026-08-28T09:54:48.5066753Z             {
2026-08-28T09:54:48.5067063Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5067339Z               "line": 12740
2026-08-28T09:54:48.5067602Z             },
2026-08-28T09:54:48.5067859Z             {
2026-08-28T09:54:48.5068179Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5068513Z               "line": 12777
2026-08-28T09:54:48.5068778Z             },
2026-08-28T09:54:48.5069101Z             {
2026-08-28T09:54:48.5069420Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5069692Z               "line": 13327
2026-08-28T09:54:48.5069949Z             }
2026-08-28T09:54:48.5070206Z           ]
2026-08-28T09:54:48.5070459Z         },
2026-08-28T09:54:48.5070722Z         "int": {
2026-08-28T09:54:48.5071004Z           "complete": false,
2026-08-28T09:54:48.5071354Z           "evidence": []
2026-08-28T09:54:48.5071605Z         },
2026-08-28T09:54:48.5071867Z         "unit": {
2026-08-28T09:54:48.5072153Z           "complete": true,
2026-08-28T09:54:48.5072425Z           "evidence": [
2026-08-28T09:54:48.5072683Z             {
2026-08-28T09:54:48.5072997Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5073269Z               "line": 33915
2026-08-28T09:54:48.5073523Z             },
2026-08-28T09:54:48.5073785Z             {
2026-08-28T09:54:48.5074097Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5074374Z               "line": 33999
2026-08-28T09:54:48.5074627Z             }
2026-08-28T09:54:48.5074885Z           ]
2026-08-28T09:54:48.5075143Z         }
2026-08-28T09:54:48.5075395Z       }
2026-08-28T09:54:48.5075648Z     },
2026-08-28T09:54:48.5075895Z     {
2026-08-28T09:54:48.5076219Z       "id": "REQ-SUBNET-DISPLAY-PARITY",
2026-08-28T09:54:48.5088002Z       "title": "The `spt endpoint run` picker renders endpoint state IDENTICALLY for local and remote (subnet) rows — bound/unbound, controlled (+driver node), and harness-only are all visible across the subnet, not local-only. Today data.rs:293-294 reduces a remote row to plain green-filled/gray-hollow because those facts aren't propagated. (1) GOSSIP additive per-Instance fields: bound/unbound, controlled + driver-node, harness_only (Offline is never gossiped — node-down is remote-inferred). (2) Derive the full EpDisplay for subnet rows from the gossiped fields, same path as local (remove the remote-reduction). (3) PALETTE rework (fill = ACTIONABLE: filled=can act now (rc-control if online, WAKE if suspended-on-live-node) / hollow=cannot (no control seat / node gone)): green-filled=online+bound+free; blue-filled=online+controlled (desc shows `controlled by <node>`); RED-filled=online+UNBOUND (controlled-or-not; controlled-ness shown via available options not glyph) — replaces green-hollow Unbound + absorbs the dropped UnboundControlled; AMBER-HOLLOW=online+harness-only (no broker seat → can't rc) — was amber-FILLED; GRAY-FILLED=Suspended (cold, node up — wakeable) NEW; gray-hollow=Offline (node down) now REMOTE-ONLY. EpDisplay: drop UnboundControlled, Unbound→red-filled, HarnessOnly→amber-hollow, add Suspended(gray-filled). Picker maps Active|Dormant→online flavor, Suspended→gray-filled, Offline→gray-hollow. (next milestone)",
2026-08-28T09:54:48.5088473Z       "requiredStages": [
2026-08-28T09:54:48.5088731Z         "impl",
2026-08-28T09:54:48.5089070Z         "unit",
2026-08-28T09:54:48.5089327Z         "int"
2026-08-28T09:54:48.5089591Z       ],
2026-08-28T09:54:48.5089856Z       "stages": {
2026-08-28T09:54:48.5090115Z         "doc": {
2026-08-28T09:54:48.5090401Z           "complete": false,
2026-08-28T09:54:48.5090678Z           "evidence": []
2026-08-28T09:54:48.5090937Z         },
2026-08-28T09:54:48.5091194Z         "impl": {
2026-08-28T09:54:48.5091490Z           "complete": true,
2026-08-28T09:54:48.5091762Z           "evidence": [
2026-08-28T09:54:48.5092028Z             {
2026-08-28T09:54:48.5092432Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.5092702Z               "line": 581
2026-08-28T09:54:48.5092963Z             },
2026-08-28T09:54:48.5093221Z             {
2026-08-28T09:54:48.5093626Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.5093898Z               "line": 645
2026-08-28T09:54:48.5094156Z             },
2026-08-28T09:54:48.5094409Z             {
2026-08-28T09:54:48.5094871Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.5095142Z               "line": 717
2026-08-28T09:54:48.5095405Z             },
2026-08-28T09:54:48.5095648Z             {
2026-08-28T09:54:48.5096024Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5096301Z               "line": 171
2026-08-28T09:54:48.5096559Z             },
2026-08-28T09:54:48.5096820Z             {
2026-08-28T09:54:48.5097183Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5097520Z               "line": 181
2026-08-28T09:54:48.5097779Z             },
2026-08-28T09:54:48.5098042Z             {
2026-08-28T09:54:48.5098418Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5098691Z               "line": 191
2026-08-28T09:54:48.5099034Z             },
2026-08-28T09:54:48.5099282Z             {
2026-08-28T09:54:48.5099664Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5099935Z               "line": 233
2026-08-28T09:54:48.5100193Z             },
2026-08-28T09:54:48.5100444Z             {
2026-08-28T09:54:48.5100824Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5101106Z               "line": 529
2026-08-28T09:54:48.5101359Z             },
2026-08-28T09:54:48.5101620Z             {
2026-08-28T09:54:48.5101988Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5102264Z               "line": 533
2026-08-28T09:54:48.5102564Z             },
2026-08-28T09:54:48.5102820Z             {
2026-08-28T09:54:48.5103190Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5103467Z               "line": 537
2026-08-28T09:54:48.5103730Z             },
2026-08-28T09:54:48.5103977Z             {
2026-08-28T09:54:48.5104353Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5104621Z               "line": 622
2026-08-28T09:54:48.5104879Z             },
2026-08-28T09:54:48.5105136Z             {
2026-08-28T09:54:48.5105475Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5105797Z               "line": 44
2026-08-28T09:54:48.5106097Z             },
2026-08-28T09:54:48.5106398Z             {
2026-08-28T09:54:48.5106746Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5107090Z               "line": 64
2026-08-28T09:54:48.5107487Z             },
2026-08-28T09:54:48.5107971Z             {
2026-08-28T09:54:48.5108354Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5108631Z               "line": 71
2026-08-28T09:54:48.5108893Z             },
2026-08-28T09:54:48.5109279Z             {
2026-08-28T09:54:48.5109632Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5109899Z               "line": 82
2026-08-28T09:54:48.5110157Z             },
2026-08-28T09:54:48.5110400Z             {
2026-08-28T09:54:48.5110757Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5111033Z               "line": 654
2026-08-28T09:54:48.5111298Z             },
2026-08-28T09:54:48.5111541Z             {
2026-08-28T09:54:48.5111889Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5112156Z               "line": 659
2026-08-28T09:54:48.5112404Z             },
2026-08-28T09:54:48.5112662Z             {
2026-08-28T09:54:48.5113000Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5113287Z               "line": 671
2026-08-28T09:54:48.5113543Z             },
2026-08-28T09:54:48.5113798Z             {
2026-08-28T09:54:48.5114136Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5114403Z               "line": 1246
2026-08-28T09:54:48.5114675Z             },
2026-08-28T09:54:48.5114914Z             {
2026-08-28T09:54:48.5115267Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5115534Z               "line": 1432
2026-08-28T09:54:48.5115807Z             },
2026-08-28T09:54:48.5116140Z             {
2026-08-28T09:54:48.5116482Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.5116754Z               "line": 80
2026-08-28T09:54:48.5117006Z             },
2026-08-28T09:54:48.5117258Z             {
2026-08-28T09:54:48.5117592Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.5117869Z               "line": 569
2026-08-28T09:54:48.5118131Z             }
2026-08-28T09:54:48.5118399Z           ]
2026-08-28T09:54:48.5118721Z         },
2026-08-28T09:54:48.5119083Z         "int": {
2026-08-28T09:54:48.5119373Z           "complete": true,
2026-08-28T09:54:48.5119641Z           "evidence": [
2026-08-28T09:54:48.5119898Z             {
2026-08-28T09:54:48.5120246Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.5120517Z               "line": 753
2026-08-28T09:54:48.5120769Z             },
2026-08-28T09:54:48.5121031Z             {
2026-08-28T09:54:48.5121379Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.5121663Z               "line": 839
2026-08-28T09:54:48.5121926Z             }
2026-08-28T09:54:48.5122184Z           ]
2026-08-28T09:54:48.5122440Z         },
2026-08-28T09:54:48.5122697Z         "unit": {
2026-08-28T09:54:48.5122983Z           "complete": true,
2026-08-28T09:54:48.5123255Z           "evidence": [
2026-08-28T09:54:48.5123513Z             {
2026-08-28T09:54:48.5123880Z               "path": "crates/spt-net/src/net/registry.rs",
2026-08-28T09:54:48.5124159Z               "line": 1243
2026-08-28T09:54:48.5124526Z             },
2026-08-28T09:54:48.5124793Z             {
2026-08-28T09:54:48.5130891Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5131220Z               "line": 1992
2026-08-28T09:54:48.5131474Z             },
2026-08-28T09:54:48.5131731Z             {
2026-08-28T09:54:48.5132116Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5132394Z               "line": 2058
2026-08-28T09:54:48.5132656Z             },
2026-08-28T09:54:48.5132923Z             {
2026-08-28T09:54:48.5133271Z               "path": "crates/spt/src/picker/model.rs",
2026-08-28T09:54:48.5133644Z               "line": 2155
2026-08-28T09:54:48.5133906Z             },
2026-08-28T09:54:48.5134158Z             {
2026-08-28T09:54:48.5134516Z               "path": "crates/spt/src/picker/view.rs",
2026-08-28T09:54:48.5134789Z               "line": 1038
2026-08-28T09:54:48.5135100Z             }
2026-08-28T09:54:48.5135362Z           ]
2026-08-28T09:54:48.5135616Z         }
2026-08-28T09:54:48.5135867Z       }
2026-08-28T09:54:48.5136119Z     },
2026-08-28T09:54:48.5136373Z     {
2026-08-28T09:54:48.5136682Z       "id": "REQ-SUBNET-DUAL-SEED-MINT",
2026-08-28T09:54:48.5147333Z       "title": "`subnet create` mints TWO TOTP seeds in one ceremony — the member key (today's subnet seed, unchanged) and a second admin key — and provisions both into the creator's authenticator at that single moment (ADR-0051 decision 1, CONTEXT.md 'member key / admin key'). An admin key IS a membership key; a member key is NOT an admin credential. The same ceremony captures the subnet's universal control-surface mode: prompted with NO PRESELECTION (an operator must state open or closed rather than accept a default that a hurried Enter would pick for them), with `--open`/`--closed` bypassing the prompt for scripted creation. This is the moment the whole two-key model depends on: the admin seed has no reveal verb ever (REQ-SUBNET-ADMIN-SEED-REPLICATION), so a creation path that mints it without displaying it, or displays it without persisting it, permanently destroys the subnet's admin authority with no recovery but re-minting the subnet. Gate: doc — the CONTEXT.md two-key entry and ADR-0051; impl — dual mint at create, both authenticator provisionings, the no-preselection mode prompt and its flag bypass; unit — creation yields two DISTINCT seeds, the mode is recorded from prompt or flag, and no code path yields a subnet holding one seed.",
2026-08-28T09:54:48.5147686Z       "requiredStages": [
2026-08-28T09:54:48.5148018Z         "doc",
2026-08-28T09:54:48.5148286Z         "impl",
2026-08-28T09:54:48.5148548Z         "unit"
2026-08-28T09:54:48.5148796Z       ],
2026-08-28T09:54:48.5149145Z       "stages": {
2026-08-28T09:54:48.5149398Z         "doc": {
2026-08-28T09:54:48.5149680Z           "complete": true,
2026-08-28T09:54:48.5149955Z           "evidence": [
2026-08-28T09:54:48.5150201Z             {
2026-08-28T09:54:48.5150509Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.5150876Z               "line": 854
2026-08-28T09:54:48.5151129Z             },
2026-08-28T09:54:48.5151373Z             {
2026-08-28T09:54:48.5151806Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.5152074Z               "line": 33
2026-08-28T09:54:48.5152322Z             },
2026-08-28T09:54:48.5152580Z             {
2026-08-28T09:54:48.5153022Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.5153301Z               "line": 150
2026-08-28T09:54:48.5153558Z             }
2026-08-28T09:54:48.5153815Z           ]
2026-08-28T09:54:48.5154072Z         },
2026-08-28T09:54:48.5154335Z         "impl": {
2026-08-28T09:54:48.5154611Z           "complete": true,
2026-08-28T09:54:48.5154875Z           "evidence": [
2026-08-28T09:54:48.5155132Z             {
2026-08-28T09:54:48.5155476Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5155750Z               "line": 120
2026-08-28T09:54:48.5156014Z             },
2026-08-28T09:54:48.5156267Z             {
2026-08-28T09:54:48.5156615Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5156887Z               "line": 131
2026-08-28T09:54:48.5157131Z             },
2026-08-28T09:54:48.5157394Z             {
2026-08-28T09:54:48.5157751Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5158019Z               "line": 206
2026-08-28T09:54:48.5158276Z             },
2026-08-28T09:54:48.5158536Z             {
2026-08-28T09:54:48.5158888Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5159295Z               "line": 216
2026-08-28T09:54:48.5159557Z             },
2026-08-28T09:54:48.5159809Z             {
2026-08-28T09:54:48.5160157Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5160424Z               "line": 298
2026-08-28T09:54:48.5160676Z             },
2026-08-28T09:54:48.5160933Z             {
2026-08-28T09:54:48.5161304Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5161580Z               "line": 12367
2026-08-28T09:54:48.5161833Z             },
2026-08-28T09:54:48.5162094Z             {
2026-08-28T09:54:48.5162414Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5162672Z               "line": 12445
2026-08-28T09:54:48.5162929Z             },
2026-08-28T09:54:48.5163183Z             {
2026-08-28T09:54:48.5163498Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5163768Z               "line": 12463
2026-08-28T09:54:48.5164022Z             },
2026-08-28T09:54:48.5164280Z             {
2026-08-28T09:54:48.5164599Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5164872Z               "line": 12475
2026-08-28T09:54:48.5165167Z             },
2026-08-28T09:54:48.5165415Z             {
2026-08-28T09:54:48.5165735Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5166003Z               "line": 12594
2026-08-28T09:54:48.5166262Z             },
2026-08-28T09:54:48.5166517Z             {
2026-08-28T09:54:48.5166832Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5167110Z               "line": 13265
2026-08-28T09:54:48.5167367Z             }
2026-08-28T09:54:48.5167620Z           ]
2026-08-28T09:54:48.5167881Z         },
2026-08-28T09:54:48.5168138Z         "int": {
2026-08-28T09:54:48.5168425Z           "complete": false,
2026-08-28T09:54:48.5168696Z           "evidence": []
2026-08-28T09:54:48.5169020Z         },
2026-08-28T09:54:48.5169278Z         "unit": {
2026-08-28T09:54:48.5169626Z           "complete": true,
2026-08-28T09:54:48.5169912Z           "evidence": [
2026-08-28T09:54:48.5170165Z             {
2026-08-28T09:54:48.5170528Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5170804Z               "line": 1055
2026-08-28T09:54:48.5171056Z             },
2026-08-28T09:54:48.5171308Z             {
2026-08-28T09:54:48.5171667Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5171940Z               "line": 1090
2026-08-28T09:54:48.5172259Z             },
2026-08-28T09:54:48.5172517Z             {
2026-08-28T09:54:48.5172865Z               "path": "crates/spt-store/src/subnet.rs",
2026-08-28T09:54:48.5173141Z               "line": 1109
2026-08-28T09:54:48.5173395Z             },
2026-08-28T09:54:48.5173648Z             {
2026-08-28T09:54:48.5173958Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5174227Z               "line": 33566
2026-08-28T09:54:48.5174483Z             },
2026-08-28T09:54:48.5174745Z             {
2026-08-28T09:54:48.5175060Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5175332Z               "line": 33882
2026-08-28T09:54:48.5175589Z             },
2026-08-28T09:54:48.5175841Z             {
2026-08-28T09:54:48.5176151Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5176418Z               "line": 33910
2026-08-28T09:54:48.5176676Z             },
2026-08-28T09:54:48.5176932Z             {
2026-08-28T09:54:48.5177235Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5177512Z               "line": 34047
2026-08-28T09:54:48.5177764Z             }
2026-08-28T09:54:48.5178022Z           ]
2026-08-28T09:54:48.5178275Z         }
2026-08-28T09:54:48.5178533Z       }
2026-08-28T09:54:48.5178786Z     },
2026-08-28T09:54:48.5179096Z     {
2026-08-28T09:54:48.5179416Z       "id": "REQ-SUBNET-EMPOWER-VERB",
2026-08-28T09:54:48.5191452Z       "title": "empower <subnet-id> --admin-code <admin-totp> grants the engine room authority over that subnet's control-surface modes, lasts until session end or controller detach, and is invocable ONLY by the engine room (ADR-0052 decision 5; doyle ruling (b) 2026-07-29). It ships as an spt api verb gated by the perch capability proof plus an engine-room identity check, NOT as a plain CLI verb: the caller IS an agent — the engine room has a mind and is the specified invoker — so the gate cannot be 'no agent' and must be 'no agent except the reserved one'. The admin TOTP remains the authority proof, verified locally against the replicated admin seed (REQ-SUBNET-ADMIN-SEED-REPLICATION) with no privileged peer consulted; the engine-room binding is what makes the grant session state with a controller lifecycle to die with, which a grant to an arbitrary CLI session would not have. One shared authentication function serves this verb and the capture-refresh (REQ-ACL-ACCESS-REFRESH-ER-ONLY) — two call sites, one gate, unit tested once. Gate: doc — ADR-0052 decision 5 and the CONTEXT.md empower entry; impl — the api verb, the shared engine-room authentication, local admin-TOTP verification, and session-scoped grant storage; unit — a non-engine-room caller is refused, a wrong admin code is refused, a valid grant authorizes mode writes for exactly that subnet, and the grant dies at detach and at take.",
2026-08-28T09:54:48.5191929Z       "requiredStages": [
2026-08-28T09:54:48.5192215Z         "doc",
2026-08-28T09:54:48.5192471Z         "impl",
2026-08-28T09:54:48.5192745Z         "unit"
2026-08-28T09:54:48.5193004Z       ],
2026-08-28T09:54:48.5193284Z       "stages": {
2026-08-28T09:54:48.5193552Z         "doc": {
2026-08-28T09:54:48.5193828Z           "complete": true,
2026-08-28T09:54:48.5194099Z           "evidence": [
2026-08-28T09:54:48.5194352Z             {
2026-08-28T09:54:48.5194806Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:48.5195078Z               "line": 103
2026-08-28T09:54:48.5195343Z             },
2026-08-28T09:54:48.5195598Z             {
2026-08-28T09:54:48.5196109Z               "path": "docs/adr/0052-engine-room-endpoint-empower.md",
2026-08-28T09:54:48.5196395Z               "line": 323
2026-08-28T09:54:48.5196651Z             }
2026-08-28T09:54:48.5196909Z           ]
2026-08-28T09:54:48.5197162Z         },
2026-08-28T09:54:48.5197430Z         "impl": {
2026-08-28T09:54:48.5197712Z           "complete": true,
2026-08-28T09:54:48.5197990Z           "evidence": [
2026-08-28T09:54:48.5198255Z             {
2026-08-28T09:54:48.5198652Z               "path": "crates/spt-net/src/net/pairing/totp.rs",
2026-08-28T09:54:48.5199066Z               "line": 181
2026-08-28T09:54:48.5199333Z             },
2026-08-28T09:54:48.5199591Z             {
2026-08-28T09:54:48.5199949Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5200226Z               "line": 48
2026-08-28T09:54:48.5200477Z             },
2026-08-28T09:54:48.5200734Z             {
2026-08-28T09:54:48.5201096Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5201368Z               "line": 74
2026-08-28T09:54:48.5201626Z             },
2026-08-28T09:54:48.5201964Z             {
2026-08-28T09:54:48.5202518Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5202800Z               "line": 81
2026-08-28T09:54:48.5203061Z             },
2026-08-28T09:54:48.5203312Z             {
2026-08-28T09:54:48.5203677Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5203953Z               "line": 106
2026-08-28T09:54:48.5204207Z             },
2026-08-28T09:54:48.5204469Z             {
2026-08-28T09:54:48.5204831Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5205104Z               "line": 149
2026-08-28T09:54:48.5205361Z             },
2026-08-28T09:54:48.5205614Z             {
2026-08-28T09:54:48.5205975Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5206248Z               "line": 156
2026-08-28T09:54:48.5206510Z             },
2026-08-28T09:54:48.5206765Z             {
2026-08-28T09:54:48.5207126Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5207474Z               "line": 338
2026-08-28T09:54:48.5207731Z             },
2026-08-28T09:54:48.5207985Z             {
2026-08-28T09:54:48.5208356Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5208618Z               "line": 346
2026-08-28T09:54:48.5208868Z             },
2026-08-28T09:54:48.5209274Z             {
2026-08-28T09:54:48.5209861Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.5210137Z               "line": 270
2026-08-28T09:54:48.5210384Z             },
2026-08-28T09:54:48.5210646Z             {
2026-08-28T09:54:48.5211014Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5211285Z               "line": 66
2026-08-28T09:54:48.5211538Z             },
2026-08-28T09:54:48.5211790Z             {
2026-08-28T09:54:48.5212162Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5212434Z               "line": 83
2026-08-28T09:54:48.5212691Z             },
2026-08-28T09:54:48.5212944Z             {
2026-08-28T09:54:48.5213306Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5213572Z               "line": 282
2026-08-28T09:54:48.5213828Z             },
2026-08-28T09:54:48.5214081Z             {
2026-08-28T09:54:48.5214438Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5214715Z               "line": 288
2026-08-28T09:54:48.5214963Z             },
2026-08-28T09:54:48.5215225Z             {
2026-08-28T09:54:48.5215583Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5215854Z               "line": 745
2026-08-28T09:54:48.5216107Z             },
2026-08-28T09:54:48.5216369Z             {
2026-08-28T09:54:48.5216690Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.5216957Z               "line": 351
2026-08-28T09:54:48.5217210Z             }
2026-08-28T09:54:48.5217544Z           ]
2026-08-28T09:54:48.5217801Z         },
2026-08-28T09:54:48.5218053Z         "int": {
2026-08-28T09:54:48.5218340Z           "complete": false,
2026-08-28T09:54:48.5218634Z           "evidence": []
2026-08-28T09:54:48.5218889Z         },
2026-08-28T09:54:48.5219261Z         "unit": {
2026-08-28T09:54:48.5219549Z           "complete": true,
2026-08-28T09:54:48.5219820Z           "evidence": [
2026-08-28T09:54:48.5220072Z             {
2026-08-28T09:54:48.5220440Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5220783Z               "line": 370
2026-08-28T09:54:48.5221041Z             },
2026-08-28T09:54:48.5221293Z             {
2026-08-28T09:54:48.5221661Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5221934Z               "line": 388
2026-08-28T09:54:48.5222183Z             },
2026-08-28T09:54:48.5222441Z             {
2026-08-28T09:54:48.5222803Z               "path": "crates/spt-store/src/empower.rs",
2026-08-28T09:54:48.5223080Z               "line": 611
2026-08-28T09:54:48.5223337Z             },
2026-08-28T09:54:48.5223601Z             {
2026-08-28T09:54:48.5223963Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5224227Z               "line": 847
2026-08-28T09:54:48.5224492Z             },
2026-08-28T09:54:48.5224745Z             {
2026-08-28T09:54:48.5225107Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5225499Z               "line": 983
2026-08-28T09:54:48.5225799Z             },
2026-08-28T09:54:48.5226075Z             {
2026-08-28T09:54:48.5226473Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5226768Z               "line": 1086
2026-08-28T09:54:48.5227042Z             },
2026-08-28T09:54:48.5227321Z             {
2026-08-28T09:54:48.5227708Z               "path": "crates/spt/src/api/engineroom.rs",
2026-08-28T09:54:48.5227998Z               "line": 1122
2026-08-28T09:54:48.5228275Z             },
2026-08-28T09:54:48.5228557Z             {
2026-08-28T09:54:48.5228905Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.5229514Z               "line": 1193
2026-08-28T09:54:48.5229780Z             }
2026-08-28T09:54:48.5230031Z           ]
2026-08-28T09:54:48.5230288Z         }
2026-08-28T09:54:48.5230541Z       }
2026-08-28T09:54:48.5230795Z     },
2026-08-28T09:54:48.5231047Z     {
2026-08-28T09:54:48.5231404Z       "id": "REQ-SUBNET-KEY-SCREENS-LABELLED",
2026-08-28T09:54:48.5255075Z       "title": "The `subnet create` ceremony prints TWO secrets minutes apart, and each display LEADS WITH A PROMINENT LABEL naming which key it is — `--- ADMIN KEY (<ceremony>) ---` and `--- MEMBER KEY ---` — then states WHAT THAT KEY IS FOR in the operator's own terms rather than only how to store it. Labelling is the correctness half: two unlabelled code-plus-QR blobs in one ceremony are two chances to scan the more powerful secret into the wrong authenticator entry, and the admin key is the one that cannot be shown again. The ADMIN display names the capability the key actually confers — reaching any `spt endpoint engine-room` linked to the subnet and directing it to change the node's security mode, its access rules for the node and its endpoints, and the grants collaborating agents need — and states that the admin key DOUBLES as a member key, which is the fact deciding whether an operator must keep both. The MEMBER display names joining new nodes from anywhere, sharing with others whose nodes must join, re-viewing the key with `spt subnet show-code`, and scanning the QR into an auth app to pair again later. STRUCK, and it must not return: 'as a second entry' on the admin screen, which described the authenticator's bookkeeping — the one thing the operator does not need told — and made the more powerful of the two keys read as a footnote to the other; and the member blob's trailing re-pair sentence, whose remedy is now stated ONCE, on the bullets that teach what the key is for, because a ceremony stating a remedy twice invites the two spellings to drift. That sentence carried TWO arms and BOTH survive on the list — `show-code` and the auth-app QR — because the issue's own bullets duplicated only the first, so striking the sentence on the strength of that duplication would have dropped operator information the screen used to carry, and a loss needs a positive justification (doyle, releases#175). BOTH halves are asserted: the struck sentence must not return AND the QR arm must not go missing, the second being the row without which the loss passes silently. The one-shot warning SURVIVES the reshape and moves to its own line beneath the header: a header carrying a sentence is a header that reads as prose, and 'shown once, here, and never again' is the whole reason the admin display exists. `show-code` gains no header — it is a single-key surface with nothing to be confused with — and the member blob still carries NO admin material, which the capture-proof requirement already binds. Gate: doc — the networking overview section naming the two labelled screens and what each key is for; impl — the two composers, with the struck phrases removed at their only sites; unit — each display leads with its label, each carries its purpose list, the two struck phrases are asserted ABSENT (a later reword that quietly restored either would otherwise pass), and the ceremony word still distinguishes the create display from the rotation one.",
2026-08-28T09:54:48.5255700Z       "requiredStages": [
2026-08-28T09:54:48.5255970Z         "doc",
2026-08-28T09:54:48.5256239Z         "impl",
2026-08-28T09:54:48.5256497Z         "unit"
2026-08-28T09:54:48.5256754Z       ],
2026-08-28T09:54:48.5257013Z       "stages": {
2026-08-28T09:54:48.5257275Z         "doc": {
2026-08-28T09:54:48.5257552Z           "complete": true,
2026-08-28T09:54:48.5257828Z           "evidence": [
2026-08-28T09:54:48.5258080Z             {
2026-08-28T09:54:48.5258467Z               "path": "docs-site/src/networking/overview.md",
2026-08-28T09:54:48.5258736Z               "line": 73
2026-08-28T09:54:48.5259068Z             }
2026-08-28T09:54:48.5259345Z           ]
2026-08-28T09:54:48.5259660Z         },
2026-08-28T09:54:48.5259917Z         "impl": {
2026-08-28T09:54:48.5260199Z           "complete": true,
2026-08-28T09:54:48.5260471Z           "evidence": [
2026-08-28T09:54:48.5260724Z             {
2026-08-28T09:54:48.5261044Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5261323Z               "line": 12595
2026-08-28T09:54:48.5261630Z             },
2026-08-28T09:54:48.5261888Z             {
2026-08-28T09:54:48.5262203Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5262480Z               "line": 12696
2026-08-28T09:54:48.5262728Z             }
2026-08-28T09:54:48.5262986Z           ]
2026-08-28T09:54:48.5263247Z         },
2026-08-28T09:54:48.5263509Z         "int": {
2026-08-28T09:54:48.5263796Z           "complete": false,
2026-08-28T09:54:48.5264066Z           "evidence": []
2026-08-28T09:54:48.5264320Z         },
2026-08-28T09:54:48.5264591Z         "unit": {
2026-08-28T09:54:48.5264873Z           "complete": true,
2026-08-28T09:54:48.5265153Z           "evidence": [
2026-08-28T09:54:48.5265406Z             {
2026-08-28T09:54:48.5265721Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5265992Z               "line": 33810
2026-08-28T09:54:48.5266251Z             },
2026-08-28T09:54:48.5266506Z             {
2026-08-28T09:54:48.5266824Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5267100Z               "line": 33944
2026-08-28T09:54:48.5267362Z             }
2026-08-28T09:54:48.5267620Z           ]
2026-08-28T09:54:48.5267873Z         }
2026-08-28T09:54:48.5268126Z       }
2026-08-28T09:54:48.5268374Z     },
2026-08-28T09:54:48.5268635Z     {
2026-08-28T09:54:48.5269032Z       "id": "REQ-SUBNET-MINT-CAPTURES-MODE",
2026-08-28T09:54:48.5292371Z       "title": "THE MINTING NODE CAPTURES ITS OWN DECLARED SUBNET MODE, so a `--closed` subnet stops being asymmetric BY CONSTRUCTION. RCA by hertz 2026-08-01 (releases#100, two-arm live evidence, both nodes 0.49.0): `capture_subnet_mode` had exactly TWO production writers -- the JOIN arm (pairhost) and the engine-room access-refresh -- while `spt subnet create` wrote the declared mode into `subnet.json` and never touched the access store. On the MINTER the captured-subnet-mode tier is therefore ABSENT and the resolution chain bottoms out at the implicit-open tier, per-surface-blind: every joiner enforces while the minter exposes MSG, RC_VIEW/RC_ATTACH, XFER, WAKE/SUSPEND, SHELL_LINK and DIGEST to any origin. Field evidence: the minter's access.json was literally {\"version\": 2}, its named status view printed 'mode captured here: none - chain bottoms out open', and the joiner withheld correctly. THIS IS THE DECLARE-SITE-IS-NOT-ENFORCE-SITE CLASS: writing the posture into the record that DECLARES it is not the same act as writing it into the store that ENFORCES it, and a ceremony that does only the first ships a subnet whose stated posture is unenforced on the very node that stated it. THE CAPTURE RIDES THE PERSIST, NEVER THE RESOLVE: the mint is in-memory until the create ceremony's admin capture-proof passes (a refused proof must leave NO subnet), so a capture written at resolve time would outlive a cancelled create and record a posture for a subnet that does not exist. SWEEP DISCIPLINE IS PART OF THE FIX: `resolve` is shared by create and show-code with the CALLER persisting, so the capture belongs at the ONE persist choke point every mint path funnels through -- a per-call-site capture is one forgotten path away from re-creating the same asymmetry, which is exactly how this defect existed. NO SILENT BOOT-TIME BACKFILL, and this refusal is REQUIRED TEXT rather than an omission: the subnet record carries no minted-here provenance, so 'declared present AND captured absent' cannot distinguish 'I minted this closed' from 'I joined before subnet modes existed', and retro-capturing the latter would silently close a running mesh -- the case the design refuses. A pre-fix minter is healed ONLY by the explicit `spt api access-refresh <subnet>` verb, and the create output NAMES that verb so the operator of an already-minted subnet is not left to discover it. Gate: doc -- the docs-site access page states that the minter captures at the mint and that older minters heal only through the explicit refresh; impl -- the capture at the persist choke point, driven by the mint's own declared mode, plus the create-output line naming the heal; unit -- the mint ceremony CAPTURES the mode it declared (the row that fails on a build persisting the declaration without capturing it, i.e. on the shipped defect), a persist that is NOT a mint captures nothing (the no-backfill arm, asserted rather than assumed), and the captured value is the DECLARED one rather than a constant (a row an always-closed or always-open capture cannot pass).",
2026-08-28T09:54:48.5292913Z       "requiredStages": [
2026-08-28T09:54:48.5293173Z         "doc",
2026-08-28T09:54:48.5293431Z         "impl",
2026-08-28T09:54:48.5293693Z         "unit"
2026-08-28T09:54:48.5293945Z       ],
2026-08-28T09:54:48.5294212Z       "stages": {
2026-08-28T09:54:48.5294475Z         "doc": {
2026-08-28T09:54:48.5294760Z           "complete": true,
2026-08-28T09:54:48.5295033Z           "evidence": [
2026-08-28T09:54:48.5295286Z             {
2026-08-28T09:54:48.5295709Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:48.5295981Z               "line": 183
2026-08-28T09:54:48.5296243Z             }
2026-08-28T09:54:48.5296499Z           ]
2026-08-28T09:54:48.5296757Z         },
2026-08-28T09:54:48.5297015Z         "impl": {
2026-08-28T09:54:48.5297296Z           "complete": true,
2026-08-28T09:54:48.5297574Z           "evidence": [
2026-08-28T09:54:48.5297826Z             {
2026-08-28T09:54:48.5298148Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5298418Z               "line": 12654
2026-08-28T09:54:48.5298685Z             },
2026-08-28T09:54:48.5299014Z             {
2026-08-28T09:54:48.5299338Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5299667Z               "line": 12861
2026-08-28T09:54:48.5299930Z             },
2026-08-28T09:54:48.5300187Z             {
2026-08-28T09:54:48.5300497Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5300770Z               "line": 12889
2026-08-28T09:54:48.5301020Z             },
2026-08-28T09:54:48.5301280Z             {
2026-08-28T09:54:48.5301590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5301867Z               "line": 12917
2026-08-28T09:54:48.5302191Z             },
2026-08-28T09:54:48.5302449Z             {
2026-08-28T09:54:48.5302764Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5303036Z               "line": 13223
2026-08-28T09:54:48.5303289Z             },
2026-08-28T09:54:48.5303544Z             {
2026-08-28T09:54:48.5303857Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5304118Z               "line": 13300
2026-08-28T09:54:48.5304373Z             }
2026-08-28T09:54:48.5304630Z           ]
2026-08-28T09:54:48.5304878Z         },
2026-08-28T09:54:48.5305144Z         "int": {
2026-08-28T09:54:48.5305420Z           "complete": false,
2026-08-28T09:54:48.5305707Z           "evidence": []
2026-08-28T09:54:48.5305964Z         },
2026-08-28T09:54:48.5306261Z         "unit": {
2026-08-28T09:54:48.5306536Z           "complete": true,
2026-08-28T09:54:48.5306798Z           "evidence": [
2026-08-28T09:54:48.5307060Z             {
2026-08-28T09:54:48.5307360Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5307632Z               "line": 38166
2026-08-28T09:54:48.5307880Z             },
2026-08-28T09:54:48.5308134Z             {
2026-08-28T09:54:48.5308430Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5308704Z               "line": 38239
2026-08-28T09:54:48.5309021Z             },
2026-08-28T09:54:48.5309278Z             {
2026-08-28T09:54:48.5309593Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5309860Z               "line": 38274
2026-08-28T09:54:48.5310123Z             },
2026-08-28T09:54:48.5310437Z             {
2026-08-28T09:54:48.5310752Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5311020Z               "line": 38362
2026-08-28T09:54:48.5311278Z             }
2026-08-28T09:54:48.5311533Z           ]
2026-08-28T09:54:48.5311793Z         }
2026-08-28T09:54:48.5312046Z       }
2026-08-28T09:54:48.5312294Z     },
2026-08-28T09:54:48.5312604Z     {
2026-08-28T09:54:48.5312938Z       "id": "REQ-SUBNET-REVOKE-ADMIN-GATE",
2026-08-28T09:54:48.5321718Z       "title": "`spt subnet revoke` (both forms, --force-rotate-seed included) requires the subnet's CURRENT admin TOTP — a member code is insufficient, and OS elevation stays on top answering its different question (ADR-0051 §2a, FF grill 2026-07-30). Eviction is a subnet-governance act, and the proof doubles as the identity gate for the re-surface: only the proven incumbent admin is shown the replacement key. The gate runs BEFORE any write, so a cancelled, thrice-wrong, or non-interactive attempt (refused up front — the gate needs a human and the ceremony after it needs one more) leaves roster, schedule, and seeds untouched. Acceptance is the same ±1-step window every other typed-code ceremony uses. A subnet predating the two-key model has no admin authority to prove; it proceeds loudly on elevation alone. Gate: doc — ADR-0051 §2a; impl — the per-subnet gate in the revoke path, ordered before all writes; unit — the windowed code acceptance (shared with the capture proof) and the nothing-written refusal orderings exercised at the gate seam.",
2026-08-28T09:54:48.5322069Z       "requiredStages": [
2026-08-28T09:54:48.5322325Z         "doc",
2026-08-28T09:54:48.5322592Z         "impl",
2026-08-28T09:54:48.5322845Z         "unit"
2026-08-28T09:54:48.5323102Z       ],
2026-08-28T09:54:48.5323378Z       "stages": {
2026-08-28T09:54:48.5323636Z         "doc": {
2026-08-28T09:54:48.5323926Z           "complete": true,
2026-08-28T09:54:48.5324203Z           "evidence": [
2026-08-28T09:54:48.5324537Z             {
2026-08-28T09:54:48.5324977Z               "path": "docs/adr/0051-two-key-subnet-member-admin.md",
2026-08-28T09:54:48.5325258Z               "line": 108
2026-08-28T09:54:48.5325512Z             }
2026-08-28T09:54:48.5325764Z           ]
2026-08-28T09:54:48.5326022Z         },
2026-08-28T09:54:48.5326284Z         "impl": {
2026-08-28T09:54:48.5326570Z           "complete": true,
2026-08-28T09:54:48.5326846Z           "evidence": [
2026-08-28T09:54:48.5327171Z             {
2026-08-28T09:54:48.5327489Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5327766Z               "line": 14640
2026-08-28T09:54:48.5328018Z             },
2026-08-28T09:54:48.5328272Z             {
2026-08-28T09:54:48.5328586Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5328848Z               "line": 14780
2026-08-28T09:54:48.5329178Z             }
2026-08-28T09:54:48.5329434Z           ]
2026-08-28T09:54:48.5329686Z         },
2026-08-28T09:54:48.5329943Z         "int": {
2026-08-28T09:54:48.5330228Z           "complete": false,
2026-08-28T09:54:48.5330504Z           "evidence": []
2026-08-28T09:54:48.5330756Z         },
2026-08-28T09:54:48.5331018Z         "unit": {
2026-08-28T09:54:48.5331295Z           "complete": true,
2026-08-28T09:54:48.5331567Z           "evidence": [
2026-08-28T09:54:48.5331817Z             {
2026-08-28T09:54:48.5332136Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5332408Z               "line": 34000
2026-08-28T09:54:48.5332672Z             }
2026-08-28T09:54:48.5332923Z           ]
2026-08-28T09:54:48.5333181Z         }
2026-08-28T09:54:48.5333457Z       }
2026-08-28T09:54:48.5333706Z     },
2026-08-28T09:54:48.5333967Z     {
2026-08-28T09:54:48.5334282Z       "id": "REQ-SUBNET-STATUS-MODES",
2026-08-28T09:54:48.5342237Z       "title": "`spt subnet status <name>` states the subnet's three mode facts (surface ruled 2026-07-30 — the per-subnet view is `subnet status`, no near-synonym `show` verb minted): the mode the subnet DECLARES as this node knows it, the mode this node CAPTURED (the enforced fallback — join-time immutable, changed only through the engine room's access-refresh), and any declared change SEEN but not adopted (`declared_seen`), named PENDING with when it was seen and the explicit statement that this node's posture is unchanged until the engine room adopts it. Absences are stated in words — a pre-mode subnet and an uncaptured fallback each say so — never rendered as blank, and the `--json` rows carry the same facts as optional fields. Gate: doc — the CONTEXT.md access-entity entry's mode-facts sentence; impl — the mode-facts resolver over the two stores that each own one half of the truth and the status-view wiring; unit — the three-way wording including both absence lines and the no-pending case.",
2026-08-28T09:54:48.5342696Z       "requiredStages": [
2026-08-28T09:54:48.5342954Z         "doc",
2026-08-28T09:54:48.5343213Z         "impl",
2026-08-28T09:54:48.5343473Z         "unit"
2026-08-28T09:54:48.5343741Z       ],
2026-08-28T09:54:48.5344003Z       "stages": {
2026-08-28T09:54:48.5344271Z         "doc": {
2026-08-28T09:54:48.5344552Z           "complete": true,
2026-08-28T09:54:48.5344823Z           "evidence": [
2026-08-28T09:54:48.5345075Z             {
2026-08-28T09:54:48.5345371Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.5345638Z               "line": 874
2026-08-28T09:54:48.5345881Z             },
2026-08-28T09:54:48.5346154Z             {
2026-08-28T09:54:48.5346613Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:48.5346875Z               "line": 3
2026-08-28T09:54:48.5347133Z             }
2026-08-28T09:54:48.5347389Z           ]
2026-08-28T09:54:48.5347642Z         },
2026-08-28T09:54:48.5347904Z         "impl": {
2026-08-28T09:54:48.5348186Z           "complete": true,
2026-08-28T09:54:48.5348454Z           "evidence": [
2026-08-28T09:54:48.5348714Z             {
2026-08-28T09:54:48.5349149Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5349482Z               "line": 13989
2026-08-28T09:54:48.5349740Z             },
2026-08-28T09:54:48.5349988Z             {
2026-08-28T09:54:48.5350303Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5350574Z               "line": 14038
2026-08-28T09:54:48.5350835Z             },
2026-08-28T09:54:48.5351086Z             {
2026-08-28T09:54:48.5351401Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5351678Z               "line": 14071
2026-08-28T09:54:48.5351992Z             },
2026-08-28T09:54:48.5352250Z             {
2026-08-28T09:54:48.5352565Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5352836Z               "line": 14142
2026-08-28T09:54:48.5353093Z             },
2026-08-28T09:54:48.5353350Z             {
2026-08-28T09:54:48.5353660Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5353935Z               "line": 14179
2026-08-28T09:54:48.5354191Z             },
2026-08-28T09:54:48.5354438Z             {
2026-08-28T09:54:48.5354753Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5355025Z               "line": 14304
2026-08-28T09:54:48.5355279Z             }
2026-08-28T09:54:48.5355527Z           ]
2026-08-28T09:54:48.5355785Z         },
2026-08-28T09:54:48.5356042Z         "int": {
2026-08-28T09:54:48.5356321Z           "complete": false,
2026-08-28T09:54:48.5356605Z           "evidence": []
2026-08-28T09:54:48.5356844Z         },
2026-08-28T09:54:48.5357097Z         "unit": {
2026-08-28T09:54:48.5357379Z           "complete": true,
2026-08-28T09:54:48.5357650Z           "evidence": [
2026-08-28T09:54:48.5357897Z             {
2026-08-28T09:54:48.5358217Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5358551Z               "line": 26251
2026-08-28T09:54:48.5358938Z             }
2026-08-28T09:54:48.5359470Z           ]
2026-08-28T09:54:48.5359733Z         }
2026-08-28T09:54:48.5359990Z       }
2026-08-28T09:54:48.5360228Z     },
2026-08-28T09:54:48.5360490Z     {
2026-08-28T09:54:48.5360858Z       "id": "REQ-SUBNET-STATUS-MODES-EVERY-VIEW",
2026-08-28T09:54:48.5374561Z       "title": "THE MODE FACTS RIDE EVERY SUBNET STATUS VIEW, NOT ONLY THE NAMED ONE (ruled 2026-08-02 bag grill, releases#100). REQ-SUBNET-STATUS-MODES put the three mode facts on `spt subnet status <name>`; the BARE `spt subnet status` rendered membership shape alone (subnet, nodes, endpoints), so the precise state releases#100 exists to end -- declared closed, captured nothing, enforcing open -- read as FINE on the view an operator actually runs, and the blindness was itself part of why the defect survived in the field. The bare view therefore carries a compact per-subnet mode plus the captured-here fact for every row. ONE COMPOSER, TWO RENDERINGS: the bare view resolves its facts through the SAME mode-facts resolver and states them from the SAME wording source as the named view, so the two cannot drift into two vocabularies for one truth -- a second literal spelling of 'captured here' is the defect this clause forbids, not a style preference. Absences stay stated in words on both views (an uncaptured fallback says so; a pre-modes subnet says so) -- a blank cell reads as 'nothing to worry about', which is the exact misread this requirement removes. Gate: doc -- the docs-site access page describes ONE consistent surface rather than hedging the bare-vs-named asymmetry; impl -- the bare status view's mode facts, fed by the shared resolver and the shared wording source; unit -- the bare view states both the declared and the captured fact for every row, an uncaptured subnet renders its absence in words rather than blank, and the bare and named renderings agree on the same fixture (the row that fails the moment a second wording is introduced).",
2026-08-28T09:54:48.5374956Z       "requiredStages": [
2026-08-28T09:54:48.5375215Z         "doc",
2026-08-28T09:54:48.5375473Z         "impl",
2026-08-28T09:54:48.5375732Z         "unit"
2026-08-28T09:54:48.5375994Z       ],
2026-08-28T09:54:48.5376256Z       "stages": {
2026-08-28T09:54:48.5376576Z         "doc": {
2026-08-28T09:54:48.5376852Z           "complete": true,
2026-08-28T09:54:48.5377123Z           "evidence": [
2026-08-28T09:54:48.5377375Z             {
2026-08-28T09:54:48.5377811Z               "path": "docs-site/src/networking/access-viewing.md",
2026-08-28T09:54:48.5378083Z               "line": 175
2026-08-28T09:54:48.5378345Z             },
2026-08-28T09:54:48.5378608Z             {
2026-08-28T09:54:48.5379157Z               "path": "docs-site/src/reference/json-shapes.md",
2026-08-28T09:54:48.5379510Z               "line": 418
2026-08-28T09:54:48.5379763Z             }
2026-08-28T09:54:48.5380020Z           ]
2026-08-28T09:54:48.5380351Z         },
2026-08-28T09:54:48.5380786Z         "impl": {
2026-08-28T09:54:48.5381078Z           "complete": true,
2026-08-28T09:54:48.5381349Z           "evidence": [
2026-08-28T09:54:48.5381596Z             {
2026-08-28T09:54:48.5381896Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5382169Z               "line": 13380
2026-08-28T09:54:48.5382412Z             },
2026-08-28T09:54:48.5382671Z             {
2026-08-28T09:54:48.5382978Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5383267Z               "line": 13387
2026-08-28T09:54:48.5383562Z             },
2026-08-28T09:54:48.5383815Z             {
2026-08-28T09:54:48.5384129Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5384516Z               "line": 13432
2026-08-28T09:54:48.5384879Z             },
2026-08-28T09:54:48.5385237Z             {
2026-08-28T09:54:48.5385714Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5386138Z               "line": 13467
2026-08-28T09:54:48.5386506Z             },
2026-08-28T09:54:48.5386864Z             {
2026-08-28T09:54:48.5387321Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5387718Z               "line": 14034
2026-08-28T09:54:48.5388102Z             }
2026-08-28T09:54:48.5388516Z           ]
2026-08-28T09:54:48.5388924Z         },
2026-08-28T09:54:48.5389611Z         "int": {
2026-08-28T09:54:48.5390245Z           "complete": false,
2026-08-28T09:54:48.5390594Z           "evidence": []
2026-08-28T09:54:48.5390911Z         },
2026-08-28T09:54:48.5391236Z         "unit": {
2026-08-28T09:54:48.5391595Z           "complete": true,
2026-08-28T09:54:48.5391928Z           "evidence": [
2026-08-28T09:54:48.5392243Z             {
2026-08-28T09:54:48.5392729Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5393076Z               "line": 38307
2026-08-28T09:54:48.5393383Z             }
2026-08-28T09:54:48.5393698Z           ]
2026-08-28T09:54:48.5394003Z         }
2026-08-28T09:54:48.5394318Z       }
2026-08-28T09:54:48.5394638Z     },
2026-08-28T09:54:48.5394938Z     {
2026-08-28T09:54:48.5395381Z       "id": "REQ-TEARDOWN-UNCOOPERATIVE-HOST",
2026-08-28T09:54:48.5404140Z       "title": "TEARDOWN-AUTHORITY W1 (ADR-0045 decision 4): the teardown kill NEVER depends on harness cooperation — no graceful-input path, no waiting on PTY EOF, no ask-it-to-exit-first step. A WEDGED host is the design case, not the edge case: it is the situation that produced the ADR (doyle's own endpoint — read-only rc replayed the retained PTY and `rc --take` acquired control, but a direct prompt produced no output for 30+s because the retained harness subtree itself was nonresponsive while the broker correctly preserved and replayed its last PTY state). Any cooperation-dependent step re-imports the exact hang the verb exists to break. Gate: impl — the kill path proves no dependency on session responsiveness; int — a deliberately nonresponsive/wedged hosted harness is still reaped within the bound (broker row gone + subtree gone), asserted against a real broker-hosted session.",
2026-08-28T09:54:48.5404487Z       "requiredStages": [
2026-08-28T09:54:48.5404750Z         "impl",
2026-08-28T09:54:48.5405002Z         "int"
2026-08-28T09:54:48.5405259Z       ],
2026-08-28T09:54:48.5405527Z       "stages": {
2026-08-28T09:54:48.5405784Z         "doc": {
2026-08-28T09:54:48.5406146Z           "complete": true,
2026-08-28T09:54:48.5406423Z           "evidence": [
2026-08-28T09:54:48.5406675Z             {
2026-08-28T09:54:48.5407135Z               "path": "docs/adr/0045-endpoint-teardown-authority.md",
2026-08-28T09:54:48.5407407Z               "line": 94
2026-08-28T09:54:48.5407651Z             }
2026-08-28T09:54:48.5407903Z           ]
2026-08-28T09:54:48.5408155Z         },
2026-08-28T09:54:48.5408427Z         "impl": {
2026-08-28T09:54:48.5408780Z           "complete": true,
2026-08-28T09:54:48.5409121Z           "evidence": [
2026-08-28T09:54:48.5409387Z             {
2026-08-28T09:54:48.5409772Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5410045Z               "line": 9402
2026-08-28T09:54:48.5410298Z             },
2026-08-28T09:54:48.5410550Z             {
2026-08-28T09:54:48.5410884Z               "path": "crates/spt/src/teardown.rs",
2026-08-28T09:54:48.5411157Z               "line": 202
2026-08-28T09:54:48.5411419Z             }
2026-08-28T09:54:48.5411676Z           ]
2026-08-28T09:54:48.5411937Z         },
2026-08-28T09:54:48.5412195Z         "int": {
2026-08-28T09:54:48.5412481Z           "complete": true,
2026-08-28T09:54:48.5412748Z           "evidence": [
2026-08-28T09:54:48.5413005Z             {
2026-08-28T09:54:48.5413482Z               "path": "crates/spt/tests/endpoint_teardown_authority_e2e.rs",
2026-08-28T09:54:48.5413754Z               "line": 528
2026-08-28T09:54:48.5414012Z             },
2026-08-28T09:54:48.5414267Z             {
2026-08-28T09:54:48.5414748Z               "path": "crates/spt/tests/endpoint_teardown_authority_e2e.rs",
2026-08-28T09:54:48.5415024Z               "line": 784
2026-08-28T09:54:48.5415286Z             }
2026-08-28T09:54:48.5415654Z           ]
2026-08-28T09:54:48.5415954Z         },
2026-08-28T09:54:48.5416216Z         "unit": {
2026-08-28T09:54:48.5416497Z           "complete": false,
2026-08-28T09:54:48.5416773Z           "evidence": []
2026-08-28T09:54:48.5417025Z         }
2026-08-28T09:54:48.5417282Z       }
2026-08-28T09:54:48.5417528Z     },
2026-08-28T09:54:48.5417863Z     {
2026-08-28T09:54:48.5418144Z       "id": "REQ-TERM-1",
2026-08-28T09:54:48.5418677Z       "title": "Process-supervisor terminal wrapper hosting broker PTYs",
2026-08-28T09:54:48.5419049Z       "requiredStages": [
2026-08-28T09:54:48.5419321Z         "impl",
2026-08-28T09:54:48.5419578Z         "unit"
2026-08-28T09:54:48.5419895Z       ],
2026-08-28T09:54:48.5420162Z       "stages": {
2026-08-28T09:54:48.5420420Z         "doc": {
2026-08-28T09:54:48.5420710Z           "complete": false,
2026-08-28T09:54:48.5420986Z           "evidence": []
2026-08-28T09:54:48.5421243Z         },
2026-08-28T09:54:48.5421502Z         "impl": {
2026-08-28T09:54:48.5421806Z           "complete": true,
2026-08-28T09:54:48.5422083Z           "evidence": [
2026-08-28T09:54:48.5422342Z             {
2026-08-28T09:54:48.5422683Z               "path": "crates/spt-term/src/pty.rs",
2026-08-28T09:54:48.5422950Z               "line": 59
2026-08-28T09:54:48.5423211Z             },
2026-08-28T09:54:48.5423460Z             {
2026-08-28T09:54:48.5423808Z               "path": "crates/spt-term/src/pty.rs",
2026-08-28T09:54:48.5424070Z               "line": 234
2026-08-28T09:54:48.5424333Z             },
2026-08-28T09:54:48.5424587Z             {
2026-08-28T09:54:48.5424932Z               "path": "crates/spt-term/src/surface.rs",
2026-08-28T09:54:48.5425212Z               "line": 100
2026-08-28T09:54:48.5425464Z             }
2026-08-28T09:54:48.5425722Z           ]
2026-08-28T09:54:48.5425970Z         },
2026-08-28T09:54:48.5426228Z         "int": {
2026-08-28T09:54:48.5426509Z           "complete": false,
2026-08-28T09:54:48.5426781Z           "evidence": []
2026-08-28T09:54:48.5427037Z         },
2026-08-28T09:54:48.5427295Z         "unit": {
2026-08-28T09:54:48.5427576Z           "complete": true,
2026-08-28T09:54:48.5427851Z           "evidence": [
2026-08-28T09:54:48.5428102Z             {
2026-08-28T09:54:48.5434230Z               "path": "crates/spt-term/tests/surface.rs",
2026-08-28T09:54:48.5434645Z               "line": 24
2026-08-28T09:54:48.5434907Z             },
2026-08-28T09:54:48.5435170Z             {
2026-08-28T09:54:48.5435549Z               "path": "crates/spt-term/tests/surface.rs",
2026-08-28T09:54:48.5435815Z               "line": 56
2026-08-28T09:54:48.5436067Z             }
2026-08-28T09:54:48.5436319Z           ]
2026-08-28T09:54:48.5436577Z         }
2026-08-28T09:54:48.5436831Z       }
2026-08-28T09:54:48.5437155Z     },
2026-08-28T09:54:48.5437413Z     {
2026-08-28T09:54:48.5437676Z       "id": "REQ-TERM-2",
2026-08-28T09:54:48.5438245Z       "title": "session-surface abstraction; send-keys + send-line injection",
2026-08-28T09:54:48.5438538Z       "requiredStages": [
2026-08-28T09:54:48.5438792Z         "impl",
2026-08-28T09:54:48.5439135Z         "unit"
2026-08-28T09:54:48.5439388Z       ],
2026-08-28T09:54:48.5439650Z       "stages": {
2026-08-28T09:54:48.5439908Z         "doc": {
2026-08-28T09:54:48.5440194Z           "complete": false,
2026-08-28T09:54:48.5440474Z           "evidence": []
2026-08-28T09:54:48.5440731Z         },
2026-08-28T09:54:48.5440992Z         "impl": {
2026-08-28T09:54:48.5441282Z           "complete": true,
2026-08-28T09:54:48.5441555Z           "evidence": [
2026-08-28T09:54:48.5441806Z             {
2026-08-28T09:54:48.5442169Z               "path": "crates/spt-term/src/surface.rs",
2026-08-28T09:54:48.5442440Z               "line": 117
2026-08-28T09:54:48.5442698Z             },
2026-08-28T09:54:48.5442955Z             {
2026-08-28T09:54:48.5443304Z               "path": "crates/spt-term/src/surface.rs",
2026-08-28T09:54:48.5443580Z               "line": 127
2026-08-28T09:54:48.5443832Z             }
2026-08-28T09:54:48.5444089Z           ]
2026-08-28T09:54:48.5444351Z         },
2026-08-28T09:54:48.5444609Z         "int": {
2026-08-28T09:54:48.5444890Z           "complete": false,
2026-08-28T09:54:48.5445172Z           "evidence": []
2026-08-28T09:54:48.5445425Z         },
2026-08-28T09:54:48.5445688Z         "unit": {
2026-08-28T09:54:48.5445967Z           "complete": true,
2026-08-28T09:54:48.5446303Z           "evidence": [
2026-08-28T09:54:48.5446560Z             {
2026-08-28T09:54:48.5446923Z               "path": "crates/spt-term/tests/inject.rs",
2026-08-28T09:54:48.5447190Z               "line": 46
2026-08-28T09:54:48.5447443Z             },
2026-08-28T09:54:48.5447700Z             {
2026-08-28T09:54:48.5448106Z               "path": "crates/spt-term/tests/inject.rs",
2026-08-28T09:54:48.5448372Z               "line": 77
2026-08-28T09:54:48.5448631Z             }
2026-08-28T09:54:48.5448882Z           ]
2026-08-28T09:54:48.5449189Z         }
2026-08-28T09:54:48.5449461Z       }
2026-08-28T09:54:48.5449719Z     },
2026-08-28T09:54:48.5449967Z     {
2026-08-28T09:54:48.5450248Z       "id": "REQ-TERM-3",
2026-08-28T09:54:48.5450668Z       "title": "Byte-stream remote terminal streaming for v1",
2026-08-28T09:54:48.5450958Z       "requiredStages": [
2026-08-28T09:54:48.5451221Z         "impl",
2026-08-28T09:54:48.5451477Z         "unit"
2026-08-28T09:54:48.5451732Z       ],
2026-08-28T09:54:48.5451999Z       "stages": {
2026-08-28T09:54:48.5452285Z         "doc": {
2026-08-28T09:54:48.5452577Z           "complete": false,
2026-08-28T09:54:48.5452852Z           "evidence": []
2026-08-28T09:54:48.5453111Z         },
2026-08-28T09:54:48.5453373Z         "impl": {
2026-08-28T09:54:48.5453679Z           "complete": true,
2026-08-28T09:54:48.5453950Z           "evidence": [
2026-08-28T09:54:48.5454211Z             {
2026-08-28T09:54:48.5454559Z               "path": "crates/spt-term/src/stream.rs",
2026-08-28T09:54:48.5454840Z               "line": 73
2026-08-28T09:54:48.5455094Z             }
2026-08-28T09:54:48.5455351Z           ]
2026-08-28T09:54:48.5455599Z         },
2026-08-28T09:54:48.5455856Z         "int": {
2026-08-28T09:54:48.5456146Z           "complete": false,
2026-08-28T09:54:48.5456408Z           "evidence": []
2026-08-28T09:54:48.5456669Z         },
2026-08-28T09:54:48.5456926Z         "unit": {
2026-08-28T09:54:48.5457274Z           "complete": true,
2026-08-28T09:54:48.5457546Z           "evidence": [
2026-08-28T09:54:48.5457803Z             {
2026-08-28T09:54:48.5458171Z               "path": "crates/spt-term/tests/stream.rs",
2026-08-28T09:54:48.5458437Z               "line": 37
2026-08-28T09:54:48.5458694Z             },
2026-08-28T09:54:48.5459028Z             {
2026-08-28T09:54:48.5459389Z               "path": "crates/spt-term/tests/stream.rs",
2026-08-28T09:54:48.5459731Z               "line": 67
2026-08-28T09:54:48.5459988Z             }
2026-08-28T09:54:48.5460236Z           ]
2026-08-28T09:54:48.5460484Z         }
2026-08-28T09:54:48.5460743Z       }
2026-08-28T09:54:48.5460989Z     },
2026-08-28T09:54:48.5461242Z     {
2026-08-28T09:54:48.5461523Z       "id": "REQ-TERM-4",
2026-08-28T09:54:48.5463046Z       "title": "Live activity buffer (session digest): projection of normalized session logs, snapshot-pull (spt endpoint digest) + structured-delta-stream contract + api digest-entry push",
2026-08-28T09:54:48.5463342Z       "requiredStages": [
2026-08-28T09:54:48.5463614Z         "impl",
2026-08-28T09:54:48.5463871Z         "unit",
2026-08-28T09:54:48.5464133Z         "int"
2026-08-28T09:54:48.5464390Z       ],
2026-08-28T09:54:48.5464649Z       "stages": {
2026-08-28T09:54:48.5464909Z         "doc": {
2026-08-28T09:54:48.5465191Z           "complete": false,
2026-08-28T09:54:48.5465467Z           "evidence": []
2026-08-28T09:54:48.5465724Z         },
2026-08-28T09:54:48.5465997Z         "impl": {
2026-08-28T09:54:48.5466273Z           "complete": true,
2026-08-28T09:54:48.5466546Z           "evidence": [
2026-08-28T09:54:48.5466808Z             {
2026-08-28T09:54:48.5467168Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5467438Z               "line": 37
2026-08-28T09:54:48.5467695Z             },
2026-08-28T09:54:48.5467952Z             {
2026-08-28T09:54:48.5468324Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5468610Z               "line": 25
2026-08-28T09:54:48.5468874Z             },
2026-08-28T09:54:48.5469365Z             {
2026-08-28T09:54:48.5469747Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5470021Z               "line": 114
2026-08-28T09:54:48.5470281Z             },
2026-08-28T09:54:48.5470534Z             {
2026-08-28T09:54:48.5470915Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5471268Z               "line": 267
2026-08-28T09:54:48.5471525Z             },
2026-08-28T09:54:48.5471788Z             {
2026-08-28T09:54:48.5472151Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5472426Z               "line": 293
2026-08-28T09:54:48.5472682Z             },
2026-08-28T09:54:48.5472939Z             {
2026-08-28T09:54:48.5473311Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5473597Z               "line": 311
2026-08-28T09:54:48.5473855Z             },
2026-08-28T09:54:48.5474121Z             {
2026-08-28T09:54:48.5474485Z               "path": "crates/spt-store/src/history.rs",
2026-08-28T09:54:48.5474756Z               "line": 33
2026-08-28T09:54:48.5475018Z             },
2026-08-28T09:54:48.5475274Z             {
2026-08-28T09:54:48.5475655Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5475923Z               "line": 52
2026-08-28T09:54:48.5476180Z             },
2026-08-28T09:54:48.5476443Z             {
2026-08-28T09:54:48.5476810Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5477087Z               "line": 180
2026-08-28T09:54:48.5477339Z             },
2026-08-28T09:54:48.5477595Z             {
2026-08-28T09:54:48.5477959Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5478241Z               "line": 190
2026-08-28T09:54:48.5478499Z             },
2026-08-28T09:54:48.5478751Z             {
2026-08-28T09:54:48.5479209Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5479582Z               "line": 254
2026-08-28T09:54:48.5479848Z             },
2026-08-28T09:54:48.5480101Z             {
2026-08-28T09:54:48.5480481Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.5480755Z               "line": 472
2026-08-28T09:54:48.5481028Z             },
2026-08-28T09:54:48.5481280Z             {
2026-08-28T09:54:48.5481643Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.5481910Z               "line": 483
2026-08-28T09:54:48.5482239Z             },
2026-08-28T09:54:48.5482497Z             {
2026-08-28T09:54:48.5482807Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5483081Z               "line": 2561
2026-08-28T09:54:48.5483336Z             }
2026-08-28T09:54:48.5483594Z           ]
2026-08-28T09:54:48.5483847Z         },
2026-08-28T09:54:48.5484110Z         "int": {
2026-08-28T09:54:48.5484381Z           "complete": true,
2026-08-28T09:54:48.5484652Z           "evidence": [
2026-08-28T09:54:48.5484915Z             {
2026-08-28T09:54:48.5485340Z               "path": "crates/spt-daemon/tests/digest.rs",
2026-08-28T09:54:48.5485626Z               "line": 18
2026-08-28T09:54:48.5485872Z             }
2026-08-28T09:54:48.5486130Z           ]
2026-08-28T09:54:48.5486383Z         },
2026-08-28T09:54:48.5486641Z         "unit": {
2026-08-28T09:54:48.5486926Z           "complete": true,
2026-08-28T09:54:48.5487197Z           "evidence": [
2026-08-28T09:54:48.5487446Z             {
2026-08-28T09:54:48.5487808Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5488080Z               "line": 537
2026-08-28T09:54:48.5488322Z             },
2026-08-28T09:54:48.5488582Z             {
2026-08-28T09:54:48.5488936Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5489279Z               "line": 590
2026-08-28T09:54:48.5489536Z             },
2026-08-28T09:54:48.5489793Z             {
2026-08-28T09:54:48.5490152Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5490423Z               "line": 600
2026-08-28T09:54:48.5490747Z             },
2026-08-28T09:54:48.5491003Z             {
2026-08-28T09:54:48.5491387Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5491658Z               "line": 443
2026-08-28T09:54:48.5491926Z             },
2026-08-28T09:54:48.5492183Z             {
2026-08-28T09:54:48.5492551Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5492889Z               "line": 463
2026-08-28T09:54:48.5493142Z             },
2026-08-28T09:54:48.5493401Z             {
2026-08-28T09:54:48.5493774Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5494050Z               "line": 485
2026-08-28T09:54:48.5494321Z             },
2026-08-28T09:54:48.5494573Z             {
2026-08-28T09:54:48.5494951Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5495231Z               "line": 498
2026-08-28T09:54:48.5495790Z             },
2026-08-28T09:54:48.5496206Z             {
2026-08-28T09:54:48.5496718Z               "path": "crates/spt-daemon/src/digesthub.rs",
2026-08-28T09:54:48.5497052Z               "line": 509
2026-08-28T09:54:48.5497372Z             },
2026-08-28T09:54:48.5497691Z             {
2026-08-28T09:54:48.5498150Z               "path": "crates/spt-store/src/history.rs",
2026-08-28T09:54:48.5498489Z               "line": 108
2026-08-28T09:54:48.5498811Z             },
2026-08-28T09:54:48.5499224Z             {
2026-08-28T09:54:48.5499666Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:48.5500004Z               "line": 207
2026-08-28T09:54:48.5500319Z             },
2026-08-28T09:54:48.5500639Z             {
2026-08-28T09:54:48.5501074Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:48.5501403Z               "line": 215
2026-08-28T09:54:48.5501730Z             },
2026-08-28T09:54:48.5502043Z             {
2026-08-28T09:54:48.5502524Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5503035Z               "line": 537
2026-08-28T09:54:48.5503364Z             },
2026-08-28T09:54:48.5503675Z             {
2026-08-28T09:54:48.5504135Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5504476Z               "line": 564
2026-08-28T09:54:48.5504785Z             },
2026-08-28T09:54:48.5505110Z             {
2026-08-28T09:54:48.5505574Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5506007Z               "line": 583
2026-08-28T09:54:48.5506321Z             },
2026-08-28T09:54:48.5506635Z             {
2026-08-28T09:54:48.5507093Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5507427Z               "line": 598
2026-08-28T09:54:48.5507737Z             },
2026-08-28T09:54:48.5508051Z             {
2026-08-28T09:54:48.5508504Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5508842Z               "line": 624
2026-08-28T09:54:48.5509214Z             },
2026-08-28T09:54:48.5509465Z             {
2026-08-28T09:54:48.5509845Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5510118Z               "line": 644
2026-08-28T09:54:48.5510370Z             },
2026-08-28T09:54:48.5510628Z             {
2026-08-28T09:54:48.5511000Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5511267Z               "line": 654
2026-08-28T09:54:48.5511514Z             },
2026-08-28T09:54:48.5511771Z             {
2026-08-28T09:54:48.5512133Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5512403Z               "line": 747
2026-08-28T09:54:48.5512665Z             },
2026-08-28T09:54:48.5512913Z             {
2026-08-28T09:54:48.5513290Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.5513562Z               "line": 1728
2026-08-28T09:54:48.5513819Z             },
2026-08-28T09:54:48.5514071Z             {
2026-08-28T09:54:48.5514386Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5514661Z               "line": 32992
2026-08-28T09:54:48.5514988Z             }
2026-08-28T09:54:48.5515247Z           ]
2026-08-28T09:54:48.5515504Z         }
2026-08-28T09:54:48.5515761Z       }
2026-08-28T09:54:48.5516013Z     },
2026-08-28T09:54:48.5516271Z     {
2026-08-28T09:54:48.5516553Z       "id": "REQ-TERM-5",
2026-08-28T09:54:48.5521541Z       "title": "Adapter-declared digest extractor seam: a `[digest]` manifest section declaring an imperative extractor (native harness log -> the {role,text,tool,ts} contract; defaults to the [history] source files with an own-source escape hatch), `api digest-entry` push fallback, register-time validation of the section, adapter-declared presentation defaults (window depth, arg-truncation, sprint-collapse) that any consumer may override, and a `spt adapter digest-proof` author tool plus runtime skip-diagnostics (no silent drop). Reverses M9's no-manifest-seam stance; no declarative DSL.",
2026-08-28T09:54:48.5521913Z       "requiredStages": [
2026-08-28T09:54:48.5522171Z         "doc",
2026-08-28T09:54:48.5522443Z         "impl",
2026-08-28T09:54:48.5522698Z         "unit",
2026-08-28T09:54:48.5522958Z         "int"
2026-08-28T09:54:48.5523212Z       ],
2026-08-28T09:54:48.5523473Z       "stages": {
2026-08-28T09:54:48.5523735Z         "doc": {
2026-08-28T09:54:48.5524011Z           "complete": true,
2026-08-28T09:54:48.5524288Z           "evidence": [
2026-08-28T09:54:48.5524541Z             {
2026-08-28T09:54:48.5524855Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:48.5525124Z               "line": 556
2026-08-28T09:54:48.5525384Z             }
2026-08-28T09:54:48.5525639Z           ]
2026-08-28T09:54:48.5525891Z         },
2026-08-28T09:54:48.5526155Z         "impl": {
2026-08-28T09:54:48.5526435Z           "complete": true,
2026-08-28T09:54:48.5526712Z           "evidence": [
2026-08-28T09:54:48.5526961Z             {
2026-08-28T09:54:48.5527333Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5527657Z               "line": 75
2026-08-28T09:54:48.5527920Z             },
2026-08-28T09:54:48.5528184Z             {
2026-08-28T09:54:48.5528537Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5528823Z               "line": 131
2026-08-28T09:54:48.5529162Z             },
2026-08-28T09:54:48.5529692Z             {
2026-08-28T09:54:48.5530174Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5530515Z               "line": 22
2026-08-28T09:54:48.5531032Z             },
2026-08-28T09:54:48.5531342Z             {
2026-08-28T09:54:48.5531796Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5532135Z               "line": 87
2026-08-28T09:54:48.5532454Z             },
2026-08-28T09:54:48.5532769Z             {
2026-08-28T09:54:48.5533211Z               "path": "crates/spt-term/src/digest.rs",
2026-08-28T09:54:48.5533552Z               "line": 30
2026-08-28T09:54:48.5533866Z             },
2026-08-28T09:54:48.5534190Z             {
2026-08-28T09:54:48.5534649Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5534988Z               "line": 103
2026-08-28T09:54:48.5535312Z             },
2026-08-28T09:54:48.5535627Z             {
2026-08-28T09:54:48.5536085Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5536414Z               "line": 167
2026-08-28T09:54:48.5536733Z             },
2026-08-28T09:54:48.5537044Z             {
2026-08-28T09:54:48.5537506Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5537836Z               "line": 497
2026-08-28T09:54:48.5538156Z             },
2026-08-28T09:54:48.5538465Z             {
2026-08-28T09:54:48.5538850Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5539260Z               "line": 20635
2026-08-28T09:54:48.5539532Z             },
2026-08-28T09:54:48.5539780Z             {
2026-08-28T09:54:48.5540104Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5540386Z               "line": 21992
2026-08-28T09:54:48.5540642Z             }
2026-08-28T09:54:48.5540975Z           ]
2026-08-28T09:54:48.5541240Z         },
2026-08-28T09:54:48.5541498Z         "int": {
2026-08-28T09:54:48.5541788Z           "complete": true,
2026-08-28T09:54:48.5542056Z           "evidence": [
2026-08-28T09:54:48.5542318Z             {
2026-08-28T09:54:48.5542765Z               "path": "crates/spt-daemon/tests/two_origin_spanning.rs",
2026-08-28T09:54:48.5543103Z               "line": 17
2026-08-28T09:54:48.5543358Z             }
2026-08-28T09:54:48.5543616Z           ]
2026-08-28T09:54:48.5543880Z         },
2026-08-28T09:54:48.5544140Z         "unit": {
2026-08-28T09:54:48.5544431Z           "complete": true,
2026-08-28T09:54:48.5544699Z           "evidence": [
2026-08-28T09:54:48.5544960Z             {
2026-08-28T09:54:48.5545356Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5545628Z               "line": 548
2026-08-28T09:54:48.5545896Z             },
2026-08-28T09:54:48.5546139Z             {
2026-08-28T09:54:48.5546490Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5546764Z               "line": 191
2026-08-28T09:54:48.5547026Z             },
2026-08-28T09:54:48.5547279Z             {
2026-08-28T09:54:48.5547641Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5547913Z               "line": 208
2026-08-28T09:54:48.5548176Z             },
2026-08-28T09:54:48.5548439Z             {
2026-08-28T09:54:48.5548787Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5549309Z               "line": 281
2026-08-28T09:54:48.5549696Z             },
2026-08-28T09:54:48.5550025Z             {
2026-08-28T09:54:48.5550478Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5550817Z               "line": 292
2026-08-28T09:54:48.5551125Z             },
2026-08-28T09:54:48.5551440Z             {
2026-08-28T09:54:48.5551876Z               "path": "crates/spt-live/src/digest.rs",
2026-08-28T09:54:48.5552363Z               "line": 303
2026-08-28T09:54:48.5552687Z             },
2026-08-28T09:54:48.5553001Z             {
2026-08-28T09:54:48.5553469Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.5553798Z               "line": 2212
2026-08-28T09:54:48.5554113Z             },
2026-08-28T09:54:48.5554421Z             {
2026-08-28T09:54:48.5554892Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.5555474Z               "line": 2295
2026-08-28T09:54:48.5555803Z             },
2026-08-28T09:54:48.5556123Z             {
2026-08-28T09:54:48.5556588Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5556926Z               "line": 669
2026-08-28T09:54:48.5557229Z             },
2026-08-28T09:54:48.5557548Z             {
2026-08-28T09:54:48.5558007Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5558346Z               "line": 697
2026-08-28T09:54:48.5558666Z             },
2026-08-28T09:54:48.5559093Z             {
2026-08-28T09:54:48.5559884Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5560271Z               "line": 709
2026-08-28T09:54:48.5560628Z             },
2026-08-28T09:54:48.5560971Z             {
2026-08-28T09:54:48.5561487Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5561859Z               "line": 733
2026-08-28T09:54:48.5562209Z             },
2026-08-28T09:54:48.5562561Z             {
2026-08-28T09:54:48.5562985Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5563356Z               "line": 31425
2026-08-28T09:54:48.5563705Z             },
2026-08-28T09:54:48.5564053Z             {
2026-08-28T09:54:48.5564469Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5564840Z               "line": 31483
2026-08-28T09:54:48.5565185Z             }
2026-08-28T09:54:48.5565523Z           ]
2026-08-28T09:54:48.5565866Z         }
2026-08-28T09:54:48.5566213Z       }
2026-08-28T09:54:48.5566552Z     },
2026-08-28T09:54:48.5566887Z     {
2026-08-28T09:54:48.5567420Z       "id": "REQ-TERM-6",
2026-08-28T09:54:48.5571431Z       "title": "Thread-spanning digest across session boundaries: a per-endpoint session ledger (`<perch>/sessions.log`) appended at first bind and by `api boundary` on `/clear`|`/compact` session rotation, the digest enumerating the last K sessions so its rolling window bridges a boundary, and a distinctive in-timeline boundary marker (DigestEntry::Boundary). The digest follows the live-agent thread, not a single session.",
2026-08-28T09:54:48.5571832Z       "requiredStages": [
2026-08-28T09:54:48.5572119Z         "impl",
2026-08-28T09:54:48.5572400Z         "unit",
2026-08-28T09:54:48.5572684Z         "int"
2026-08-28T09:54:48.5572962Z       ],
2026-08-28T09:54:48.5573249Z       "stages": {
2026-08-28T09:54:48.5573535Z         "doc": {
2026-08-28T09:54:48.5573854Z           "complete": false,
2026-08-28T09:54:48.5574160Z           "evidence": []
2026-08-28T09:54:48.5574441Z         },
2026-08-28T09:54:48.5574723Z         "impl": {
2026-08-28T09:54:48.5575029Z           "complete": true,
2026-08-28T09:54:48.5575324Z           "evidence": [
2026-08-28T09:54:48.5575589Z             {
2026-08-28T09:54:48.5575959Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5576236Z               "line": 132
2026-08-28T09:54:48.5576488Z             },
2026-08-28T09:54:48.5576746Z             {
2026-08-28T09:54:48.5577103Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5577375Z               "line": 215
2026-08-28T09:54:48.5577628Z             },
2026-08-28T09:54:48.5577882Z             {
2026-08-28T09:54:48.5578246Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.5578521Z               "line": 17
2026-08-28T09:54:48.5578893Z             },
2026-08-28T09:54:48.5579289Z             {
2026-08-28T09:54:48.5579660Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.5580023Z               "line": 149
2026-08-28T09:54:48.5580280Z             },
2026-08-28T09:54:48.5580537Z             {
2026-08-28T09:54:48.5580914Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5581176Z               "line": 329
2026-08-28T09:54:48.5581429Z             },
2026-08-28T09:54:48.5581677Z             {
2026-08-28T09:54:48.5582040Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5582307Z               "line": 459
2026-08-28T09:54:48.5582621Z             }
2026-08-28T09:54:48.5582878Z           ]
2026-08-28T09:54:48.5583135Z         },
2026-08-28T09:54:48.5583391Z         "int": {
2026-08-28T09:54:48.5583686Z           "complete": true,
2026-08-28T09:54:48.5583948Z           "evidence": [
2026-08-28T09:54:48.5584215Z             {
2026-08-28T09:54:48.5584658Z               "path": "crates/spt-daemon/tests/two_origin_spanning.rs",
2026-08-28T09:54:48.5584926Z               "line": 18
2026-08-28T09:54:48.5585174Z             }
2026-08-28T09:54:48.5585440Z           ]
2026-08-28T09:54:48.5585688Z         },
2026-08-28T09:54:48.5585950Z         "unit": {
2026-08-28T09:54:48.5586235Z           "complete": true,
2026-08-28T09:54:48.5586505Z           "evidence": [
2026-08-28T09:54:48.5586762Z             {
2026-08-28T09:54:48.5587121Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.5587397Z               "line": 200
2026-08-28T09:54:48.5587649Z             },
2026-08-28T09:54:48.5587906Z             {
2026-08-28T09:54:48.5588288Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.5588555Z               "line": 215
2026-08-28T09:54:48.5588816Z             },
2026-08-28T09:54:48.5589149Z             {
2026-08-28T09:54:48.5589520Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.5589792Z               "line": 231
2026-08-28T09:54:48.5590050Z             },
2026-08-28T09:54:48.5590302Z             {
2026-08-28T09:54:48.5590670Z               "path": "crates/spt-store/src/sessions.rs",
2026-08-28T09:54:48.5590947Z               "line": 462
2026-08-28T09:54:48.5591271Z             },
2026-08-28T09:54:48.5591526Z             {
2026-08-28T09:54:48.5591898Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5592170Z               "line": 809
2026-08-28T09:54:48.5592422Z             },
2026-08-28T09:54:48.5592685Z             {
2026-08-28T09:54:48.5593114Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5593395Z               "line": 830
2026-08-28T09:54:48.5593657Z             },
2026-08-28T09:54:48.5593909Z             {
2026-08-28T09:54:48.5594270Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.5594537Z               "line": 1482
2026-08-28T09:54:48.5594799Z             }
2026-08-28T09:54:48.5595051Z           ]
2026-08-28T09:54:48.5595294Z         }
2026-08-28T09:54:48.5595537Z       }
2026-08-28T09:54:48.5596130Z     },
2026-08-28T09:54:48.5596387Z     {
2026-08-28T09:54:48.5596686Z       "id": "REQ-TERM-7",
2026-08-28T09:54:48.5600615Z       "title": "Two-origin digest merge: spt-owned context-injection entries (psyche_download | echo_mirror | owl_message) appended by spt to the endpoint `digest.log`, timestamp-interleaved with the adapter's extracted activity records into one ordered timeline, via a distinct context-injection record category. Data model only this milestone; GUI collapse/expand and the echo-reads-digest delta loop are deferred to the surfaces that consume them.",
2026-08-28T09:54:48.5600967Z       "requiredStages": [
2026-08-28T09:54:48.5601230Z         "impl",
2026-08-28T09:54:48.5601487Z         "unit",
2026-08-28T09:54:48.5601748Z         "int"
2026-08-28T09:54:48.5602001Z       ],
2026-08-28T09:54:48.5602264Z       "stages": {
2026-08-28T09:54:48.5602521Z         "doc": {
2026-08-28T09:54:48.5602807Z           "complete": false,
2026-08-28T09:54:48.5603092Z           "evidence": []
2026-08-28T09:54:48.5603344Z         },
2026-08-28T09:54:48.5603688Z         "impl": {
2026-08-28T09:54:48.5603969Z           "complete": true,
2026-08-28T09:54:48.5604246Z           "evidence": [
2026-08-28T09:54:48.5604502Z             {
2026-08-28T09:54:48.5604868Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5605140Z               "line": 133
2026-08-28T09:54:48.5605388Z             },
2026-08-28T09:54:48.5605645Z             {
2026-08-28T09:54:48.5606008Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5606347Z               "line": 498
2026-08-28T09:54:48.5606604Z             },
2026-08-28T09:54:48.5606870Z             {
2026-08-28T09:54:48.5607217Z               "path": "crates/spt-live/src/inject.rs",
2026-08-28T09:54:48.5607482Z               "line": 15
2026-08-28T09:54:48.5607740Z             },
2026-08-28T09:54:48.5607993Z             {
2026-08-28T09:54:48.5608345Z               "path": "crates/spt-live/src/inject.rs",
2026-08-28T09:54:48.5608604Z               "line": 32
2026-08-28T09:54:48.5608865Z             },
2026-08-28T09:54:48.5609195Z             {
2026-08-28T09:54:48.5609572Z               "path": "crates/spt-store/src/history.rs",
2026-08-28T09:54:48.5609846Z               "line": 49
2026-08-28T09:54:48.5610105Z             },
2026-08-28T09:54:48.5610363Z             {
2026-08-28T09:54:48.5610730Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5611007Z               "line": 290
2026-08-28T09:54:48.5611265Z             },
2026-08-28T09:54:48.5611518Z             {
2026-08-28T09:54:48.5611899Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5612166Z               "line": 330
2026-08-28T09:54:48.5612429Z             }
2026-08-28T09:54:48.5612680Z           ]
2026-08-28T09:54:48.5612932Z         },
2026-08-28T09:54:48.5613191Z         "int": {
2026-08-28T09:54:48.5613476Z           "complete": true,
2026-08-28T09:54:48.5613748Z           "evidence": [
2026-08-28T09:54:48.5614007Z             {
2026-08-28T09:54:48.5614454Z               "path": "crates/spt-daemon/tests/two_origin_spanning.rs",
2026-08-28T09:54:48.5614726Z               "line": 19
2026-08-28T09:54:48.5615053Z             }
2026-08-28T09:54:48.5615304Z           ]
2026-08-28T09:54:48.5615566Z         },
2026-08-28T09:54:48.5615823Z         "unit": {
2026-08-28T09:54:48.5616109Z           "complete": true,
2026-08-28T09:54:48.5616387Z           "evidence": [
2026-08-28T09:54:48.5616644Z             {
2026-08-28T09:54:48.5617064Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5617339Z               "line": 629
2026-08-28T09:54:48.5617599Z             },
2026-08-28T09:54:48.5617849Z             {
2026-08-28T09:54:48.5618210Z               "path": "crates/spt-daemon/src/digest.rs",
2026-08-28T09:54:48.5618481Z               "line": 859
2026-08-28T09:54:48.5618743Z             },
2026-08-28T09:54:48.5619091Z             {
2026-08-28T09:54:48.5619440Z               "path": "crates/spt-live/src/inject.rs",
2026-08-28T09:54:48.5619716Z               "line": 58
2026-08-28T09:54:48.5619973Z             },
2026-08-28T09:54:48.5620225Z             {
2026-08-28T09:54:48.5620576Z               "path": "crates/spt-live/src/inject.rs",
2026-08-28T09:54:48.5620843Z               "line": 77
2026-08-28T09:54:48.5621096Z             },
2026-08-28T09:54:48.5621348Z             {
2026-08-28T09:54:48.5621692Z               "path": "crates/spt-live/src/inject.rs",
2026-08-28T09:54:48.5621963Z               "line": 87
2026-08-28T09:54:48.5622230Z             },
2026-08-28T09:54:48.5622478Z             {
2026-08-28T09:54:48.5622841Z               "path": "crates/spt-store/src/history.rs",
2026-08-28T09:54:48.5623102Z               "line": 94
2026-08-28T09:54:48.5623355Z             },
2026-08-28T09:54:48.5623608Z             {
2026-08-28T09:54:48.5623970Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5624247Z               "line": 755
2026-08-28T09:54:48.5624498Z             },
2026-08-28T09:54:48.5624752Z             {
2026-08-28T09:54:48.5625176Z               "path": "crates/spt-term/src/projection.rs",
2026-08-28T09:54:48.5625452Z               "line": 787
2026-08-28T09:54:48.5625706Z             }
2026-08-28T09:54:48.5625961Z           ]
2026-08-28T09:54:48.5626213Z         }
2026-08-28T09:54:48.5626470Z       }
2026-08-28T09:54:48.5626717Z     },
2026-08-28T09:54:48.5626970Z     {
2026-08-28T09:54:48.5627290Z       "id": "REQ-TERM-ECHO-CLAMP-WINDOW",
2026-08-28T09:54:48.5645067Z       "title": "SEED (DAEMON-LIFECYCLE W3 rideout, field-grounded 2026-07-22): the hosted-TUI echo CLAMP WINDOW — a Windows pseudoconsole boots with echo/line input ON (in=0x1f7, measured by the 7.55 instrument @0f74bba) and it is the hosted CHILD that clamps them, so any window in which the TUI has not yet (re-)clamped echoes typed bytes into PTY output SERVER-SIDE with no seam re-enabling anything. FIELD GROUNDING (hertz capture-2 byte timeline, output-only taps): echo onset is NOT resize-instant — first echoed key lands 6003ms after the first resize-associated repaint burst, IMMEDIATELY after a 3225-byte TUI-reinitialization-shaped absolute repaint (no alt-screen/mode CSI anywhere — cursor hide/show + HOME/absolute repaints only); echo CEASES mid-input (isolated c/o/n/f/i, NO g) directly after a 535-byte TUI diff — consistent with a late clamp landing (a WinAPI mode call is invisible to a byte tap). The resize seam itself is measured MODE-PRESERVING (REQ-RESIZE-INPUT-MODE-INTEGRITY rig, four sample points). OPEN AT TRIAGE: (1) whether the clamp is the TUI's own SetConsoleMode or portable-pty/ConPTY-internal; (2) whether spt-core CAN mitigate at all — the daemon structurally cannot read or set the child console's input modes from the master side (platform fact, 7.55), so candidate mitigations are indirect (e.g. hold/queue injected input until first child output after a reinit-shaped burst — evaluate honestly, may be worse than the disease) and the honest outcome may be an OUT-OF-OUR-CODE finding filed upstream (hosted-TUI reinit behavior + Windows boot default); (3) whether the window also explains historical spt-hosted-only echo reports (non-spt sessions bypass the nested ConPTY — KH 7.55 note). Kin: KH 7.55 (hazard + instrument), KH 7.56 / the DNAR class (console boot defaults and clamp ownership = one seam family), REQ-ATTACH-SEED-REQUEST-DOUBLE-SERVE (the rideout-seed precedent). Instrument + rig to reuse: the 7.55 probe child (protocol-line verdict, raw-first precondition, seeded-echo capability probe).",
2026-08-28T09:54:48.5645677Z       "requiredStages": [],
2026-08-28T09:54:48.5645948Z       "stages": {
2026-08-28T09:54:48.5646215Z         "doc": {
2026-08-28T09:54:48.5646496Z           "complete": false,
2026-08-28T09:54:48.5646780Z           "evidence": []
2026-08-28T09:54:48.5647028Z         },
2026-08-28T09:54:48.5647299Z         "impl": {
2026-08-28T09:54:48.5647585Z           "complete": false,
2026-08-28T09:54:48.5647866Z           "evidence": []
2026-08-28T09:54:48.5648124Z         },
2026-08-28T09:54:48.5648377Z         "int": {
2026-08-28T09:54:48.5648663Z           "complete": false,
2026-08-28T09:54:48.5649034Z           "evidence": []
2026-08-28T09:54:48.5649297Z         },
2026-08-28T09:54:48.5649558Z         "unit": {
2026-08-28T09:54:48.5649842Z           "complete": false,
2026-08-28T09:54:48.5650118Z           "evidence": []
2026-08-28T09:54:48.5650375Z         }
2026-08-28T09:54:48.5650629Z       }
2026-08-28T09:54:48.5650887Z     },
2026-08-28T09:54:48.5651144Z     {
2026-08-28T09:54:48.5651554Z       "id": "REQ-TEST-DAEMON-EPHEMERAL-ADVISORY-PORTS",
2026-08-28T09:54:48.5659528Z       "title": "TEST DAEMONS ON CO-RESIDENT FLEET RUNNERS MUST BIND EPHEMERAL PORTS FOR ADVISORY SURFACES INSTEAD OF PRODUCTION WELL-KNOWN PORTS. An isolated SPT_HOME isolates disk and broker IPC, not globally-numbered TCP ports; engine-room e2e daemons therefore raced the resident fleet for docs port 5474 and intermittently logged DOCS_SERVER_BIND_FAIL os error 10048 beside unrelated precondition failures. A rig-only explicit environment posture selects port 0 for the daemon docs listener while leaving production config, SPT_DOCS_PORT semantics, and `spt docs url` unchanged. The posture wins over a configured or inherited fixed port, the actual bound ephemeral port remains loud in DOCS_SERVER_UP, and a unit holds a real occupied loopback port while proving the docs listener binds elsewhere. This is the first advisory surface; future advisory listeners reuse the same rig posture rather than minting independent test switches. (IR-62)",
2026-08-28T09:54:48.5659904Z       "requiredStages": [
2026-08-28T09:54:48.5660221Z         "impl",
2026-08-28T09:54:48.5660484Z         "unit",
2026-08-28T09:54:48.5660741Z         "int"
2026-08-28T09:54:48.5660988Z       ],
2026-08-28T09:54:48.5661255Z       "stages": {
2026-08-28T09:54:48.5661513Z         "doc": {
2026-08-28T09:54:48.5661809Z           "complete": false,
2026-08-28T09:54:48.5662086Z           "evidence": []
2026-08-28T09:54:48.5662344Z         },
2026-08-28T09:54:48.5662603Z         "impl": {
2026-08-28T09:54:48.5662892Z           "complete": true,
2026-08-28T09:54:48.5663178Z           "evidence": [
2026-08-28T09:54:48.5663488Z             {
2026-08-28T09:54:48.5663879Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:48.5664175Z               "line": 55
2026-08-28T09:54:48.5664433Z             }
2026-08-28T09:54:48.5664685Z           ]
2026-08-28T09:54:48.5664949Z         },
2026-08-28T09:54:48.5665202Z         "int": {
2026-08-28T09:54:48.5665480Z           "complete": true,
2026-08-28T09:54:48.5665747Z           "evidence": [
2026-08-28T09:54:48.5665992Z             {
2026-08-28T09:54:48.5666348Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5666620Z               "line": 78
2026-08-28T09:54:48.5666879Z             },
2026-08-28T09:54:48.5667131Z             {
2026-08-28T09:54:48.5667559Z               "path": "crates/spt/tests/engine_room_bringup_e2e.rs",
2026-08-28T09:54:48.5667830Z               "line": 155
2026-08-28T09:54:48.5668095Z             }
2026-08-28T09:54:48.5668357Z           ]
2026-08-28T09:54:48.5668610Z         },
2026-08-28T09:54:48.5668873Z         "unit": {
2026-08-28T09:54:48.5669244Z           "complete": true,
2026-08-28T09:54:48.5669521Z           "evidence": [
2026-08-28T09:54:48.5669778Z             {
2026-08-28T09:54:48.5670150Z               "path": "crates/spt-daemon/src/docshost.rs",
2026-08-28T09:54:48.5676147Z               "line": 385
2026-08-28T09:54:48.5676418Z             }
2026-08-28T09:54:48.5676776Z           ]
2026-08-28T09:54:48.5677028Z         }
2026-08-28T09:54:48.5677280Z       }
2026-08-28T09:54:48.5677534Z     },
2026-08-28T09:54:48.5677782Z     {
2026-08-28T09:54:48.5678092Z       "id": "REQ-TEST-ENV-ONE-LOCK",
2026-08-28T09:54:48.5709706Z       "title": "releases#111: a process-global environment variable is guarded by exactly ONE lock, and every test helper that mutates it takes THAT lock. THE FILED MECHANISM IS REFUTED — do not implement on it. The filing said three dispatch.rs sites go through `crate::test_home::with_home`, which writes the process-global SPT_HOME, and that a SIBLING with_home test retargets the home mid-test under threaded cargo test. That cannot happen as described: `with_home` holds its mutex across its ENTIRE body, so with_home callers are already perfectly serialized against one another. REPRODUCED AND MEASURED INSTEAD (hertz, HFENDULEAM 2026-08-02): `cargo test -p spt-daemon --lib dispatch::` loses 1-3 of 26 nondeterministically, and the panic text names the real root — `ACCESS_STORE_MINTED <tmp>\\home\\identity\\trust\\access.json`, a path with a `home` SUBDIR that `with_home` never produces (it sets SPT_HOME to the tempdir root itself). That shape is `spt_test_support::TestHome`, and the lib binary has exactly one caller of it: `dispatch::tests::the_receiver_decides_origin_and_flood_not_the_sender` (dispatch.rs:2536). TWO INDEPENDENT MUTEXES OVER ONE ENV VAR: `spt_daemon::test_home::ENV_LOCK` and `spt_test_support::ENV_LOCK` each serialized their own users flawlessly and guarded nothing between them. Because `spt_store::perch::spt_home()` is NOT memoized (re-reads env every call), a with_home test would `save()` its fixture into home A and load it back from home B — store absent, empty access baseline minted over it, and `an_unadmitted_asker_is_refused_at_this_nodes_own_seam` getting Some(offline) where the rules should have returned None. The other two losers are the same switch seen through a knock store and a byte-identity snapshot. Every loser passes ALONE (single-threaded: no concurrent holder) and 26/26 under nextest (per-test processes), which is why CI's nextest unit lane is structurally blind to it — the filing is right that this burns only whoever hand-runs the module. FIX (far smaller than the previously-ruled `*_at(home)` seam refactor, which was predicated on the refuted story): `spt_test_support` exposes its lease as `env_lock()`, and `spt_daemon::test_home::env_lock` returns THAT guard instead of declaring a second static — one variable, one lock. Explicitly NOT serial_test. Gate: unit — a with_home body holds the lease while a second thread attempts a TestHome, asserting the thread cannot enter and SPT_HOME cannot move; reds on the two-lock code, greens on one, and proceeds after release so a shared lock is proven to be a lock rather than a deadlock. NOT REENTRANT by construction — a TestHome holds the lease for its whole lifetime, so one must never be constructed inside a with_home body; the module doc says so at both ends. SWEEP, because one instance of a class is not the class: every crate declaring an SPT_HOME test helper was checked against whether the SAME binary also reaches `spt_test_support`, which is the only way the collision can form. A SECOND LIVE INSTANCE was found and fixed in the same pass — `crates/spt` carried `testutil::LOCK` while `cli.rs` (two sites) constructed `TestHome` directly, the identical two-mutex shape, latent and unreported; it now takes the shared lease too. The remaining helpers are genuinely single-per-binary and are left alone rather than pre-emptively churned: `spt-live::test_support` and `spt-store::perch`'s in-module helper (neither crate depends on spt-test-support at all), and `spt-msg`, which depends on spt-test-support but declares no helper of its own. The invariant to enforce at review is one-lock-per-variable-per-BINARY — a crate may keep its own ergonomic wrapper, but never its own mutex over a variable another helper in the same binary also writes.",
2026-08-28T09:54:48.5710403Z       "requiredStages": [
2026-08-28T09:54:48.5710660Z         "doc",
2026-08-28T09:54:48.5710936Z         "impl",
2026-08-28T09:54:48.5711193Z         "unit"
2026-08-28T09:54:48.5711451Z       ],
2026-08-28T09:54:48.5711719Z       "stages": {
2026-08-28T09:54:48.5711982Z         "doc": {
2026-08-28T09:54:48.5712273Z           "complete": true,
2026-08-28T09:54:48.5712539Z           "evidence": [
2026-08-28T09:54:48.5712799Z             {
2026-08-28T09:54:48.5713126Z               "path": "docs/KNOWN-HAZARDS.md",
2026-08-28T09:54:48.5713403Z               "line": 347
2026-08-28T09:54:48.5713708Z             }
2026-08-28T09:54:48.5713966Z           ]
2026-08-28T09:54:48.5714224Z         },
2026-08-28T09:54:48.5714491Z         "impl": {
2026-08-28T09:54:48.5714777Z           "complete": true,
2026-08-28T09:54:48.5715053Z           "evidence": [
2026-08-28T09:54:48.5715309Z             {
2026-08-28T09:54:48.5715683Z               "path": "crates/spt-daemon/src/test_home.rs",
2026-08-28T09:54:48.5715950Z               "line": 35
2026-08-28T09:54:48.5716209Z             },
2026-08-28T09:54:48.5716480Z             {
2026-08-28T09:54:48.5716842Z               "path": "crates/spt-test-support/src/lib.rs",
2026-08-28T09:54:48.5717115Z               "line": 24
2026-08-28T09:54:48.5717363Z             },
2026-08-28T09:54:48.5717615Z             {
2026-08-28T09:54:48.5717949Z               "path": "crates/spt/src/testutil.rs",
2026-08-28T09:54:48.5718220Z               "line": 43
2026-08-28T09:54:48.5718481Z             }
2026-08-28T09:54:48.5718730Z           ]
2026-08-28T09:54:48.5719073Z         },
2026-08-28T09:54:48.5719350Z         "int": {
2026-08-28T09:54:48.5719646Z           "complete": false,
2026-08-28T09:54:48.5719928Z           "evidence": []
2026-08-28T09:54:48.5720184Z         },
2026-08-28T09:54:48.5720450Z         "unit": {
2026-08-28T09:54:48.5720724Z           "complete": true,
2026-08-28T09:54:48.5720997Z           "evidence": [
2026-08-28T09:54:48.5721249Z             {
2026-08-28T09:54:48.5721635Z               "path": "crates/spt-daemon/src/test_home.rs",
2026-08-28T09:54:48.5721988Z               "line": 75
2026-08-28T09:54:48.5722241Z             }
2026-08-28T09:54:48.5722499Z           ]
2026-08-28T09:54:48.5722751Z         }
2026-08-28T09:54:48.5723008Z       }
2026-08-28T09:54:48.5723260Z     },
2026-08-28T09:54:48.5723526Z     {
2026-08-28T09:54:48.5723916Z       "id": "REQ-TEST-LIVENESS-ORACLE-AUTHENTICATED",
2026-08-28T09:54:48.5746642Z       "title": "IR-15 (INFRA-REGISTER, doyle-ruled 2026-08-03): a TEST that captures a pid and POLLS it to a verdict must poll the process it CAPTURED, never the number. `provably_gone` answers 'is *a* process at this pid', which is correct for a pid just handed over and WRONG for one captured seconds earlier: between capture and verdict the OS may recycle the number onto an unrelated process, and the bare-pid oracle then reads the stranger as the captured process, still alive, until the deadline burns. Specimen: golden 30776330383, daemon::tests::a_tree_teardown_reaches_a_grandchild_the_service_spawned sat the FULL 10s window (10.176s vs 0.19/0.24s passes) on a pid-churning Phase A leg, with a Cargo-dep-pin delta that has no mechanism path to it. THE PRODUCT PATH ALREADY AUTHENTICATES pid against birth stamp (process_identity, ADR-0047 decision 1, KNOWN-HAZARDS 7.51); the TEST oracle is the half that never got the stamp -- two death oracles in one tree and the tests poll the pid-only one. FIX: a PinnedProc identity (pid + birth stamp captured at FIND time, or handed in via from_stamp where a spawn helper or a stored pid_started_at already holds one) whose provably_gone reads Absent=>gone, Present(same stamp)=>not gone, Present(DIFFERENT stamp)=>gone (reuse: ours died), Present(_)+unstamped=>not gone (degrade to bare-pid), Unproven=>not gone. POLARITY IS LOAD-BEARING AND RULED: every uncertain arm errs toward NOT GONE, i.e. toward a red, because the two failure directions are not comparable -- a false GONE hides a real kill-tree miss behind a green gate and is unrecoverable, a false NOT-GONE is a visible recoverable flake. The pre-existing property that this oracle can only ever false-RED is therefore PRESERVED, not traded: a green from a poller built on it stays exactly as conclusive as before, which is what the same-sha-rerun authorization rests on. PLATFORM STRENGTH DIFFERS AND MUST NOT BE FLATTENED: Windows creation FILETIME is 100ns so Present(different) is decisive; Linux starttime is clock ticks since boot at 10ms granularity, so a reuse landing inside one tick reads Present(same) and errs RED (the safe direction) -- this NARROWS the window and does not close it, and Present(same) on Linux is never proof the pinned process survived. Image-path corroboration (releases#120) is the second axis that closes the remainder and composes onto the SAME pinned identity. SCOPE IS THE TEST-SIDE ORACLE: one shared helper covering the swept call sites (daemon.rs teardown test + endpoint_lifecycle.rs relay_pid, the latter not yet red), never a patch to whichever test happened to fire; product-side callers (teardown.rs root_provably_gone, servicehost.rs) stay out and belong to #120's product lane.",
2026-08-28T09:54:48.5747241Z       "requiredStages": [
2026-08-28T09:54:48.5747498Z         "impl",
2026-08-28T09:54:48.5747770Z         "unit"
2026-08-28T09:54:48.5748031Z       ],
2026-08-28T09:54:48.5748313Z       "stages": {
2026-08-28T09:54:48.5748576Z         "doc": {
2026-08-28T09:54:48.5748871Z           "complete": false,
2026-08-28T09:54:48.5749248Z           "evidence": []
2026-08-28T09:54:48.5749514Z         },
2026-08-28T09:54:48.5749782Z         "impl": {
2026-08-28T09:54:48.5750077Z           "complete": true,
2026-08-28T09:54:48.5750363Z           "evidence": [
2026-08-28T09:54:48.5750620Z             {
2026-08-28T09:54:48.5751021Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5751298Z               "line": 408
2026-08-28T09:54:48.5751569Z             },
2026-08-28T09:54:48.5751826Z             {
2026-08-28T09:54:48.5752201Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5752476Z               "line": 425
2026-08-28T09:54:48.5752805Z             },
2026-08-28T09:54:48.5753067Z             {
2026-08-28T09:54:48.5753439Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5753715Z               "line": 478
2026-08-28T09:54:48.5753973Z             }
2026-08-28T09:54:48.5754232Z           ]
2026-08-28T09:54:48.5754484Z         },
2026-08-28T09:54:48.5754746Z         "int": {
2026-08-28T09:54:48.5755022Z           "complete": false,
2026-08-28T09:54:48.5755286Z           "evidence": []
2026-08-28T09:54:48.5755535Z         },
2026-08-28T09:54:48.5755788Z         "unit": {
2026-08-28T09:54:48.5756136Z           "complete": true,
2026-08-28T09:54:48.5756407Z           "evidence": [
2026-08-28T09:54:48.5756664Z             {
2026-08-28T09:54:48.5757027Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5757313Z               "line": 591
2026-08-28T09:54:48.5757574Z             },
2026-08-28T09:54:48.5757829Z             {
2026-08-28T09:54:48.5758201Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5758468Z               "line": 601
2026-08-28T09:54:48.5758735Z             },
2026-08-28T09:54:48.5759097Z             {
2026-08-28T09:54:48.5759469Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5759741Z               "line": 616
2026-08-28T09:54:48.5759999Z             },
2026-08-28T09:54:48.5760262Z             {
2026-08-28T09:54:48.5760628Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5760899Z               "line": 631
2026-08-28T09:54:48.5761151Z             },
2026-08-28T09:54:48.5761418Z             {
2026-08-28T09:54:48.5761780Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5762048Z               "line": 647
2026-08-28T09:54:48.5762305Z             },
2026-08-28T09:54:48.5762568Z             {
2026-08-28T09:54:48.5762937Z               "path": "crates/spt-procident/src/lib.rs",
2026-08-28T09:54:48.5763270Z               "line": 668
2026-08-28T09:54:48.5763528Z             }
2026-08-28T09:54:48.5763776Z           ]
2026-08-28T09:54:48.5764037Z         }
2026-08-28T09:54:48.5764290Z       }
2026-08-28T09:54:48.5764543Z     },
2026-08-28T09:54:48.5764797Z     {
2026-08-28T09:54:48.5765168Z       "id": "REQ-TEST-RIG-DAEMON-TEARDOWN-PROVEN",
2026-08-28T09:54:48.5790853Z       "title": "releases#99: a test rig that causes a daemon to exist must stop it, and its teardown must be PROVEN to stop it rather than assumed to. Two findings make this a requirement rather than a fixup. (1) OWNERSHIP IS NOT DECLARED BY THE VERB: `api::run` calls `ensure_daemon()` before dispatching ANY subcommand (REQ-DAEMON-3), so a rig whose verbs are pure local reads still owns a real daemon tree one layer out — `psyche_download_e2e`'s own header asserted \"no daemon — it is a pure local read\" and leaked 2 `spt.exe` per run (the detached daemon plus its brain, measured against a 0 baseline) which hold `target/debug/spt.exe` open and break the next cargo build in that tree with os error 5. (2) THE TEARDOWN CAN REFUSE SILENTLY, BY TWO INDEPENDENT ROUTES. `cmd_daemon_stop` denies any caller that resolves as a hosted endpoint via `ceremony_agent_ground()`, a two-rung ladder: rung 1 is a non-empty `OWL_SESSION_ID` / `SPT_AGENT_ID` / `SPT_ENDPOINT_ID` IN THE RUNNER'S ENVIRONMENT, rung 2 is pid-ancestry against the perch records, which a fixture perch seeded with `std::process::id()` satisfies for every child of the harness. `--force` overrides neither. The rungs fire on DIFFERENT machines — rung 1 is dead on a CI runner and live whenever an agent runs the suite from its own hosted session — so a rig validated on one of them can leak on the other, and in EVERY arm the test still passes: the leak is invisible to the assertion. Gate: unit — the rig seeds pid 0, scrubs the three env markers on the commands it tears down with, runs every leg BEFORE any assertion (a panic must not skip the teardown), and keeps the authenticated breadcrumb reap as insurance BEHIND the stop rather than in place of it. Evidence discipline for any future rig of this shape: measure the surviving-process count on both arms; a green test proves nothing about the leak. Kin REQ-TEST-TMPDIR-HYGIENE (the same class one resource over), REQ-HAZARD-TEST-PID-TREE-KILL-IDENTITY (why the reap is authenticated), REQ-DAEMON-3 (the autostart that creates the ownership), REQ-BROKER-STOP-ENDPOINT-DENY (the refusal being worked around). AMENDED BAROMETER H2 (doyle ruling 2026-08-02, folding the releases#110 code remedy in here rather than onto #110): teardown completeness extends to EVERY SURVIVING DESCENDANT, not just direct children — a grandchild inherits the cwd through its parent and outlives a kill aimed one level up, which is precisely what the #110 positive control caught (an orphaned `PING.exe` still pinning a directory after its `cmd` parent was killed). The measurement discipline is unchanged and already meets the extended scope: surviving-process count on BOTH arms, by image path so a live fleet is not miscounted — the daemon's brain is itself a grandchild, so the 2 -> 0 evidence already spans the depth. SECOND CONSEQUENCE, now proven rather than theorized: a survivor does not merely hold `target/debug/spt.exe` open (os error 5 on the next build), it CWD-PINS the package root cargo handed it, leaving a `.worktrees` skeleton that cannot be renamed or deleted while files inside it stay writable — see KNOWN-HAZARDS 5.18 / REQ-HAZARD-TREE-CWD-PIN for the mechanism and for the two spawn-flag fixes refused on evidence.",
2026-08-28T09:54:48.5791497Z       "requiredStages": [
2026-08-28T09:54:48.5791764Z         "unit"
2026-08-28T09:54:48.5792032Z       ],
2026-08-28T09:54:48.5792289Z       "stages": {
2026-08-28T09:54:48.5792546Z         "doc": {
2026-08-28T09:54:48.5792826Z           "complete": false,
2026-08-28T09:54:48.5793118Z           "evidence": []
2026-08-28T09:54:48.5793371Z         },
2026-08-28T09:54:48.5793637Z         "impl": {
2026-08-28T09:54:48.5793990Z           "complete": false,
2026-08-28T09:54:48.5794281Z           "evidence": []
2026-08-28T09:54:48.5794547Z         },
2026-08-28T09:54:48.5794932Z         "int": {
2026-08-28T09:54:48.5795232Z           "complete": true,
2026-08-28T09:54:48.5795537Z           "evidence": [
2026-08-28T09:54:48.5795791Z             {
2026-08-28T09:54:48.5796209Z               "path": "crates/spt/tests/resident_service_e2e.rs",
2026-08-28T09:54:48.5796491Z               "line": 559
2026-08-28T09:54:48.5796745Z             }
2026-08-28T09:54:48.5797002Z           ]
2026-08-28T09:54:48.5797324Z         },
2026-08-28T09:54:48.5797583Z         "unit": {
2026-08-28T09:54:48.5797884Z           "complete": true,
2026-08-28T09:54:48.5798152Z           "evidence": [
2026-08-28T09:54:48.5798409Z             {
2026-08-28T09:54:48.5798819Z               "path": "crates/spt/tests/psyche_download_e2e.rs",
2026-08-28T09:54:48.5799200Z               "line": 69
2026-08-28T09:54:48.5799597Z             }
2026-08-28T09:54:48.5799929Z           ]
2026-08-28T09:54:48.5800188Z         }
2026-08-28T09:54:48.5800441Z       }
2026-08-28T09:54:48.5800700Z     },
2026-08-28T09:54:48.5800943Z     {
2026-08-28T09:54:48.5801267Z       "id": "REQ-TEST-TMPDIR-HYGIENE",
2026-08-28T09:54:48.5821261Z       "title": "Windows test fixtures MUST NOT leak their temp dirs — find and fix the leak that accumulated 14,319 `.tmp*` dirs (163 GB) in %TEMP% on hfenduleam over 2026-07-19→26 and ate the box to 0.00 GB free during the v0.44.0 cut (find credit: deployah). The class presents as resource exhaustion wearing a timing-flake mask: the release-blocking red was spt-daemon::sync `two_tier_sync_lands_and_gate_refuses_server_side` dying 'No space left on device' INSIDE its own leaked-class tmpdir, and the PRIOR red (digest_cross_node brain-IPC deadline elapse) was the SAME root through a timing probe — burns release windows and invites false environmental discharges (deployah self-corrected his own). ROOT IS UNPROVEN AT MINT (investigate, don't assume): tempfile-crate dirs self-clean on Drop, so something defeats Drop — candidates from the incident record: process killed mid-drop (fixture children force-killed while owning the dir), detached/leaked children pinning the dir cwd so removal fails, panic paths that never unwind. CANDIDATE ROOT PROMOTED TO PROVEN (hertz, doyle ruling 2026-08-02, releases#110 measurement): the cwd-pin leg is no longer a hypothesis. Positive control on HFENDULEAM — spawn a child with cwd = a scratch dir, then attempt removal: writes INSIDE the dir succeed while delete is BLOCKED (the asymmetry that makes it read as neither a file lock nor a rig failure), and the dir deletes first try the instant the holder dies. The holder in that control was an orphaned GRANDCHILD (`PING.exe`, cwd inherited through `cmd`) that survived its parent's kill, so the defeating mechanism reaches deeper than the direct children this entry names. Corollary that changes where to look: the conhost is NOT the holder (its cwd is OS-assigned — a box-wide census returned 43 readable conhosts, all under `C:\\WINDOWS`, zero under any tree), so a leaked-tmpdir investigation that clears conhosts and declares the path clean has proven nothing. Mechanism and tooling: KNOWN-HAZARDS 5.18 / REQ-HAZARD-TREE-CWD-PIN plus `.github/ci/find-cwd-holders.ps1`, which names the holder of any given directory. Deliverable: name the leaking fixture path(s) with evidence, fix the cleanup (guard/finalizer that survives the kill path, or a fixture-scoped reaper), and prove it with a before/after dir-count on the suite. Second recorded hfenduleam disk-full-CI instance.",
2026-08-28T09:54:48.5821829Z       "requiredStages": [
2026-08-28T09:54:48.5822096Z         "impl",
2026-08-28T09:54:48.5822363Z         "unit"
2026-08-28T09:54:48.5822616Z       ],
2026-08-28T09:54:48.5822873Z       "stages": {
2026-08-28T09:54:48.5823130Z         "doc": {
2026-08-28T09:54:48.5823411Z           "complete": false,
2026-08-28T09:54:48.5823689Z           "evidence": []
2026-08-28T09:54:48.5823945Z         },
2026-08-28T09:54:48.5824269Z         "impl": {
2026-08-28T09:54:48.5824556Z           "complete": true,
2026-08-28T09:54:48.5824827Z           "evidence": [
2026-08-28T09:54:48.5825080Z             {
2026-08-28T09:54:48.5825466Z               "path": "crates/spt-test-support/src/lib.rs",
2026-08-28T09:54:48.5825738Z               "line": 45
2026-08-28T09:54:48.5825995Z             }
2026-08-28T09:54:48.5826242Z           ]
2026-08-28T09:54:48.5826493Z         },
2026-08-28T09:54:48.5826750Z         "int": {
2026-08-28T09:54:48.5827016Z           "complete": true,
2026-08-28T09:54:48.5827341Z           "evidence": [
2026-08-28T09:54:48.5827595Z             {
2026-08-28T09:54:48.5827956Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5828213Z               "line": 332
2026-08-28T09:54:48.5828477Z             },
2026-08-28T09:54:48.5828735Z             {
2026-08-28T09:54:48.5829170Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5829446Z               "line": 665
2026-08-28T09:54:48.5829699Z             },
2026-08-28T09:54:48.5829960Z             {
2026-08-28T09:54:48.5830304Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5830580Z               "line": 780
2026-08-28T09:54:48.5830828Z             },
2026-08-28T09:54:48.5831095Z             {
2026-08-28T09:54:48.5831448Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5831717Z               "line": 856
2026-08-28T09:54:48.5831979Z             },
2026-08-28T09:54:48.5832231Z             {
2026-08-28T09:54:48.5832571Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5832842Z               "line": 917
2026-08-28T09:54:48.5833104Z             },
2026-08-28T09:54:48.5833357Z             {
2026-08-28T09:54:48.5833700Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5833981Z               "line": 984
2026-08-28T09:54:48.5834235Z             },
2026-08-28T09:54:48.5834496Z             {
2026-08-28T09:54:48.5834844Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5835202Z               "line": 1025
2026-08-28T09:54:48.5835455Z             },
2026-08-28T09:54:48.5835711Z             {
2026-08-28T09:54:48.5836055Z               "path": ".github/workflows/golden.yml",
2026-08-28T09:54:48.5836317Z               "line": 1091
2026-08-28T09:54:48.5836574Z             }
2026-08-28T09:54:48.5836830Z           ]
2026-08-28T09:54:48.5837086Z         },
2026-08-28T09:54:48.5837348Z         "unit": {
2026-08-28T09:54:48.5837634Z           "complete": true,
2026-08-28T09:54:48.5837905Z           "evidence": [
2026-08-28T09:54:48.5838159Z             {
2026-08-28T09:54:48.5838598Z               "path": "crates/spt-test-support/src/lib.rs",
2026-08-28T09:54:48.5838869Z               "line": 95
2026-08-28T09:54:48.5839218Z             }
2026-08-28T09:54:48.5839464Z           ]
2026-08-28T09:54:48.5839730Z         }
2026-08-28T09:54:48.5839983Z       }
2026-08-28T09:54:48.5840240Z     },
2026-08-28T09:54:48.5840496Z     {
2026-08-28T09:54:48.5840869Z       "id": "REQ-TRANSLATE-BINARY-LIVENESS-DECAY",
2026-08-28T09:54:48.5847804Z       "title": "SUPERSEDED by REQ-TRANSLATE-COMMIT-MISS-TOLERANCE (F029 C-1). B6 (F028, perri F-e) was ROOT-PINNED as the commit-deadline-miss fault: at a checkpoint clear boundary the clear-only inject's {commit} was never observed within INJECT_COMMIT_DEADLINE, so the inject worker FAULTED + TERMINATED a HEALTHY translate binary and (by ADR-0022) never respawned → every subsequent force-native reported delivered=false ('no live translation binary'). NOT a dormancy/liveness-registration decay (that hypothesis is dead) — deterministic at every checkpoint-armed boundary. The fix (miss != fault + N=3 strike budget + bounded respawn + perch-visible fault stamp) lives under REQ-TRANSLATE-COMMIT-MISS-TOLERANCE + REQ-HAZARD-TRANSLATE-FAULT-PERMANENT-DEATH. See triage addendum C-1.",
2026-08-28T09:54:48.5848123Z       "requiredStages": [],
2026-08-28T09:54:48.5848400Z       "stages": {
2026-08-28T09:54:48.5848738Z         "doc": {
2026-08-28T09:54:48.5849133Z           "complete": false,
2026-08-28T09:54:48.5849420Z           "evidence": []
2026-08-28T09:54:48.5849677Z         },
2026-08-28T09:54:48.5849945Z         "impl": {
2026-08-28T09:54:48.5850225Z           "complete": false,
2026-08-28T09:54:48.5850513Z           "evidence": []
2026-08-28T09:54:48.5850766Z         },
2026-08-28T09:54:48.5851028Z         "int": {
2026-08-28T09:54:48.5851310Z           "complete": false,
2026-08-28T09:54:48.5851576Z           "evidence": []
2026-08-28T09:54:48.5851835Z         },
2026-08-28T09:54:48.5852150Z         "unit": {
2026-08-28T09:54:48.5852436Z           "complete": false,
2026-08-28T09:54:48.5852706Z           "evidence": []
2026-08-28T09:54:48.5852961Z         }
2026-08-28T09:54:48.5853213Z       }
2026-08-28T09:54:48.5853471Z     },
2026-08-28T09:54:48.5853715Z     {
2026-08-28T09:54:48.5854030Z       "id": "REQ-TRANSLATE-COMMAND",
2026-08-28T09:54:48.5863946Z       "title": "`[message-idle-translation-binary]` accepts a `command` (opaque; args + ADAPTER-STATIC {adapter_dir}/{adapter_name} substitution ONLY — ratified v0.16.0 W1, NOT session {key}: the translation binary is a persistent process serving all sessions on the endpoint (session/event ctx arrives per-message via the stdin Init/Event protocol, never the spawn argv) and the live-update respawn site has no session ctx (a {id}-bearing command would MissingKey→spool); program token resolved against install_dir like [digest].extractor/[session.psyche_init]) in addition to the bare `path`. `path` is DEPRECATED — keeps parsing (manifest forward/back-compat) but emits a registration warning steering to command. Exactly one of {path, command} (both-set refused at registration; neither = no translation binary). The spawn lifecycle + stdin/stdout JSON-lines protocol (Init/Event/Input → key/text/delay_ms/commit) are UNCHANGED — command alters only how the executable+args are located/launched (read_translation_path → read_translation_command). Unblocks folding `claude-spt translate` into the one consolidated binary (downstream ADR-0006). (v0.16.0)",
2026-08-28T09:54:48.5864469Z       "requiredStages": [
2026-08-28T09:54:48.5864728Z         "doc",
2026-08-28T09:54:48.5864990Z         "impl",
2026-08-28T09:54:48.5865248Z         "unit"
2026-08-28T09:54:48.5865501Z       ],
2026-08-28T09:54:48.5865757Z       "stages": {
2026-08-28T09:54:48.5866028Z         "doc": {
2026-08-28T09:54:48.5866315Z           "complete": true,
2026-08-28T09:54:48.5866591Z           "evidence": [
2026-08-28T09:54:48.5866849Z             {
2026-08-28T09:54:48.5867169Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:48.5867445Z               "line": 388
2026-08-28T09:54:48.5867760Z             },
2026-08-28T09:54:48.5868017Z             {
2026-08-28T09:54:48.5868552Z               "path": "docs/adr/0029-adapter-update-arc-resolve-not-execute.md",
2026-08-28T09:54:48.5868825Z               "line": 3
2026-08-28T09:54:48.5869168Z             }
2026-08-28T09:54:48.5869420Z           ]
2026-08-28T09:54:48.5869688Z         },
2026-08-28T09:54:48.5869949Z         "impl": {
2026-08-28T09:54:48.5870245Z           "complete": true,
2026-08-28T09:54:48.5870517Z           "evidence": [
2026-08-28T09:54:48.5870778Z             {
2026-08-28T09:54:48.5871145Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5871433Z               "line": 4489
2026-08-28T09:54:48.5871692Z             },
2026-08-28T09:54:48.5871949Z             {
2026-08-28T09:54:48.5872349Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.5872626Z               "line": 181
2026-08-28T09:54:48.5872879Z             },
2026-08-28T09:54:48.5873135Z             {
2026-08-28T09:54:48.5873528Z               "path": "crates/spt-daemon/src/translation.rs",
2026-08-28T09:54:48.5873802Z               "line": 243
2026-08-28T09:54:48.5874057Z             },
2026-08-28T09:54:48.5874315Z             {
2026-08-28T09:54:48.5874696Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.5875039Z               "line": 596
2026-08-28T09:54:48.5875298Z             },
2026-08-28T09:54:48.5875560Z             {
2026-08-28T09:54:48.5875936Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.5876217Z               "line": 604
2026-08-28T09:54:48.5876476Z             },
2026-08-28T09:54:48.5876746Z             {
2026-08-28T09:54:48.5877114Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.5877390Z               "line": 1261
2026-08-28T09:54:48.5877642Z             },
2026-08-28T09:54:48.5877966Z             {
2026-08-28T09:54:48.5878330Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:48.5878610Z               "line": 336
2026-08-28T09:54:48.5878862Z             },
2026-08-28T09:54:48.5879203Z             {
2026-08-28T09:54:48.5879575Z               "path": "crates/spt-runtime/src/runtime.rs",
2026-08-28T09:54:48.5879846Z               "line": 537
2026-08-28T09:54:48.5880108Z             },
2026-08-28T09:54:48.5880366Z             {
2026-08-28T09:54:48.5880695Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5880967Z               "line": 22172
2026-08-28T09:54:48.5881226Z             }
2026-08-28T09:54:48.5881478Z           ]
2026-08-28T09:54:48.5881738Z         },
2026-08-28T09:54:48.5881998Z         "int": {
2026-08-28T09:54:48.5882304Z           "complete": false,
2026-08-28T09:54:48.5882580Z           "evidence": []
2026-08-28T09:54:48.5882834Z         },
2026-08-28T09:54:48.5883100Z         "unit": {
2026-08-28T09:54:48.5883371Z           "complete": true,
2026-08-28T09:54:48.5883653Z           "evidence": [
2026-08-28T09:54:48.5883910Z             {
2026-08-28T09:54:48.5884281Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5884560Z               "line": 12527
2026-08-28T09:54:48.5884814Z             },
2026-08-28T09:54:48.5885066Z             {
2026-08-28T09:54:48.5885457Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.5885739Z               "line": 536
2026-08-28T09:54:48.5886091Z             },
2026-08-28T09:54:48.5886354Z             {
2026-08-28T09:54:48.5886744Z               "path": "crates/spt-daemon/src/harnesshost.rs",
2026-08-28T09:54:48.5887017Z               "line": 608
2026-08-28T09:54:48.5887282Z             },
2026-08-28T09:54:48.5887534Z             {
2026-08-28T09:54:48.5887907Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.5888178Z               "line": 1885
2026-08-28T09:54:48.5888436Z             }
2026-08-28T09:54:48.5888688Z           ]
2026-08-28T09:54:48.5889036Z         }
2026-08-28T09:54:48.5889295Z       }
2026-08-28T09:54:48.5889603Z     },
2026-08-28T09:54:48.5889863Z     {
2026-08-28T09:54:48.5890235Z       "id": "REQ-TRANSLATE-COMMIT-MISS-TOLERANCE",
2026-08-28T09:54:48.5898877Z       "title": "C-1 (F029, B6 ROOT — rescope of REQ-TRANSLATE-BINARY-LIVENESS-DECAY, now PINNED): at a checkpoint clear boundary the clear-only inject drives `/clear`; its `{commit}` is never observed within INJECT_COMMIT_DEADLINE (5s, broker.rs:158) so the inject worker FAULTS + TERMINATES a HEALTHY translate binary (broker.rs respool_and_fault + return) and by ADR-0022 design NEVER respawns → every subsequent force-native reports delivered=false ('no live translation binary', cli.rs:5046) = B6's exact field signature; the v0.12.0 checkpoint post-clear WAKE dies with the terminated binary + the fire-and-forget FIRE in the dead window. NOT a race — deterministic at every checkpoint-armed boundary (perri captured-stderr proof: TRANSLATION_FAULT on the F-019 unread daemon-stderr channel). FIX (REVISED, supersedes terminate-then-respawn): miss != fault — preserve the binary; the watchdog's job is ANTI-STALL (release the operator floor), not execution-verification. See addendum C-1 + ADR-0022 amendment.",
2026-08-28T09:54:48.5899320Z       "requiredStages": [
2026-08-28T09:54:48.5899578Z         "impl",
2026-08-28T09:54:48.5899841Z         "unit",
2026-08-28T09:54:48.5900163Z         "int"
2026-08-28T09:54:48.5900414Z       ],
2026-08-28T09:54:48.5900699Z       "stages": {
2026-08-28T09:54:48.5900952Z         "doc": {
2026-08-28T09:54:48.5901243Z           "complete": true,
2026-08-28T09:54:48.5901511Z           "evidence": [
2026-08-28T09:54:48.5901768Z             {
2026-08-28T09:54:48.5902351Z               "path": "docs/adr/0022-spt-hosted-idle-delivery-translation-binary.md",
2026-08-28T09:54:48.5902622Z               "line": 154
2026-08-28T09:54:48.5902878Z             }
2026-08-28T09:54:48.5903137Z           ]
2026-08-28T09:54:48.5903401Z         },
2026-08-28T09:54:48.5903725Z         "impl": {
2026-08-28T09:54:48.5904054Z           "complete": true,
2026-08-28T09:54:48.5904492Z           "evidence": [
2026-08-28T09:54:48.5904749Z             {
2026-08-28T09:54:48.5905102Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5905378Z               "line": 4737
2026-08-28T09:54:48.5905639Z             },
2026-08-28T09:54:48.5905891Z             {
2026-08-28T09:54:48.5906263Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5906539Z               "line": 4962
2026-08-28T09:54:48.5906802Z             }
2026-08-28T09:54:48.5907058Z           ]
2026-08-28T09:54:48.5907321Z         },
2026-08-28T09:54:48.5907679Z         "int": {
2026-08-28T09:54:48.5907969Z           "complete": true,
2026-08-28T09:54:48.5908264Z           "evidence": [
2026-08-28T09:54:48.5908508Z             {
2026-08-28T09:54:48.5909037Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:48.5909323Z               "line": 1815
2026-08-28T09:54:48.5909594Z             },
2026-08-28T09:54:48.5909847Z             {
2026-08-28T09:54:48.5910296Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:48.5910566Z               "line": 1931
2026-08-28T09:54:48.5910826Z             }
2026-08-28T09:54:48.5911080Z           ]
2026-08-28T09:54:48.5911342Z         },
2026-08-28T09:54:48.5911618Z         "unit": {
2026-08-28T09:54:48.5911899Z           "complete": true,
2026-08-28T09:54:48.5912257Z           "evidence": [
2026-08-28T09:54:48.5912514Z             {
2026-08-28T09:54:48.5912883Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5913163Z               "line": 11344
2026-08-28T09:54:48.5913433Z             },
2026-08-28T09:54:48.5913689Z             {
2026-08-28T09:54:48.5914055Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.5914337Z               "line": 11367
2026-08-28T09:54:48.5914604Z             }
2026-08-28T09:54:48.5914872Z           ]
2026-08-28T09:54:48.5915120Z         }
2026-08-28T09:54:48.5915425Z       }
2026-08-28T09:54:48.5915677Z     },
2026-08-28T09:54:48.5915929Z     {
2026-08-28T09:54:48.5916227Z       "id": "REQ-TRUST-WARNING",
2026-08-28T09:54:48.5959177Z       "title": "When a message reaches an endpoint because an access ENTRY admitted its sender, and the receiving agent holds NO MONIC about that sender, the delivery edge composes a system-authored TRUST WARNING and delivers it alongside the message. The entry is a routing decision — often made by a human at a knock, sometimes weeks earlier — and it says the peer may speak; it says nothing about whether the receiving agent has decided anything ABOUT them, and the warning is what closes that gap before the agent acts. THE CLASSIFICATION QUESTION IS MONIC-ONLY: an access entry naming the peer is NOT a classification, since the entry is the very thing that let them in, and reading it as evidence of judgement would silence the warning exactly when it is warranted. THREE RATIFIED NON-WARNING CASES, stated because a warning that fires on invited traffic teaches agents to ignore warnings, which costs it its only job: SAME-NODE arrivals are inside the node's own trust unit; a REPLY is correlated to the agent's own outbound, so it is traffic the agent itself invited; and a POSTURE-OPEN pass admits nobody in particular — no entry named this peer, the endpoint simply is not refusing anyone. A WILDCARD entry warns exactly as a named one does: it admitted a peer the agent never named at all. THE WARNING NEVER CHANGES DELIVERY. The gate already allowed the message; the warning is advisory text that rides alongside, is skipped for a duplicate (the replay check precedes it, so a retried message does not re-warn), and — when it cannot be delivered at all — costs a loud diagnostic naming the unwarned delivery rather than withholding a message the gate permitted. IT IS NEVER PART OF THE PEER'S BODY, because a warning inside the body is indistinguishable from one the sender wrote — precisely what a stranger would forge. THE CARRIER IS THE DELIVERED MESSAGE'S OWN ENVELOPE (REQ-TRUST-WARNING-ENVELOPE, which changed the carrier and left this rule untouched): the block rides as a `trust-warning` attribute composed by the RECEIVING node, so the caution and the message it is about reach the agent in ONE arrival, and the sender authors the text in neither design — an attribute is not the body, and it is composed exactly where a matched monic's is. Where the body is ALREADY A TYPED ENVELOPE it can carry no attribute, and there the warning keeps its own system-authored delivery under a RESERVED author id (not a legal endpoint id, so no peer can author under it), delivered FIRST over the same cascade the message takes, so the caution is read before the message it is about. THE DECISION CONSUMES THE GATE'S OWN VERDICT AND NOTHING ELSE: the pass reason IS the posture question (an entry matched means the chain never reached a mode tier), so there is no second read of the access store, whose snapshot would be taken after the decision it purports to explain. The receiver's own mind is read as a PLAIN FILE off the tracked root, never through the store's ensure-worktree path, because that path spawns git and this question is asked on the inbound message path. An unreadable monic is not a classification, so a husk makes the warning fire rather than suppressing it. TWO LIMITS, RULED (doyle 2026-07-31, at T6's acceptance): (1) a sender the daemon could not prove IS still warned about, and that warning is UNSUPPRESSIBLE by design rather than merely fail-safe — a peer nobody can name is more of a stranger, not less — since monic-only classification means no provable id yields no monic, so every unproven sender on an entry-admitted pass warns, which is honest — they ARE unproven — and self-heals as the fleet's daemons come to stamp their senders. THE TEXT DISCIPLINE IS THE LIMIT THAT KEEPS WARN-MORE FROM BECOMING WARN-NOISE, and is required, not stylistic: the block names the admitting RULE as the way out and NEVER prints a classify command that cannot be run, because an instruction the reader cannot carry out is what turns an unsuppressible warning into noise the agent learns to skip; (2) the override text (the elevation-gated verb, own requirement) replaces ONLY the advisory paragraph — RATIFIED at the same acceptance, on the grounding that override text is agent-behavior instruction and therefore a prompt-injection surface, so keeping the factual spine unforgeable BOUNDS that surface: a whole-block override would let one elevated write hide who is knocking, which no legitimate override needs — the line naming the sender and stating that no note is held, and the line saying how to classify them, are always core-composed, so an override can change what the agent is cautioned about but never hide who is knocking. Gate: impl — the pure warn-or-not decision over the verdict's pass reason and the monic predicate, the store-free tracked-root read, the composer with its reserved author, and the delivery-alongside at the WAN edge ahead of the message legs; unit — the full table (every pass reason x monic-held/not, with the three non-warning reasons asserted by name and the wildcard case asserted to warn), the composer naming the peer, the three cautions and the exact classify command, the override replacing the advisory while identity survives, the unnamed-sender text carrying no unrunnable command, and the tracked-root read answering identically to the store form while creating no worktree for an agent that has no mind.",
2026-08-28T09:54:48.5959975Z       "requiredStages": [
2026-08-28T09:54:48.5960232Z         "doc",
2026-08-28T09:54:48.5960493Z         "impl",
2026-08-28T09:54:48.5960746Z         "unit"
2026-08-28T09:54:48.5961008Z       ],
2026-08-28T09:54:48.5961266Z       "stages": {
2026-08-28T09:54:48.5961523Z         "doc": {
2026-08-28T09:54:48.5961808Z           "complete": true,
2026-08-28T09:54:48.5962089Z           "evidence": [
2026-08-28T09:54:48.5962348Z             {
2026-08-28T09:54:48.5962691Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.5962962Z               "line": 957
2026-08-28T09:54:48.5963226Z             },
2026-08-28T09:54:48.5963486Z             {
2026-08-28T09:54:48.5963866Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:48.5964138Z               "line": 168
2026-08-28T09:54:48.5964390Z             }
2026-08-28T09:54:48.5964651Z           ]
2026-08-28T09:54:48.5964914Z         },
2026-08-28T09:54:48.5965171Z         "impl": {
2026-08-28T09:54:48.5965449Z           "complete": true,
2026-08-28T09:54:48.5965735Z           "evidence": [
2026-08-28T09:54:48.5966002Z             {
2026-08-28T09:54:48.5966368Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:48.5966642Z               "line": 136
2026-08-28T09:54:48.5966899Z             },
2026-08-28T09:54:48.5967161Z             {
2026-08-28T09:54:48.5967504Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.5967772Z               "line": 744
2026-08-28T09:54:48.5968034Z             },
2026-08-28T09:54:48.5968283Z             {
2026-08-28T09:54:48.5968631Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.5968896Z               "line": 806
2026-08-28T09:54:48.5969237Z             },
2026-08-28T09:54:48.5969495Z             {
2026-08-28T09:54:48.5969843Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.5970114Z               "line": 864
2026-08-28T09:54:48.5970371Z             },
2026-08-28T09:54:48.5970706Z             {
2026-08-28T09:54:48.5971049Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.5971326Z               "line": 994
2026-08-28T09:54:48.5971587Z             },
2026-08-28T09:54:48.5971850Z             {
2026-08-28T09:54:48.5972193Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:48.5972465Z               "line": 682
2026-08-28T09:54:48.5972737Z             },
2026-08-28T09:54:48.5972988Z             {
2026-08-28T09:54:48.5973367Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.5973637Z               "line": 43
2026-08-28T09:54:48.5973955Z             },
2026-08-28T09:54:48.5974210Z             {
2026-08-28T09:54:48.5974592Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.5974868Z               "line": 238
2026-08-28T09:54:48.5975117Z             }
2026-08-28T09:54:48.5975384Z           ]
2026-08-28T09:54:48.5975632Z         },
2026-08-28T09:54:48.5975894Z         "int": {
2026-08-28T09:54:48.5976180Z           "complete": false,
2026-08-28T09:54:48.5976466Z           "evidence": []
2026-08-28T09:54:48.5976713Z         },
2026-08-28T09:54:48.5976979Z         "unit": {
2026-08-28T09:54:48.5977274Z           "complete": true,
2026-08-28T09:54:48.5977546Z           "evidence": [
2026-08-28T09:54:48.5977807Z             {
2026-08-28T09:54:48.5978180Z               "path": "crates/spt-daemon/src/access.rs",
2026-08-28T09:54:48.5978461Z               "line": 284
2026-08-28T09:54:48.5978713Z             },
2026-08-28T09:54:48.5979042Z             {
2026-08-28T09:54:48.5979384Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:48.5979668Z               "line": 1625
2026-08-28T09:54:48.5979926Z             },
2026-08-28T09:54:48.5980184Z             {
2026-08-28T09:54:48.5980532Z               "path": "crates/spt-store/src/monic.rs",
2026-08-28T09:54:48.5980803Z               "line": 1686
2026-08-28T09:54:48.5981137Z             },
2026-08-28T09:54:48.5981391Z             {
2026-08-28T09:54:48.5981762Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.5982040Z               "line": 368
2026-08-28T09:54:48.5982295Z             },
2026-08-28T09:54:48.5982561Z             {
2026-08-28T09:54:48.5982929Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.5983205Z               "line": 419
2026-08-28T09:54:48.5983458Z             },
2026-08-28T09:54:48.5983720Z             {
2026-08-28T09:54:48.5984087Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.5984439Z               "line": 549
2026-08-28T09:54:48.5984695Z             },
2026-08-28T09:54:48.5984948Z             {
2026-08-28T09:54:48.5985263Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.5985535Z               "line": 30598
2026-08-28T09:54:48.5985796Z             }
2026-08-28T09:54:48.5986049Z           ]
2026-08-28T09:54:48.5986311Z         }
2026-08-28T09:54:48.5986569Z       }
2026-08-28T09:54:48.5986832Z     },
2026-08-28T09:54:48.5987084Z     {
2026-08-28T09:54:48.5987416Z       "id": "REQ-TRUST-WARNING-CADENCE",
2026-08-28T09:54:48.6031964Z       "title": "The trust warning surfaces ONCE PER SESSION PER PEER, not once per message. THE CONDITION AND THE CADENCE ARE DIFFERENT QUESTIONS and this requirement exists because the first was ratified without the second: REQ-TRUST-WARNING settled WHEN a warning is owed (an entry admitted the sender and the receiver holds no monic) and never said HOW OFTEN, so the shipped edge composed one per admitted message. The dedup already named there is REPLAY dedup — a retried op-id is not re-delivered — which is a different question wearing similar words, and reading it as repetition coverage is what let the gap ship. A 665-byte block ahead of every message from one admitted stranger is a warning an agent learns to skip, which costs it the only job it has. THE DEDUP KEY IS (BOUND SESSION ID, PEER). The session id is the harness session BOUND TO THE RECEIVING PERCH, read from the perch record the delivery edge already holds a path to — one derivation serving both the live case and the offline-spool burst, so a hundred messages spooled while an agent was away surface ONE warning when it returns rather than a hundred. State lives in the node-local per-session scratch dir, one marker file per peer, which is the seam that already re-arms once-per-session state by construction: a `/clear` mints a new session id, hence a fresh dir, hence a re-armed warning. It is per-peer BY FILE and not a single seen-set file, deliberately — the seen-set's read-modify-write lost-update race was acceptable for keyword hints only because that writer is serialized per session, an assumption the WAN inbound path does not share. FOUR PROPERTIES, ALL FAILING TOWARD THE WARNING, stated because each is a place a later reader would 'fix' the caution away: (a) AN UNREADABLE MARKER AND AN ABSENT MARKER BOTH MEAN WARN, and this is CORRECT AND LOAD-BEARING rather than an oversight — it is the husk-reads-as-default shape, named here so a future fixer who reaches for a tidier read finds this sentence at the line they were about to change; a damaged dedup store costs a duplicate warning, never a silent one. (b) TWO MESSAGES FROM ONE PEER ARRIVING CONCURRENTLY MAY BOTH WARN — the check and the claim are not atomic across processes, and that is an ACCEPTED LIMIT, not a defect to close: the failure is a second warning, which is benign and direction-correct, and closing it would mean a lock on the inbound message path to save one duplicated advisory. (c) A MARKER WRITE FAILURE ALSO WARNS: the claim is best-effort, and an edge that could not record 'already warned' must behave as though it never warned. (d) TWO UNNAMED SENDERS ON ONE NODE SHARE ONE MARKER, because the origin node is the only identity there is to key an unprovable sender on — an ACCEPTED LIMIT that is the truth about what the daemon can name, not a collision to repair; a named peer and an unnamed one are never folded together, since the two arms carry distinct marker prefixes and neither class's marker can quiet the other. (e) NO BOUND SESSION RECORD MEANS NO KEY, AND NO KEY MEANS WARN EVERY MESSAGE — correct and rare, and the honest reading of a receiver whose session cannot be named. THE CLAIM IS MADE ONLY AFTER THE WARNING IS ACTUALLY DELIVERED, so the cadence can never eat the one warning a session gets: if every delivery leg fails (the loud undelivered diagnostic), nothing is claimed and the next message warns again — a marker on disk must never assert a caution that no agent ever read. THE CADENCE APPLIES UNIFORMLY, INCLUDING TO SENDERS THE DAEMON COULD NOT PROVE, and this does not loosen the unsuppressible-warning limit ratified in REQ-TRUST-WARNING: that limit is about CLASSIFICATION — no provable id yields no monic, so the monic path can never silence an unnamed peer — and a cadence is not a classification and silences nothing, since the caution still reaches the agent in every session and re-arms with each new one. Exempting unnamed senders would aim the exemption at the one class no monic can ever quiet, preserving the per-message flood exactly where it is unbounded. An unnamed peer's key is NODE-SCOPED because the origin node is the only identity there is to key on, so two unnamed senders on one node share one marker — that is what the daemon can honestly name, not a collision to repair. THE PEER COMPONENT OF THE PATH IS VALIDATED BEFORE IT IS JOINED, on the precedent the override store already sets, because the proven-sender id arrives off the wire: an id that fails validation yields no marker and therefore warns. THE OVERRIDE SEMANTICS ARE UNTOUCHED — cadence decides whether a block is composed at all, never what it says. Gate: impl — the per-peer marker claim over the per-session scratch dir with its validated peer component, the bound-session read at the delivery edge, and the claim-after-delivery wiring at the one surfacing site; unit — a second admitted message from the same peer in the same session composes no second warning, a new session warns again, per-peer isolation (a warning about A leaves B's first warning owed), a spooled burst of N messages from one peer yields ONE warning, an absent perch record warns every message, a marker write failure still warns, an unreadable marker still warns, an invalid peer component claims nothing and warns, two messages from UNNAMED senders on one node in one session yield one warning while a new session re-warns, a named peer and an unnamed sender on the same node neither quiet each other, and an undelivered warning (every delivery leg failed, the loud diagnostic printed) leaves the marker unclaimed so the next message warns again.",
2026-08-28T09:54:48.6114722Z       "requiredStages": [
2026-08-28T09:54:48.6115036Z         "doc",
2026-08-28T09:54:48.6115332Z         "impl",
2026-08-28T09:54:48.6115637Z         "unit"
2026-08-28T09:54:48.6115943Z       ],
2026-08-28T09:54:48.6116267Z       "stages": {
2026-08-28T09:54:48.6116576Z         "doc": {
2026-08-28T09:54:48.6116922Z           "complete": true,
2026-08-28T09:54:48.6117255Z           "evidence": [
2026-08-28T09:54:48.6117565Z             {
2026-08-28T09:54:48.6117913Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6118228Z               "line": 961
2026-08-28T09:54:48.6118538Z             },
2026-08-28T09:54:48.6118834Z             {
2026-08-28T09:54:48.6119387Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:48.6119716Z               "line": 296
2026-08-28T09:54:48.6120025Z             }
2026-08-28T09:54:48.6120330Z           ]
2026-08-28T09:54:48.6120584Z         },
2026-08-28T09:54:48.6120845Z         "impl": {
2026-08-28T09:54:48.6121126Z           "complete": true,
2026-08-28T09:54:48.6121398Z           "evidence": [
2026-08-28T09:54:48.6121650Z             {
2026-08-28T09:54:48.6122001Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6122268Z               "line": 146
2026-08-28T09:54:48.6122530Z             },
2026-08-28T09:54:48.6122859Z             {
2026-08-28T09:54:48.6123202Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6123484Z               "line": 776
2026-08-28T09:54:48.6123736Z             },
2026-08-28T09:54:48.6123993Z             {
2026-08-28T09:54:48.6124327Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6124603Z               "line": 853
2026-08-28T09:54:48.6124854Z             },
2026-08-28T09:54:48.6125107Z             {
2026-08-28T09:54:48.6125445Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6125712Z               "line": 865
2026-08-28T09:54:48.6126022Z             },
2026-08-28T09:54:48.6126279Z             {
2026-08-28T09:54:48.6126633Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6126899Z               "line": 1025
2026-08-28T09:54:48.6127155Z             },
2026-08-28T09:54:48.6127407Z             {
2026-08-28T09:54:48.6127777Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6128045Z               "line": 319
2026-08-28T09:54:48.6128294Z             },
2026-08-28T09:54:48.6128551Z             {
2026-08-28T09:54:48.6128918Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6129285Z               "line": 340
2026-08-28T09:54:48.6129538Z             },
2026-08-28T09:54:48.6129834Z             {
2026-08-28T09:54:48.6130214Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6130475Z               "line": 353
2026-08-28T09:54:48.6130737Z             },
2026-08-28T09:54:48.6130995Z             {
2026-08-28T09:54:48.6131372Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6131643Z               "line": 359
2026-08-28T09:54:48.6131910Z             }
2026-08-28T09:54:48.6132164Z           ]
2026-08-28T09:54:48.6132420Z         },
2026-08-28T09:54:48.6132679Z         "int": {
2026-08-28T09:54:48.6132965Z           "complete": false,
2026-08-28T09:54:48.6133242Z           "evidence": []
2026-08-28T09:54:48.6133500Z         },
2026-08-28T09:54:48.6133767Z         "unit": {
2026-08-28T09:54:48.6134125Z           "complete": true,
2026-08-28T09:54:48.6134406Z           "evidence": [
2026-08-28T09:54:48.6134655Z             {
2026-08-28T09:54:48.6135012Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6135287Z               "line": 1142
2026-08-28T09:54:48.6135542Z             },
2026-08-28T09:54:48.6135800Z             {
2026-08-28T09:54:48.6136205Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6136568Z               "line": 1173
2026-08-28T09:54:48.6136893Z             },
2026-08-28T09:54:48.6137144Z             {
2026-08-28T09:54:48.6137555Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6137825Z               "line": 1203
2026-08-28T09:54:48.6138085Z             },
2026-08-28T09:54:48.6138338Z             {
2026-08-28T09:54:48.6138719Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6139057Z               "line": 570
2026-08-28T09:54:48.6139315Z             },
2026-08-28T09:54:48.6139568Z             {
2026-08-28T09:54:48.6139950Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6140211Z               "line": 591
2026-08-28T09:54:48.6140466Z             },
2026-08-28T09:54:48.6140725Z             {
2026-08-28T09:54:48.6141094Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6141370Z               "line": 612
2026-08-28T09:54:48.6141626Z             },
2026-08-28T09:54:48.6141884Z             {
2026-08-28T09:54:48.6142261Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6142547Z               "line": 629
2026-08-28T09:54:48.6142804Z             },
2026-08-28T09:54:48.6143055Z             {
2026-08-28T09:54:48.6143430Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6143698Z               "line": 653
2026-08-28T09:54:48.6143956Z             },
2026-08-28T09:54:48.6144213Z             {
2026-08-28T09:54:48.6144647Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6144920Z               "line": 674
2026-08-28T09:54:48.6145181Z             },
2026-08-28T09:54:48.6145438Z             {
2026-08-28T09:54:48.6145804Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6146082Z               "line": 695
2026-08-28T09:54:48.6146341Z             },
2026-08-28T09:54:48.6146603Z             {
2026-08-28T09:54:48.6146961Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6147228Z               "line": 724
2026-08-28T09:54:48.6147538Z             }
2026-08-28T09:54:48.6147801Z           ]
2026-08-28T09:54:48.6148058Z         }
2026-08-28T09:54:48.6148309Z       }
2026-08-28T09:54:48.6148564Z     },
2026-08-28T09:54:48.6148822Z     {
2026-08-28T09:54:48.6149218Z       "id": "REQ-TRUST-WARNING-ENVELOPE",
2026-08-28T09:54:48.6189010Z       "title": "The trust warning RIDES THE DELIVERED MESSAGE'S OWN ENVELOPE as a `trust-warning` attribute composed by the RECEIVING node, so an agent reads the caution and the message it is about in ONE arrival rather than two. THE CARRIER CHANGES; THE RULE DOES NOT — when a warning is owed (REQ-TRUST-WARNING) and how often it surfaces (REQ-TRUST-WARNING-CADENCE) are untouched by this requirement, which settles only WHERE the composed block travels. THE GROUNDING IS THAT A SEPARATE DELIVERY IS A SEPARATE INJECTION: under an spt-hosted harness each delivery becomes its own context injection, so a caution delivered alongside costs the agent a second interruption for a block it must read with the message anyway. THE UNFORGEABILITY REASON IS PRESERVED, NOT TRADED, and this is the distinction the change turns on: the ratified rule forbids SPLICING THE WARNING INTO THE PEER'S BODY, because a warning inside the body is one a sender could have written. An envelope attribute is not the body — it is composed by the receiving node exactly as a matched monic's `mnemonics-json` is, so the sender authors it in neither design. THE ATTRIBUTE IS ADAPTER-VISIBLE BY DECISION, NOT BY ACCIDENT: the surface question was resolved before building and it was decidable rather than preferential, because the payload is text the AGENT MUST READ and any carrier stripped before the EVENT would ship a caution that never surfaces. It therefore enters the PUBLISHED envelope surface, which obliges the public envelope documentation to state it and a re-rendering adapter to surface it. FOR THIS ATTRIBUTE, BEING IGNORED IS THE FAILURE, which INVERTS the mnemonics-json precedent: an adapter safely ignoring an unknown attribute is exactly how a security caution goes missing, so 'additive and N-1-safe' is necessary and NOT sufficient here, and the doc must bind a custody pipeline that re-renders a delivery to carry the attribute through, on the precedent already set for carrying matched monics through intact. THE FAIL-SAFE IS NAMED, NOT DISCOVERED. A body that is ALREADY A TYPED ENVELOPE carries no attribute — it rides verbatim by construction, and splicing into a finished envelope would mean hand-rolling the grammar a second time. For exactly those deliveries the warning KEEPS its own system-authored delivery under the reserved author, unchanged. The second injection therefore survives precisely where no carrier exists and nowhere else, and the caution is never traded for the fix. THE INBOUND VALUE IS INERT BY CONSTRUCTION. A sender-supplied body that is itself a typed envelope rides verbatim through the wire, the spool and every renderer, so a peer can write this attribute into one and have it arrive wearing the receiver's own voice. Every point at which a sender-supplied body enters this node STRIPS the receiver-composed attributes BEFORE any is attached, so the value a recipient reads is the receiver's own by construction rather than by the sender's restraint. THE STRIP IS BY CLASS, NOT BY NAME: receiver-composed attributes are a named set, because two name-strips at one seam authored in two lanes is a drift pair, and inertizing the class costs exactly what inertizing one name costs while holding for the next receiver-composed attribute too. Attributes an envelope's own AUTHOR legitimately carries (`type`, `from`, a notify's id, an alarm's times) ride end-to-end intact — the strip removes named receiver-composed attributes from an otherwise untouched envelope, and it is not the wholesale re-compose that re-stamping an envelope's TYPE performs. A key that could not be re-emitted safely is DROPPED rather than written back unescaped. Gate: doc — the public envelope surface states the attribute, that the receiving node composes it, the MUST-surface obligation on a re-rendering adapter with ignored-is-failure as its reason, and the typed-envelope fail-safe; impl — the attribute constant and the receiver-composed class in the envelope grammar, the class strip at each sender-supplied ingress, the attach at the WAN edge through the envelope renderer so a matched monic still evaluates under the one rule, and the fail-safe branch that keeps the separate delivery when the body carries no attribute; unit — a forged inbound trust-warning attribute is inert on a delivered envelope, an admitted stranger's message carries the warning on its OWN envelope with no second delivery spooled, a typed-envelope body still draws the separate system-authored delivery, the strip preserves every other attribute and the body, and the cadence still claims only after the carrying message was actually delivered.",
2026-08-28T09:54:48.6189708Z       "requiredStages": [
2026-08-28T09:54:48.6189969Z         "doc",
2026-08-28T09:54:48.6190231Z         "impl",
2026-08-28T09:54:48.6190493Z         "unit"
2026-08-28T09:54:48.6190754Z       ],
2026-08-28T09:54:48.6191024Z       "stages": {
2026-08-28T09:54:48.6191282Z         "doc": {
2026-08-28T09:54:48.6191572Z           "complete": true,
2026-08-28T09:54:48.6191849Z           "evidence": [
2026-08-28T09:54:48.6192111Z             {
2026-08-28T09:54:48.6192416Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6192693Z               "line": 959
2026-08-28T09:54:48.6192951Z             },
2026-08-28T09:54:48.6193262Z             {
2026-08-28T09:54:48.6193651Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:48.6193918Z               "line": 211
2026-08-28T09:54:48.6194176Z             }
2026-08-28T09:54:48.6194422Z           ]
2026-08-28T09:54:48.6194689Z         },
2026-08-28T09:54:48.6194952Z         "impl": {
2026-08-28T09:54:48.6195238Z           "complete": true,
2026-08-28T09:54:48.6195534Z           "evidence": [
2026-08-28T09:54:48.6195912Z             {
2026-08-28T09:54:48.6196336Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6196766Z               "line": 807
2026-08-28T09:54:48.6197123Z             },
2026-08-28T09:54:48.6197410Z             {
2026-08-28T09:54:48.6197805Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6203396Z               "line": 974
2026-08-28T09:54:48.6203682Z             },
2026-08-28T09:54:48.6203939Z             {
2026-08-28T09:54:48.6204315Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6204606Z               "line": 995
2026-08-28T09:54:48.6204874Z             },
2026-08-28T09:54:48.6205121Z             {
2026-08-28T09:54:48.6205469Z               "path": "crates/spt-msg/src/deliver.rs",
2026-08-28T09:54:48.6205733Z               "line": 159
2026-08-28T09:54:48.6205994Z             },
2026-08-28T09:54:48.6206245Z             {
2026-08-28T09:54:48.6206586Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:48.6206844Z               "line": 81
2026-08-28T09:54:48.6207097Z             },
2026-08-28T09:54:48.6207350Z             {
2026-08-28T09:54:48.6207683Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:48.6207961Z               "line": 111
2026-08-28T09:54:48.6208218Z             },
2026-08-28T09:54:48.6208479Z             {
2026-08-28T09:54:48.6208828Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.6209174Z               "line": 211
2026-08-28T09:54:48.6209535Z             },
2026-08-28T09:54:48.6209787Z             {
2026-08-28T09:54:48.6210145Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.6210416Z               "line": 242
2026-08-28T09:54:48.6210679Z             },
2026-08-28T09:54:48.6210932Z             {
2026-08-28T09:54:48.6211298Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.6211566Z               "line": 277
2026-08-28T09:54:48.6211827Z             }
2026-08-28T09:54:48.6212087Z           ]
2026-08-28T09:54:48.6212339Z         },
2026-08-28T09:54:48.6212659Z         "int": {
2026-08-28T09:54:48.6212940Z           "complete": false,
2026-08-28T09:54:48.6213218Z           "evidence": []
2026-08-28T09:54:48.6213470Z         },
2026-08-28T09:54:48.6213728Z         "unit": {
2026-08-28T09:54:48.6214014Z           "complete": true,
2026-08-28T09:54:48.6214286Z           "evidence": [
2026-08-28T09:54:48.6214561Z             {
2026-08-28T09:54:48.6214904Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6215190Z               "line": 1672
2026-08-28T09:54:48.6215434Z             },
2026-08-28T09:54:48.6215682Z             {
2026-08-28T09:54:48.6216025Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6216303Z               "line": 1720
2026-08-28T09:54:48.6216555Z             },
2026-08-28T09:54:48.6216815Z             {
2026-08-28T09:54:48.6217160Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6217437Z               "line": 1762
2026-08-28T09:54:48.6217690Z             },
2026-08-28T09:54:48.6217948Z             {
2026-08-28T09:54:48.6218282Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:48.6218554Z               "line": 483
2026-08-28T09:54:48.6218817Z             },
2026-08-28T09:54:48.6219136Z             {
2026-08-28T09:54:48.6219480Z               "path": "crates/spt-msg/src/emit.rs",
2026-08-28T09:54:48.6219749Z               "line": 565
2026-08-28T09:54:48.6220003Z             },
2026-08-28T09:54:48.6220262Z             {
2026-08-28T09:54:48.6220676Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.6220953Z               "line": 775
2026-08-28T09:54:48.6221206Z             },
2026-08-28T09:54:48.6221468Z             {
2026-08-28T09:54:48.6221970Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.6222263Z               "line": 855
2026-08-28T09:54:48.6222523Z             },
2026-08-28T09:54:48.6222777Z             {
2026-08-28T09:54:48.6223125Z               "path": "crates/spt-proto/src/event.rs",
2026-08-28T09:54:48.6223401Z               "line": 877
2026-08-28T09:54:48.6223730Z             }
2026-08-28T09:54:48.6223979Z           ]
2026-08-28T09:54:48.6224231Z         }
2026-08-28T09:54:48.6224488Z       }
2026-08-28T09:54:48.6224740Z     },
2026-08-28T09:54:48.6224989Z     {
2026-08-28T09:54:48.6225323Z       "id": "REQ-TRUST-WARNING-OVERRIDE",
2026-08-28T09:54:48.6255787Z       "title": "An operator can replace the ADVISORY PARAGRAPH of one endpoint's trust warning with their own text, through `spt endpoint trust-warning set <text> [--owner <id>]`, withdraw it with `reset`, and read what is in force with `show`. THE SCOPE IS PARTIAL BY RATIFICATION (doyle 2026-07-31, at T6's acceptance): custom text replaces the advice and NOTHING ELSE — the line naming who reached the endpoint and stating that no note is held about them, and the line saying how to classify them, are always core-composed. The grounding is that override text is agent-behavior instruction delivered under a RESERVED SYSTEM AUTHOR, which makes it a prompt-injection surface, and an unforgeable factual spine BOUNDS that surface: a whole-block override would let one elevated write hide WHO is knocking, which no legitimate override needs. THE VERB STATES THAT SCOPE IN ITS OWN OUTPUT — required, not stylistic: the operator writing agent-facing instruction is told at the moment they write it which lines they did not reach and why, rather than only in a doc they may never open. WRITES ARE ELEVATION-GATED AND READS ARE NOT, and this is THE ONE ELEVATION GATE IN THE MONIC/TRUST-WARNING FAMILY (REQ-MONIC-VERBS asserts the opposite invariant for the monic verbs, and this requirement must not be read as loosening it): writing is a human-at-the-machine act because an agent must not be able to rewrite the caution it is about to be handed, while showing what an endpoint is told leaks no authority and is exactly the visibility that makes a planted override discoverable — gating the read would protect nothing and hide the only thing worth auditing. Elevation that cannot be POSITIVELY CONFIRMED refuses like no elevation at all. THE TEXT IS STORED NODE-LOCALLY BESIDE THE ACCESS STORE, ONE FILE PER ENDPOINT, AND NEVER IN THE MIND TIER: a mind file replicates between every instance of an agent, so an override filed there would let a peer instance's mind push warning text onto this node — the injection surface the elevation gate exists to hold shut, re-opened by a sync. TWO WRITE-TIME REFUSALS: a blank override (withdrawal is its own verb, so a blank one is a shell mishap far more often than an intent to caution an agent about nothing) and one past a length bound (the block is read ahead of every admitted stranger's message with the classify line BELOW the advisory, so an unbounded advisory buries the line an override may not touch — the harm the whole-block override was refused for, reached by length instead of by scope). THE READ IS FAIL-SAFE AND STORE-FREE: the delivery edge reads the override off a plain path after it has already decided to warn, and an absent, unreadable, or blank record all read as NO override, falling back to the default advisory — what a damaged override costs is the operator's wording, never the caution. An override belongs to ONE endpoint: cautioning one agent never rewrites what another on the same node is told. Gate: impl — the store's per-endpoint node-local record with its validated write, fail-safe read and withdrawal, the pure verb decision keyed on whether the verb WRITES, the three CLI verbs with the scope notice in the set path, and the edge read wired into the composer's custom slot; unit — the gate table (every write refuses under not-elevated and undeterminable, show proceeds under every elevation, and gated-iff-it-writes asserted as the keying property), the refusal naming the endpoint and the elevated re-run, the stored override reaching the composer and a reset restoring the default, per-endpoint isolation, a blank/damaged record falling back to the default advisory, a traversal endpoint id refused on read and write alike, the blank and over-length write refusals, and the surface parsing with a bare `set` refused.",
2026-08-28T09:54:48.6256488Z       "requiredStages": [
2026-08-28T09:54:48.6256754Z         "doc",
2026-08-28T09:54:48.6257007Z         "impl",
2026-08-28T09:54:48.6257269Z         "unit"
2026-08-28T09:54:48.6257522Z       ],
2026-08-28T09:54:48.6257783Z       "stages": {
2026-08-28T09:54:48.6258036Z         "doc": {
2026-08-28T09:54:48.6258332Z           "complete": true,
2026-08-28T09:54:48.6258613Z           "evidence": [
2026-08-28T09:54:48.6258867Z             {
2026-08-28T09:54:48.6259255Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6259526Z               "line": 963
2026-08-28T09:54:48.6259784Z             },
2026-08-28T09:54:48.6260035Z             {
2026-08-28T09:54:48.6260432Z               "path": "docs-site/src/networking/monics.md",
2026-08-28T09:54:48.6260703Z               "line": 353
2026-08-28T09:54:48.6260960Z             }
2026-08-28T09:54:48.6261218Z           ]
2026-08-28T09:54:48.6261476Z         },
2026-08-28T09:54:48.6261739Z         "impl": {
2026-08-28T09:54:48.6262023Z           "complete": true,
2026-08-28T09:54:48.6262297Z           "evidence": [
2026-08-28T09:54:48.6262549Z             {
2026-08-28T09:54:48.6262912Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6263179Z               "line": 791
2026-08-28T09:54:48.6263442Z             },
2026-08-28T09:54:48.6263885Z             {
2026-08-28T09:54:48.6264292Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.6264566Z               "line": 348
2026-08-28T09:54:48.6264821Z             },
2026-08-28T09:54:48.6265074Z             {
2026-08-28T09:54:48.6265431Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.6265698Z               "line": 360
2026-08-28T09:54:48.6265951Z             },
2026-08-28T09:54:48.6266210Z             {
2026-08-28T09:54:48.6266595Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6266859Z               "line": 44
2026-08-28T09:54:48.6267211Z             },
2026-08-28T09:54:48.6267467Z             {
2026-08-28T09:54:48.6267849Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6268116Z               "line": 127
2026-08-28T09:54:48.6268373Z             },
2026-08-28T09:54:48.6268630Z             {
2026-08-28T09:54:48.6269070Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6269341Z               "line": 150
2026-08-28T09:54:48.6269601Z             },
2026-08-28T09:54:48.6269862Z             {
2026-08-28T09:54:48.6270224Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6270496Z               "line": 165
2026-08-28T09:54:48.6270754Z             },
2026-08-28T09:54:48.6271006Z             {
2026-08-28T09:54:48.6271373Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6271641Z               "line": 176
2026-08-28T09:54:48.6271903Z             },
2026-08-28T09:54:48.6272160Z             {
2026-08-28T09:54:48.6272530Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6272795Z               "line": 188
2026-08-28T09:54:48.6273048Z             },
2026-08-28T09:54:48.6273306Z             {
2026-08-28T09:54:48.6273659Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6273936Z               "line": 194
2026-08-28T09:54:48.6274189Z             },
2026-08-28T09:54:48.6274450Z             {
2026-08-28T09:54:48.6274828Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6275178Z               "line": 200
2026-08-28T09:54:48.6275434Z             },
2026-08-28T09:54:48.6275691Z             {
2026-08-28T09:54:48.6276001Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6276273Z               "line": 6016
2026-08-28T09:54:48.6276535Z             },
2026-08-28T09:54:48.6276789Z             {
2026-08-28T09:54:48.6277298Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6277666Z               "line": 27
2026-08-28T09:54:48.6277936Z             },
2026-08-28T09:54:48.6278260Z             {
2026-08-28T09:54:48.6278623Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6278894Z               "line": 75
2026-08-28T09:54:48.6279228Z             },
2026-08-28T09:54:48.6279485Z             {
2026-08-28T09:54:48.6279843Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6280100Z               "line": 91
2026-08-28T09:54:48.6280356Z             }
2026-08-28T09:54:48.6280961Z           ]
2026-08-28T09:54:48.6281504Z         },
2026-08-28T09:54:48.6282043Z         "int": {
2026-08-28T09:54:48.6282624Z           "complete": false,
2026-08-28T09:54:48.6283303Z           "evidence": []
2026-08-28T09:54:48.6283937Z         },
2026-08-28T09:54:48.6284486Z         "unit": {
2026-08-28T09:54:48.6285092Z           "complete": true,
2026-08-28T09:54:48.6285762Z           "evidence": [
2026-08-28T09:54:48.6286371Z             {
2026-08-28T09:54:48.6287048Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6287922Z               "line": 438
2026-08-28T09:54:48.6288568Z             },
2026-08-28T09:54:48.6289212Z             {
2026-08-28T09:54:48.6289885Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6290741Z               "line": 462
2026-08-28T09:54:48.6291386Z             },
2026-08-28T09:54:48.6291959Z             {
2026-08-28T09:54:48.6292694Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6293546Z               "line": 475
2026-08-28T09:54:48.6294178Z             },
2026-08-28T09:54:48.6294741Z             {
2026-08-28T09:54:48.6295427Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6296261Z               "line": 496
2026-08-28T09:54:48.6296893Z             },
2026-08-28T09:54:48.6297454Z             {
2026-08-28T09:54:48.6298118Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6299070Z               "line": 513
2026-08-28T09:54:48.6299777Z             },
2026-08-28T09:54:48.6300353Z             {
2026-08-28T09:54:48.6301016Z               "path": "crates/spt-store/src/trustwarn.rs",
2026-08-28T09:54:48.6301856Z               "line": 539
2026-08-28T09:54:48.6302473Z             },
2026-08-28T09:54:48.6303026Z             {
2026-08-28T09:54:48.6303642Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6304404Z               "line": 30594
2026-08-28T09:54:48.6305039Z             },
2026-08-28T09:54:48.6305611Z             {
2026-08-28T09:54:48.6306292Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6307128Z               "line": 113
2026-08-28T09:54:48.6307753Z             },
2026-08-28T09:54:48.6308316Z             {
2026-08-28T09:54:48.6309051Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6309879Z               "line": 135
2026-08-28T09:54:48.6310522Z             },
2026-08-28T09:54:48.6311085Z             {
2026-08-28T09:54:48.6311752Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6312598Z               "line": 151
2026-08-28T09:54:48.6313209Z             },
2026-08-28T09:54:48.6313766Z             {
2026-08-28T09:54:48.6314420Z               "path": "crates/spt/src/trustwarnverb.rs",
2026-08-28T09:54:48.6315247Z               "line": 165
2026-08-28T09:54:48.6315851Z             }
2026-08-28T09:54:48.6316405Z           ]
2026-08-28T09:54:48.6316958Z         }
2026-08-28T09:54:48.6317593Z       }
2026-08-28T09:54:48.6318123Z     },
2026-08-28T09:54:48.6318648Z     {
2026-08-28T09:54:48.6319386Z       "id": "REQ-UNLISTED-ANSWERED-CROSS-NODE",
2026-08-28T09:54:48.6344245Z       "title": "A CROSS-NODE KNOCK WHOSE ANSWER THIS NODE CAN PROVE RENDERS THAT ANSWER, AND EVERY SILENCE THAT CANNOT BE PROVEN STAYS A SILENCE. The `invited-outbound` evidence line said `we knocked them; answer unknown here (releases#87)` for EVERY cross-node knock, on the reasoning -- true when written -- that the approval receipt is produced where the notification is produced, that the notification never crosses, and that no wire carried one. THE WIRE SHIPPED (DOORBELL W5: spt-net answermsg, spt-daemon answerop, the knocker's half), so the line became a stale claim about the SYSTEM rather than a fact about this node -- and it said so in prose the same lane must correct, since three sites asserted the receipt family was `unbuilt` while the built wire sat beside them. THE FILING'S OWN MECHANISM IS WRONG IN ITS SPECIFICS AND THE MEASUREMENT IS THE RULING'S GROUND (doyle 2026-08-21): there is no `Answered` knock state (they are Pending/Approved/Denied/Expired), and the receipt does NOT land on the knock row -- `receipt_ms` has exactly one production writer, at the notification-produce site, whose own doc binds it to a knocker reachable through this node's notification store, which is to say ON THIS MACHINE. What a cross-node answer touches is the knocker's own MUTUAL PRE-AUTHORIZATION: `apply_answer_receipt` marks it consumed only after matching the keyspace, the correlation id, the answerer against the endpoint that was knocked, and the answering node against the HANDSHAKE-PROVEN origin the knocker bound at arm time. A consumed record is therefore a proven answer sitting on this node, and the render REPORTS that proof rather than re-deriving it -- it must not weaken any check the consume already made. THREE SILENCES REMAIN AND NONE MAY BE READ AS AN ANSWER, which is why the unknown line survives with corrected words (`no answer has reached this node` -- a fact about US, never `no wire exists` and never `unanswered`): an ARMED-BUT-UNCONSUMED record means the answer has not arrived; a NEVER-ARMED knock, the non-mutual majority, has nothing for a receipt to land on, so an approval leaves no trace here at all; and a DENIAL REMOVES the record (deliberately -- a consumed record means the reverse rule was written, and a merely-flagged one would read back as the approval it was not), which makes declined and never-armed THE SAME BYTES. Rendering `declined` out of that absence would manufacture a peer's decision, and an operator who read it would stop asking someone who had in fact let them in. Gate: impl -- the consumed-pre-authorization join over the store already in hand (no new read), keyed on BOTH keyspace and correlation id so a redeemed code cannot report an answer for a knock, the split cross-node arms, and the three stale `unbuilt` prose sites corrected in the same change; unit -- the proven row renders approved AND names what proves it; each of the three silences renders the unknown line with the banned vocabulary asserted absent on every one of them; a code-keyspace pre-authorization sharing the correlation id renders a silence (the keyspace half of the key, which an id-only match would lose); and the same-node arms are untouched.",
2026-08-28T09:54:48.6369555Z       "requiredStages": [
2026-08-28T09:54:48.6370220Z         "impl",
2026-08-28T09:54:48.6370785Z         "unit"
2026-08-28T09:54:48.6371357Z       ],
2026-08-28T09:54:48.6371915Z       "stages": {
2026-08-28T09:54:48.6372507Z         "doc": {
2026-08-28T09:54:48.6373235Z           "complete": false,
2026-08-28T09:54:48.6374008Z           "evidence": []
2026-08-28T09:54:48.6374638Z         },
2026-08-28T09:54:48.6375199Z         "impl": {
2026-08-28T09:54:48.6375806Z           "complete": true,
2026-08-28T09:54:48.6376478Z           "evidence": [
2026-08-28T09:54:48.6377089Z             {
2026-08-28T09:54:48.6377771Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6378702Z               "line": 195
2026-08-28T09:54:48.6379432Z             },
2026-08-28T09:54:48.6380009Z             {
2026-08-28T09:54:48.6380655Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6381465Z               "line": 186
2026-08-28T09:54:48.6382084Z             },
2026-08-28T09:54:48.6382653Z             {
2026-08-28T09:54:48.6383287Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6384100Z               "line": 233
2026-08-28T09:54:48.6384740Z             }
2026-08-28T09:54:48.6385298Z           ]
2026-08-28T09:54:48.6385906Z         },
2026-08-28T09:54:48.6386452Z         "int": {
2026-08-28T09:54:48.6387057Z           "complete": false,
2026-08-28T09:54:48.6387730Z           "evidence": []
2026-08-28T09:54:48.6388355Z         },
2026-08-28T09:54:48.6388904Z         "unit": {
2026-08-28T09:54:48.6389591Z           "complete": true,
2026-08-28T09:54:48.6390249Z           "evidence": [
2026-08-28T09:54:48.6390869Z             {
2026-08-28T09:54:48.6391500Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6392306Z               "line": 597
2026-08-28T09:54:48.6392950Z             },
2026-08-28T09:54:48.6393523Z             {
2026-08-28T09:54:48.6394145Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6394952Z               "line": 622
2026-08-28T09:54:48.6395566Z             }
2026-08-28T09:54:48.6396130Z           ]
2026-08-28T09:54:48.6396683Z         }
2026-08-28T09:54:48.6397213Z       }
2026-08-28T09:54:48.6397748Z     },
2026-08-28T09:54:48.6398281Z     {
2026-08-28T09:54:48.6398886Z       "id": "REQ-UNLISTED-CONTACT-LEDGER",
2026-08-28T09:54:48.6410951Z       "title": "Recent-traffic evidence rides NEW node-scoped state, and the REQ-SEC-1 recent-outbound correlation log is UNTOUCHED. A firewall's memory and a UI's memory must not be the same row: `RecentOutbound` is keyed (local endpoint, remote node) with no peer endpoint id, its window is REPLY_WINDOW_MS = 15 minutes, and it is the stateful-firewall 'established/related' input -- widening its key or its retention for a listing feature would silently widen an admit verdict, a security regression wearing a feature's clothes. THE CONSTRAINTS RIDE THIS MINT, NOT A LATER REVIEW: rows are (direction inbound/outbound, endpoint id, origin node key, last-seen); the retention window is 14 DAYS; the hard size cap is 512 ROWS, pruned oldest-first, so the ledger is bounded regardless of traffic shape; and it is NODE-LOCAL AND NEVER SYNCED -- it enters no replication feed, in the shape ADR-0046's node-scoped notif rows already established. Write sites: inbound is recorded POST-GATE in the WAN receive funnel (the sender endpoint is daemon-stamped and the origin node is handshake-proven; a message the gate refused is not contact), outbound at the send legs. Gate: doc -- the storage entry naming the window, the cap and the never-synced rule; impl -- the store with record/prune/cap and both write sites; unit -- a row older than the window is dropped, the cap prunes oldest-first at its stated VALUE, a refused inbound writes nothing, and the ledger is absent from every emitted feed.",
2026-08-28T09:54:48.6423852Z       "requiredStages": [
2026-08-28T09:54:48.6424496Z         "doc",
2026-08-28T09:54:48.6425069Z         "impl",
2026-08-28T09:54:48.6425646Z         "unit"
2026-08-28T09:54:48.6426208Z       ],
2026-08-28T09:54:48.6426751Z       "stages": {
2026-08-28T09:54:48.6427327Z         "doc": {
2026-08-28T09:54:48.6427904Z           "complete": true,
2026-08-28T09:54:48.6428578Z           "evidence": [
2026-08-28T09:54:48.6429270Z             {
2026-08-28T09:54:48.6429875Z               "path": "docs/STORAGE.md",
2026-08-28T09:54:48.6430630Z               "line": 51
2026-08-28T09:54:48.6431230Z             }
2026-08-28T09:54:48.6431789Z           ]
2026-08-28T09:54:48.6432324Z         },
2026-08-28T09:54:48.6432872Z         "impl": {
2026-08-28T09:54:48.6433480Z           "complete": true,
2026-08-28T09:54:48.6434150Z           "evidence": [
2026-08-28T09:54:48.6434867Z             {
2026-08-28T09:54:48.6435515Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6436333Z               "line": 933
2026-08-28T09:54:48.6436962Z             },
2026-08-28T09:54:48.6437531Z             {
2026-08-28T09:54:48.6438203Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6439143Z               "line": 52
2026-08-28T09:54:48.6439782Z             },
2026-08-28T09:54:48.6440350Z             {
2026-08-28T09:54:48.6441118Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6441982Z               "line": 58
2026-08-28T09:54:48.6442687Z             },
2026-08-28T09:54:48.6443255Z             {
2026-08-28T09:54:48.6443922Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6444759Z               "line": 108
2026-08-28T09:54:48.6445370Z             },
2026-08-28T09:54:48.6445941Z             {
2026-08-28T09:54:48.6446609Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6447443Z               "line": 141
2026-08-28T09:54:48.6448076Z             },
2026-08-28T09:54:48.6448640Z             {
2026-08-28T09:54:48.6449508Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6450347Z               "line": 173
2026-08-28T09:54:48.6450963Z             },
2026-08-28T09:54:48.6451531Z             {
2026-08-28T09:54:48.6452205Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6453058Z               "line": 182
2026-08-28T09:54:48.6453678Z             },
2026-08-28T09:54:48.6454240Z             {
2026-08-28T09:54:48.6454903Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6455781Z               "line": 193
2026-08-28T09:54:48.6456430Z             },
2026-08-28T09:54:48.6456992Z             {
2026-08-28T09:54:48.6457655Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.6458465Z               "line": 306
2026-08-28T09:54:48.6459385Z             },
2026-08-28T09:54:48.6459954Z             {
2026-08-28T09:54:48.6460588Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6461394Z               "line": 490
2026-08-28T09:54:48.6462044Z             }
2026-08-28T09:54:48.6462608Z           ]
2026-08-28T09:54:48.6463150Z         },
2026-08-28T09:54:48.6463703Z         "int": {
2026-08-28T09:54:48.6464305Z           "complete": false,
2026-08-28T09:54:48.6464991Z           "evidence": []
2026-08-28T09:54:48.6465627Z         },
2026-08-28T09:54:48.6466260Z         "unit": {
2026-08-28T09:54:48.6466857Z           "complete": true,
2026-08-28T09:54:48.6467524Z           "evidence": [
2026-08-28T09:54:48.6468148Z             {
2026-08-28T09:54:48.6468806Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6469703Z               "line": 1552
2026-08-28T09:54:48.6470354Z             },
2026-08-28T09:54:48.6470914Z             {
2026-08-28T09:54:48.6471592Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6472431Z               "line": 212
2026-08-28T09:54:48.6473069Z             },
2026-08-28T09:54:48.6473629Z             {
2026-08-28T09:54:48.6474292Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6475123Z               "line": 248
2026-08-28T09:54:48.6475755Z             },
2026-08-28T09:54:48.6476315Z             {
2026-08-28T09:54:48.6476982Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6477817Z               "line": 279
2026-08-28T09:54:48.6478432Z             },
2026-08-28T09:54:48.6479066Z             {
2026-08-28T09:54:48.6479752Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6480607Z               "line": 308
2026-08-28T09:54:48.6481232Z             },
2026-08-28T09:54:48.6481803Z             {
2026-08-28T09:54:48.6482462Z               "path": "crates/spt-store/src/contacts.rs",
2026-08-28T09:54:48.6483300Z               "line": 331
2026-08-28T09:54:48.6483942Z             },
2026-08-28T09:54:48.6484576Z             {
2026-08-28T09:54:48.6485190Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6485998Z               "line": 2362
2026-08-28T09:54:48.6486632Z             },
2026-08-28T09:54:48.6487199Z             {
2026-08-28T09:54:48.6487823Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6488641Z               "line": 2405
2026-08-28T09:54:48.6489377Z             }
2026-08-28T09:54:48.6489935Z           ]
2026-08-28T09:54:48.6490494Z         }
2026-08-28T09:54:48.6491032Z       }
2026-08-28T09:54:48.6491550Z     },
2026-08-28T09:54:48.6492078Z     {
2026-08-28T09:54:48.6492712Z       "id": "REQ-UNLISTED-EVIDENCE",
2026-08-28T09:54:48.6511542Z       "title": "An endpoint that this node holds LOCAL EVIDENCE of is knowable to its own operator without a DISCOVER grant and without any change to discovery: `spt endpoint list` auto-qualifies the invoking entity and renders off-node peers drawn from three local sources, each row carrying its provenance -- invited-outbound (a knock this node sent, and the approval receipt where one exists), admits-inbound (this node's OWN access rules naming that endpoint as a subject), and recent-traffic (the contact ledger, REQ-UNLISTED-CONTACT-LEDGER). A row STATES ITS EVIDENCE AND NEVER ASSERTS LIVENESS: a stale rule can name a deleted endpoint, so the evidence is a fact about this node's own records, never a claim about the peer. TWO SILENCES APPLIED TO RECEIPTS, BINDING ON THE RENDERER: the approval receipt is persisted at the notification-PRODUCE site, which exists only for a SAME-NODE approval -- with the receipt wire family unbuilt (releases#87) a cross-node approval produces no receipt on this node at all, so an approved cross-node knock and an ignored one are the same bytes here. A cross-node invited-outbound row therefore states ANSWER UNKNOWN and names releases#87; it must never read as 'unanswered' and never as anything a reader could take for declined. A same-node row may state approved, because there the receipt exists. The outbound knock itself is persisted locally -- the pre-fix `KnockSendOutcome::Queued` arm returned before the upsert, so a cross-node knock left this node holding nothing -- which is what makes 'I knocked them, they exist at node N' real cross-node evidence. SCOPE GUARD: the retained outbound knock is evidence substrate only; whether `knock list` grows an outbound view is NOT this requirement. A bare-terminal invocation mirrors the fork knocking already named (`Knocker::User`): its asker is subject invoking-node / origin user, and the list renders the NODE's evidence. Gate: doc -- the CONTEXT.md UNLISTED-evidence entry; impl -- the three evidence sources, the produce-site receipt, and the Queued-arm persistence; unit -- a cross-node invited-outbound row says answer-unknown while a same-node one says approved (the discriminator pair), a knock sent cross-node is retained locally, and an evidence row never renders a liveness word.",
2026-08-28T09:54:48.6530146Z       "requiredStages": [
2026-08-28T09:54:48.6530805Z         "doc",
2026-08-28T09:54:48.6531379Z         "impl",
2026-08-28T09:54:48.6531952Z         "unit"
2026-08-28T09:54:48.6532510Z       ],
2026-08-28T09:54:48.6533064Z       "stages": {
2026-08-28T09:54:48.6533643Z         "doc": {
2026-08-28T09:54:48.6534237Z           "complete": true,
2026-08-28T09:54:48.6534866Z           "evidence": [
2026-08-28T09:54:48.6535553Z             {
2026-08-28T09:54:48.6536154Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6536876Z               "line": 776
2026-08-28T09:54:48.6537520Z             }
2026-08-28T09:54:48.6538086Z           ]
2026-08-28T09:54:48.6538634Z         },
2026-08-28T09:54:48.6539271Z         "impl": {
2026-08-28T09:54:48.6539867Z           "complete": true,
2026-08-28T09:54:48.6540520Z           "evidence": [
2026-08-28T09:54:48.6541135Z             {
2026-08-28T09:54:48.6541788Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.6542612Z               "line": 1542
2026-08-28T09:54:48.6549213Z             },
2026-08-28T09:54:48.6549988Z             {
2026-08-28T09:54:48.6550661Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6551490Z               "line": 168
2026-08-28T09:54:48.6552134Z             },
2026-08-28T09:54:48.6552701Z             {
2026-08-28T09:54:48.6553354Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6554194Z               "line": 177
2026-08-28T09:54:48.6554850Z             },
2026-08-28T09:54:48.6555453Z             {
2026-08-28T09:54:48.6556126Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6557042Z               "line": 194
2026-08-28T09:54:48.6557678Z             },
2026-08-28T09:54:48.6558248Z             {
2026-08-28T09:54:48.6558916Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6559885Z               "line": 322
2026-08-28T09:54:48.6560510Z             },
2026-08-28T09:54:48.6561096Z             {
2026-08-28T09:54:48.6561754Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6562576Z               "line": 334
2026-08-28T09:54:48.6563213Z             },
2026-08-28T09:54:48.6563771Z             {
2026-08-28T09:54:48.6564425Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6565243Z               "line": 353
2026-08-28T09:54:48.6565880Z             },
2026-08-28T09:54:48.6566438Z             {
2026-08-28T09:54:48.6567095Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6567936Z               "line": 1170
2026-08-28T09:54:48.6568590Z             },
2026-08-28T09:54:48.6569239Z             {
2026-08-28T09:54:48.6569901Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6570743Z               "line": 1200
2026-08-28T09:54:48.6571370Z             },
2026-08-28T09:54:48.6571939Z             {
2026-08-28T09:54:48.6572553Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6573346Z               "line": 6803
2026-08-28T09:54:48.6574040Z             },
2026-08-28T09:54:48.6574602Z             {
2026-08-28T09:54:48.6575227Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6576013Z               "line": 17382
2026-08-28T09:54:48.6576650Z             },
2026-08-28T09:54:48.6577213Z             {
2026-08-28T09:54:48.6577823Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6578614Z               "line": 17434
2026-08-28T09:54:48.6579340Z             },
2026-08-28T09:54:48.6579899Z             {
2026-08-28T09:54:48.6580537Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6581399Z               "line": 18303
2026-08-28T09:54:48.6582027Z             },
2026-08-28T09:54:48.6582593Z             {
2026-08-28T09:54:48.6583252Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6584085Z               "line": 120
2026-08-28T09:54:48.6584706Z             },
2026-08-28T09:54:48.6585264Z             {
2026-08-28T09:54:48.6585893Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6586709Z               "line": 135
2026-08-28T09:54:48.6587343Z             },
2026-08-28T09:54:48.6587906Z             {
2026-08-28T09:54:48.6588530Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6589436Z               "line": 185
2026-08-28T09:54:48.6590063Z             },
2026-08-28T09:54:48.6590625Z             {
2026-08-28T09:54:48.6591255Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6592067Z               "line": 266
2026-08-28T09:54:48.6592687Z             },
2026-08-28T09:54:48.6593259Z             {
2026-08-28T09:54:48.6593922Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6594730Z               "line": 277
2026-08-28T09:54:48.6595369Z             }
2026-08-28T09:54:48.6595938Z           ]
2026-08-28T09:54:48.6596482Z         },
2026-08-28T09:54:48.6597028Z         "int": {
2026-08-28T09:54:48.6597622Z           "complete": false,
2026-08-28T09:54:48.6598623Z           "evidence": []
2026-08-28T09:54:48.6599335Z         },
2026-08-28T09:54:48.6599976Z         "unit": {
2026-08-28T09:54:48.6600605Z           "complete": true,
2026-08-28T09:54:48.6601258Z           "evidence": [
2026-08-28T09:54:48.6601863Z             {
2026-08-28T09:54:48.6602519Z               "path": "crates/spt-store/src/access.rs",
2026-08-28T09:54:48.6603342Z               "line": 3947
2026-08-28T09:54:48.6603990Z             },
2026-08-28T09:54:48.6604543Z             {
2026-08-28T09:54:48.6605191Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6606007Z               "line": 1688
2026-08-28T09:54:48.6606641Z             },
2026-08-28T09:54:48.6607275Z             {
2026-08-28T09:54:48.6607905Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6608726Z               "line": 1759
2026-08-28T09:54:48.6609474Z             },
2026-08-28T09:54:48.6610032Z             {
2026-08-28T09:54:48.6610691Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6611522Z               "line": 1785
2026-08-28T09:54:48.6612171Z             },
2026-08-28T09:54:48.6612715Z             {
2026-08-28T09:54:48.6613354Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6614193Z               "line": 1822
2026-08-28T09:54:48.6614823Z             },
2026-08-28T09:54:48.6615390Z             {
2026-08-28T09:54:48.6616043Z               "path": "crates/spt-store/src/knock.rs",
2026-08-28T09:54:48.6616881Z               "line": 1843
2026-08-28T09:54:48.6617536Z             },
2026-08-28T09:54:48.6618101Z             {
2026-08-28T09:54:48.6618751Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6619634Z               "line": 419
2026-08-28T09:54:48.6620249Z             },
2026-08-28T09:54:48.6620813Z             {
2026-08-28T09:54:48.6621462Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6622291Z               "line": 452
2026-08-28T09:54:48.6622902Z             },
2026-08-28T09:54:48.6623530Z             {
2026-08-28T09:54:48.6624152Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6624954Z               "line": 526
2026-08-28T09:54:48.6625579Z             },
2026-08-28T09:54:48.6626142Z             {
2026-08-28T09:54:48.6626764Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6627584Z               "line": 674
2026-08-28T09:54:48.6628214Z             },
2026-08-28T09:54:48.6628907Z             {
2026-08-28T09:54:48.6629635Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6630456Z               "line": 694
2026-08-28T09:54:48.6631157Z             }
2026-08-28T09:54:48.6631708Z           ]
2026-08-28T09:54:48.6632261Z         }
2026-08-28T09:54:48.6632799Z       }
2026-08-28T09:54:48.6633328Z     },
2026-08-28T09:54:48.6633873Z     {
2026-08-28T09:54:48.6634479Z       "id": "REQ-UNLISTED-EVIDENCE-ROUTE",
2026-08-28T09:54:48.6646962Z       "title": "A row the operator can see but cannot act on is a worse surface than no row, so an evidence-known peer is REACHABLE BY SEND: when the registry holds no row for an endpoint -- `resolve_among` returns NotFound on an empty live set even for an explicit @node pin -- but the evidence holds (id, origin node key), the send dials THAT NODE directly, on the node-tier address that replicates to every subnet member regardless of endpoint DISCOVER. THE TARGET'S ACCESS GATE STAYS THE SOLE AUTHORITY ON ADMISSION, exactly as it is for every inbound today: routing on evidence is not circumventing hiddenness, because the invitation IS the consent -- the sealed-code route-rides-evidence logic applied to ordinary send. THE ASKER'S OWN VISIBILITY EXCLUSIONS STILL REFUSE, AND THE REQ-INST-12 BOUNDARY IS RE-IMPOSED WITH THE SAME PREDICATE THE RESOLVE PATH RECEIVES -- one shared closure, never a copied condition: the exclusion check lives INSIDE `resolve_visible`, which this route bypasses by construction, so a second hand-written condition would be a boundary that drifts silently from the one it claims to mirror. Gate: doc -- the networking entry stating what evidence routes on and what it does not widen; impl -- the evidence-route leg and the shared exclusion predicate; unit -- the discriminator pair, an excluded id REFUSED through the evidence route and a non-excluded one ADMITTED, plus a refusal that names the boundary rather than reading as a missing endpoint.",
2026-08-28T09:54:48.6660003Z       "requiredStages": [
2026-08-28T09:54:48.6660644Z         "doc",
2026-08-28T09:54:48.6661226Z         "impl",
2026-08-28T09:54:48.6661798Z         "unit"
2026-08-28T09:54:48.6662367Z       ],
2026-08-28T09:54:48.6662914Z       "stages": {
2026-08-28T09:54:48.6663511Z         "doc": {
2026-08-28T09:54:48.6664174Z           "complete": true,
2026-08-28T09:54:48.6664966Z           "evidence": [
2026-08-28T09:54:48.6665596Z             {
2026-08-28T09:54:48.6666226Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6666951Z               "line": 595
2026-08-28T09:54:48.6667580Z             }
2026-08-28T09:54:48.6668139Z           ]
2026-08-28T09:54:48.6668675Z         },
2026-08-28T09:54:48.6669314Z         "impl": {
2026-08-28T09:54:48.6669911Z           "complete": true,
2026-08-28T09:54:48.6670569Z           "evidence": [
2026-08-28T09:54:48.6671180Z             {
2026-08-28T09:54:48.6671805Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6672597Z               "line": 11522
2026-08-28T09:54:48.6673247Z             },
2026-08-28T09:54:48.6673816Z             {
2026-08-28T09:54:48.6674457Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6675268Z               "line": 318
2026-08-28T09:54:48.6675931Z             },
2026-08-28T09:54:48.6676497Z             {
2026-08-28T09:54:48.6677120Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6677921Z               "line": 196
2026-08-28T09:54:48.6678555Z             },
2026-08-28T09:54:48.6679202Z             {
2026-08-28T09:54:48.6679827Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6680724Z               "line": 433
2026-08-28T09:54:48.6681343Z             }
2026-08-28T09:54:48.6681918Z           ]
2026-08-28T09:54:48.6682456Z         },
2026-08-28T09:54:48.6682990Z         "int": {
2026-08-28T09:54:48.6683586Z           "complete": false,
2026-08-28T09:54:48.6684258Z           "evidence": []
2026-08-28T09:54:48.6684885Z         },
2026-08-28T09:54:48.6685424Z         "unit": {
2026-08-28T09:54:48.6686210Z           "complete": true,
2026-08-28T09:54:48.6686900Z           "evidence": [
2026-08-28T09:54:48.6687503Z             {
2026-08-28T09:54:48.6688114Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6689068Z               "line": 24530
2026-08-28T09:54:48.6689715Z             },
2026-08-28T09:54:48.6690273Z             {
2026-08-28T09:54:48.6690893Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6691699Z               "line": 725
2026-08-28T09:54:48.6692338Z             },
2026-08-28T09:54:48.6692907Z             {
2026-08-28T09:54:48.6693531Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6694348Z               "line": 751
2026-08-28T09:54:48.6694956Z             },
2026-08-28T09:54:48.6695501Z             {
2026-08-28T09:54:48.6696126Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6696938Z               "line": 771
2026-08-28T09:54:48.6697546Z             },
2026-08-28T09:54:48.6698102Z             {
2026-08-28T09:54:48.6698721Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6699608Z               "line": 2432
2026-08-28T09:54:48.6700247Z             }
2026-08-28T09:54:48.6700805Z           ]
2026-08-28T09:54:48.6701363Z         }
2026-08-28T09:54:48.6701906Z       }
2026-08-28T09:54:48.6702549Z     },
2026-08-28T09:54:48.6703086Z     {
2026-08-28T09:54:48.6703691Z       "id": "REQ-UNLISTED-FOOTER-OMITTED",
2026-08-28T09:54:48.6721892Z       "title": "THE UNLISTED SECTION RENDERS ITS ROWS AND NOT AN ESSAY ABOUT THEM: `endpoint list` omits the two footer explainer lines under the UNLISTED heading -- the always-printed `evidence is what this node recorded; the presence word is their own node's answer, asked just now`, and the conditional `not asked -- no node is recorded for that row, so there was nobody to ask`. Operator-filed (releases#184, split from releases#149): both were confusing rather than helpful, and they were the only two lines in the family that explained the family to a reader who had already read the rows. WHAT STAYS, EXPLICITLY, because the deletion must not strand the section: the purple heading that NAMES what the section is, every per-row cell and its phrases -- the status word, the provenance label, the node label including the stated `node unknown`, the presence word, the `not asked` cell itself, and the evidence detail -- and the CONDITIONAL `unknown` legend, which the filing does not name and which explains a word an operator is about to act on that its own spelling does not carry (a relay-hosted peer cannot tell busy from offline). The retained legend's own doc comment is corrected in the same change from `the two legends below` to what remains, because a count that no longer matches its code is the stale-carried-forward sentence the next reader trusts. THE RETRACTION SWEEPS THE STRINGS, NOT JUST THE RENDER SITE (doyle Q5): the deleted phrases are hunted through the test estate so no assertion outlives the text it asserts -- an assertion on a deleted string is either a red or, worse, a green on a substring the ROW still carries. THE OMISSION IS PINNED BY A NEGATIVE CELL over a fixture that HAS an unasked row, since a fixture without one would pass on a footer that is merely unreached rather than gone. Gate: impl -- `render_unlisted` without the two lines and with its legend comment corrected; unit -- one rendered fixture carrying an unasked row asserts BOTH phrases absent while the heading, the row's `not asked` cell and the retained `unknown` legend are still present, so the cell separates the footer from the per-row vocabulary rather than merely counting lines.",
2026-08-28T09:54:48.6740333Z       "requiredStages": [
2026-08-28T09:54:48.6741234Z         "impl",
2026-08-28T09:54:48.6742088Z         "unit"
2026-08-28T09:54:48.6742702Z       ],
2026-08-28T09:54:48.6743294Z       "stages": {
2026-08-28T09:54:48.6743884Z         "doc": {
2026-08-28T09:54:48.6744494Z           "complete": false,
2026-08-28T09:54:48.6745173Z           "evidence": []
2026-08-28T09:54:48.6745802Z         },
2026-08-28T09:54:48.6746351Z         "impl": {
2026-08-28T09:54:48.6746947Z           "complete": true,
2026-08-28T09:54:48.6747605Z           "evidence": [
2026-08-28T09:54:48.6748451Z             {
2026-08-28T09:54:48.6749170Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6749972Z               "line": 6985
2026-08-28T09:54:48.6750611Z             }
2026-08-28T09:54:48.6751184Z           ]
2026-08-28T09:54:48.6751737Z         },
2026-08-28T09:54:48.6752287Z         "int": {
2026-08-28T09:54:48.6752887Z           "complete": false,
2026-08-28T09:54:48.6753563Z           "evidence": []
2026-08-28T09:54:48.6754188Z         },
2026-08-28T09:54:48.6754745Z         "unit": {
2026-08-28T09:54:48.6755344Z           "complete": true,
2026-08-28T09:54:48.6756004Z           "evidence": [
2026-08-28T09:54:48.6756625Z             {
2026-08-28T09:54:48.6757235Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6758014Z               "line": 27682
2026-08-28T09:54:48.6758639Z             }
2026-08-28T09:54:48.6759298Z           ]
2026-08-28T09:54:48.6759835Z         }
2026-08-28T09:54:48.6760384Z       }
2026-08-28T09:54:48.6760917Z     },
2026-08-28T09:54:48.6761448Z     {
2026-08-28T09:54:48.6762063Z       "id": "REQ-UNLISTED-PRESENCE-PROBE",
2026-08-28T09:54:48.6778510Z       "title": "`endpoint list` answers 'is this peer there right now' for UNLISTED rows with a presence probe, and the probe is NOT A MESSAGE: it is its own kind-tagged wire family, in the shape KNOCK_KIND already established, so an N-1 daemon classifies it Unknown and DROPS IT CLEAN. Probes fan out simultaneously and the verb BLOCKS on them under a HARD 10-SECOND PER-PROBE CEILING passed as a PARAMETER -- the shared PROBE_TIMEOUT const stays 2500ms and is untouched -- over the `probe_all` + `run_bounded` fan-out shape, so the wall-time is one ceiling and one wedged dial never drags the batch. TWO SILENCES: a probe that goes unanswered renders UNKNOWN AND NEVER OFFLINE, because an N-1 daemon's clean drop and a dead node produce the same silence. The answer distinguishes LISTENING / BUSY / OFFLINE, and each word has exactly one authority: they are answered from the serving daemon's HONEST SESSION AUTHORITY (the broker's hosted-session map and its activity window), NEVER from perch records -- the derived-view class where `is_online` reads a ready-file and a liveness stamp. BUSY IS A BROKER-AUTHORITY WORD ONLY. A relay-hosted peer holds no broker session, so it answers from a real connect attempt: accepted is LISTENING, and anything else is UNKNOWN -- busy and offline are indistinguishable there, and rendering offline would be a coin flip presented as a fact; the renderer may say why. CONSENT GROUNDING: the target node answers only if its own rules admit the asker for MSG to that endpoint -- enforcement stays owner-side at the owner's seam -- and presence already leaks to exactly this population one message at a time (SENT vs QUEUED), so the probe adds no new information class. Gate: doc -- the networking entry naming the family, the ceiling and the three-plus-unknown vocabulary; impl -- the record, the dispatcher arm, the serve side and the bounded fan-out; unit -- an unanswered probe reads unknown and not offline, a relay-hosted peer never reads busy, an unadmitted asker is refused at the owner's seam, and the ceiling is honoured per probe rather than per batch.",
2026-08-28T09:54:48.6796322Z       "requiredStages": [
2026-08-28T09:54:48.6796985Z         "doc",
2026-08-28T09:54:48.6797561Z         "impl",
2026-08-28T09:54:48.6798123Z         "unit"
2026-08-28T09:54:48.6798681Z       ],
2026-08-28T09:54:48.6799377Z       "stages": {
2026-08-28T09:54:48.6799959Z         "doc": {
2026-08-28T09:54:48.6800562Z           "complete": true,
2026-08-28T09:54:48.6801228Z           "evidence": [
2026-08-28T09:54:48.6801843Z             {
2026-08-28T09:54:48.6802453Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6803172Z               "line": 612
2026-08-28T09:54:48.6803795Z             }
2026-08-28T09:54:48.6804346Z           ]
2026-08-28T09:54:48.6804896Z         },
2026-08-28T09:54:48.6805440Z         "impl": {
2026-08-28T09:54:48.6806035Z           "complete": true,
2026-08-28T09:54:48.6806764Z           "evidence": [
2026-08-28T09:54:48.6807370Z             {
2026-08-28T09:54:48.6808046Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6808902Z               "line": 154
2026-08-28T09:54:48.6809612Z             },
2026-08-28T09:54:48.6810185Z             {
2026-08-28T09:54:48.6810848Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6811701Z               "line": 256
2026-08-28T09:54:48.6812326Z             },
2026-08-28T09:54:48.6812879Z             {
2026-08-28T09:54:48.6813542Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6814398Z               "line": 1083
2026-08-28T09:54:48.6815027Z             },
2026-08-28T09:54:48.6815580Z             {
2026-08-28T09:54:48.6815953Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6816273Z               "line": 1912
2026-08-28T09:54:48.6816532Z             },
2026-08-28T09:54:48.6816790Z             {
2026-08-28T09:54:48.6817151Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6817433Z               "line": 1963
2026-08-28T09:54:48.6817677Z             },
2026-08-28T09:54:48.6817930Z             {
2026-08-28T09:54:48.6818292Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6818574Z               "line": 1999
2026-08-28T09:54:48.6818825Z             },
2026-08-28T09:54:48.6819166Z             {
2026-08-28T09:54:48.6819534Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6819877Z               "line": 2035
2026-08-28T09:54:48.6820120Z             },
2026-08-28T09:54:48.6820368Z             {
2026-08-28T09:54:48.6820731Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6820997Z               "line": 2081
2026-08-28T09:54:48.6821259Z             },
2026-08-28T09:54:48.6821516Z             {
2026-08-28T09:54:48.6821880Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6822167Z               "line": 2102
2026-08-28T09:54:48.6822420Z             },
2026-08-28T09:54:48.6822739Z             {
2026-08-28T09:54:48.6823082Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.6823364Z               "line": 667
2026-08-28T09:54:48.6823617Z             },
2026-08-28T09:54:48.6823879Z             {
2026-08-28T09:54:48.6824268Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:48.6824552Z               "line": 85
2026-08-28T09:54:48.6824814Z             },
2026-08-28T09:54:48.6825071Z             {
2026-08-28T09:54:48.6825382Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6825653Z               "line": 6185
2026-08-28T09:54:48.6825907Z             },
2026-08-28T09:54:48.6826160Z             {
2026-08-28T09:54:48.6826475Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6826750Z               "line": 6545
2026-08-28T09:54:48.6827007Z             },
2026-08-28T09:54:48.6827265Z             {
2026-08-28T09:54:48.6827575Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6827851Z               "line": 6721
2026-08-28T09:54:48.6828104Z             },
2026-08-28T09:54:48.6828457Z             {
2026-08-28T09:54:48.6828791Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6829138Z               "line": 6854
2026-08-28T09:54:48.6829395Z             },
2026-08-28T09:54:48.6829654Z             {
2026-08-28T09:54:48.6830041Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6830317Z               "line": 6866
2026-08-28T09:54:48.6830569Z             },
2026-08-28T09:54:48.6830832Z             {
2026-08-28T09:54:48.6831142Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6831409Z               "line": 6879
2026-08-28T09:54:48.6831667Z             },
2026-08-28T09:54:48.6831935Z             {
2026-08-28T09:54:48.6832242Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6832526Z               "line": 6917
2026-08-28T09:54:48.6832864Z             },
2026-08-28T09:54:48.6833126Z             {
2026-08-28T09:54:48.6833436Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6833714Z               "line": 6955
2026-08-28T09:54:48.6833967Z             },
2026-08-28T09:54:48.6834225Z             {
2026-08-28T09:54:48.6834545Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6834814Z               "line": 13823
2026-08-28T09:54:48.6835074Z             },
2026-08-28T09:54:48.6835326Z             {
2026-08-28T09:54:48.6835665Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.6835928Z               "line": 634
2026-08-28T09:54:48.6836190Z             }
2026-08-28T09:54:48.6836439Z           ]
2026-08-28T09:54:48.6836690Z         },
2026-08-28T09:54:48.6836947Z         "int": {
2026-08-28T09:54:48.6837234Z           "complete": false,
2026-08-28T09:54:48.6837510Z           "evidence": []
2026-08-28T09:54:48.6837753Z         },
2026-08-28T09:54:48.6838015Z         "unit": {
2026-08-28T09:54:48.6838296Z           "complete": true,
2026-08-28T09:54:48.6838558Z           "evidence": [
2026-08-28T09:54:48.6838812Z             {
2026-08-28T09:54:48.6839275Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6839550Z               "line": 2482
2026-08-28T09:54:48.6839802Z             },
2026-08-28T09:54:48.6840058Z             {
2026-08-28T09:54:48.6840429Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6840706Z               "line": 3273
2026-08-28T09:54:48.6841035Z             },
2026-08-28T09:54:48.6841292Z             {
2026-08-28T09:54:48.6841655Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6841927Z               "line": 3330
2026-08-28T09:54:48.6842185Z             },
2026-08-28T09:54:48.6842437Z             {
2026-08-28T09:54:48.6842807Z               "path": "crates/spt-daemon/src/dispatch.rs",
2026-08-28T09:54:48.6843081Z               "line": 3366
2026-08-28T09:54:48.6843339Z             },
2026-08-28T09:54:48.6843602Z             {
2026-08-28T09:54:48.6843992Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:48.6844330Z               "line": 238
2026-08-28T09:54:48.6844583Z             },
2026-08-28T09:54:48.6844846Z             {
2026-08-28T09:54:48.6845236Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:48.6845516Z               "line": 258
2026-08-28T09:54:48.6845773Z             },
2026-08-28T09:54:48.6846026Z             {
2026-08-28T09:54:48.6846412Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:48.6846797Z               "line": 273
2026-08-28T09:54:48.6847065Z             },
2026-08-28T09:54:48.6847309Z             {
2026-08-28T09:54:48.6847700Z               "path": "crates/spt-net/src/net/presencemsg.rs",
2026-08-28T09:54:48.6847967Z               "line": 301
2026-08-28T09:54:48.6848222Z             },
2026-08-28T09:54:48.6848475Z             {
2026-08-28T09:54:48.6848794Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6849166Z               "line": 27467
2026-08-28T09:54:48.6849428Z             },
2026-08-28T09:54:48.6849686Z             {
2026-08-28T09:54:48.6850000Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6850278Z               "line": 27497
2026-08-28T09:54:48.6850539Z             },
2026-08-28T09:54:48.6850799Z             {
2026-08-28T09:54:48.6851113Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6856528Z               "line": 27580
2026-08-28T09:54:48.6856852Z             }
2026-08-28T09:54:48.6857119Z           ]
2026-08-28T09:54:48.6857372Z         }
2026-08-28T09:54:48.6857635Z       }
2026-08-28T09:54:48.6857888Z     },
2026-08-28T09:54:48.6858145Z     {
2026-08-28T09:54:48.6858455Z       "id": "REQ-UNLISTED-RENDER",
2026-08-28T09:54:48.6868580Z       "title": "Evidence-known off-node peers render in a NEW status family, UNLISTED, which is deliberately NOT the ratified HIDDEN vocabulary: HIDDEN names an operator-chosen exclusion (REQ-INST-12) and those rows must never read as reachable, so reusing the word would collapse two opposite meanings onto one surface. Rows are provenance-labelled with the source that produced them. COLOUR NEVER CARRIES THE MEANING ALONE -- the status WORD rides the row and `--json` carries the state name, so a colour-blind reader, a piped log and a machine consumer all read the same fact. BOTH SOURCE LEGS OF `endpoint list` CARRY THE FAMILY: the human path and the `--json` path are separate constructions over the same facts, and the reader-parity discipline REQ-LIST-JSON-LIVENESS-PARITY already enforces there applies unchanged -- a family that appears on one leg only is the parity defect that requirement exists to prevent. Gate: doc -- the CONTEXT.md status-vocabulary entry distinguishing UNLISTED from HIDDEN; impl -- the family, its provenance labels and both render legs; unit -- an UNLISTED row renders its status word with colour disabled, a HIDDEN endpoint never renders as UNLISTED, and the human and `--json` legs agree on the same fixture.",
2026-08-28T09:54:48.6869116Z       "requiredStages": [
2026-08-28T09:54:48.6869400Z         "doc",
2026-08-28T09:54:48.6869662Z         "impl",
2026-08-28T09:54:48.6869933Z         "unit"
2026-08-28T09:54:48.6870187Z       ],
2026-08-28T09:54:48.6870454Z       "stages": {
2026-08-28T09:54:48.6870721Z         "doc": {
2026-08-28T09:54:48.6870998Z           "complete": true,
2026-08-28T09:54:48.6871279Z           "evidence": [
2026-08-28T09:54:48.6871535Z             {
2026-08-28T09:54:48.6871904Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.6872171Z               "line": 770
2026-08-28T09:54:48.6872434Z             }
2026-08-28T09:54:48.6872682Z           ]
2026-08-28T09:54:48.6872940Z         },
2026-08-28T09:54:48.6873212Z         "impl": {
2026-08-28T09:54:48.6873488Z           "complete": true,
2026-08-28T09:54:48.6873769Z           "evidence": [
2026-08-28T09:54:48.6874021Z             {
2026-08-28T09:54:48.6874350Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6874625Z               "line": 6163
2026-08-28T09:54:48.6874944Z             },
2026-08-28T09:54:48.6875192Z             {
2026-08-28T09:54:48.6875516Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6875793Z               "line": 6170
2026-08-28T09:54:48.6876044Z             },
2026-08-28T09:54:48.6876302Z             {
2026-08-28T09:54:48.6876612Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6876888Z               "line": 6540
2026-08-28T09:54:48.6877149Z             },
2026-08-28T09:54:48.6877406Z             {
2026-08-28T09:54:48.6877721Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6877992Z               "line": 6719
2026-08-28T09:54:48.6878244Z             },
2026-08-28T09:54:48.6878497Z             {
2026-08-28T09:54:48.6878812Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6879170Z               "line": 6751
2026-08-28T09:54:48.6879436Z             },
2026-08-28T09:54:48.6879695Z             {
2026-08-28T09:54:48.6880013Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6880285Z               "line": 6804
2026-08-28T09:54:48.6880546Z             },
2026-08-28T09:54:48.6880804Z             {
2026-08-28T09:54:48.6881114Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6881386Z               "line": 6930
2026-08-28T09:54:48.6881639Z             },
2026-08-28T09:54:48.6881897Z             {
2026-08-28T09:54:48.6882271Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6882546Z               "line": 6948
2026-08-28T09:54:48.6882803Z             },
2026-08-28T09:54:48.6883055Z             {
2026-08-28T09:54:48.6883394Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6883657Z               "line": 38
2026-08-28T09:54:48.6883919Z             },
2026-08-28T09:54:48.6884177Z             {
2026-08-28T09:54:48.6884516Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6884783Z               "line": 56
2026-08-28T09:54:48.6885100Z             },
2026-08-28T09:54:48.6885361Z             {
2026-08-28T09:54:48.6885680Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6885951Z               "line": 86
2026-08-28T09:54:48.6886200Z             }
2026-08-28T09:54:48.6886466Z           ]
2026-08-28T09:54:48.6886716Z         },
2026-08-28T09:54:48.6886978Z         "int": {
2026-08-28T09:54:48.6887259Z           "complete": false,
2026-08-28T09:54:48.6887543Z           "evidence": []
2026-08-28T09:54:48.6887808Z         },
2026-08-28T09:54:48.6888062Z         "unit": {
2026-08-28T09:54:48.6888347Z           "complete": true,
2026-08-28T09:54:48.6888620Z           "evidence": [
2026-08-28T09:54:48.6888877Z             {
2026-08-28T09:54:48.6889264Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6889540Z               "line": 27416
2026-08-28T09:54:48.6889792Z             },
2026-08-28T09:54:48.6890049Z             {
2026-08-28T09:54:48.6890373Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6890644Z               "line": 27615
2026-08-28T09:54:48.6890907Z             },
2026-08-28T09:54:48.6891160Z             {
2026-08-28T09:54:48.6891480Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6891746Z               "line": 27659
2026-08-28T09:54:48.6892008Z             },
2026-08-28T09:54:48.6892256Z             {
2026-08-28T09:54:48.6892589Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6892868Z               "line": 354
2026-08-28T09:54:48.6893193Z             },
2026-08-28T09:54:48.6893455Z             {
2026-08-28T09:54:48.6893788Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6894060Z               "line": 378
2026-08-28T09:54:48.6894317Z             },
2026-08-28T09:54:48.6894569Z             {
2026-08-28T09:54:48.6894903Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6895176Z               "line": 392
2026-08-28T09:54:48.6895551Z             },
2026-08-28T09:54:48.6895815Z             {
2026-08-28T09:54:48.6896168Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6896579Z               "line": 473
2026-08-28T09:54:48.6896831Z             },
2026-08-28T09:54:48.6897089Z             {
2026-08-28T09:54:48.6897422Z               "path": "crates/spt/src/unlisted.rs",
2026-08-28T09:54:48.6897694Z               "line": 784
2026-08-28T09:54:48.6897944Z             }
2026-08-28T09:54:48.6898203Z           ]
2026-08-28T09:54:48.6898458Z         }
2026-08-28T09:54:48.6898716Z       }
2026-08-28T09:54:48.6899078Z     },
2026-08-28T09:54:48.6899335Z     {
2026-08-28T09:54:48.6899608Z       "id": "REQ-UPD-1",
2026-08-28T09:54:48.6899961Z       "title": "Peer-propagated update over P2P",
2026-08-28T09:54:48.6900241Z       "requiredStages": [
2026-08-28T09:54:48.6900500Z         "impl",
2026-08-28T09:54:48.6900763Z         "unit",
2026-08-28T09:54:48.6901018Z         "int"
2026-08-28T09:54:48.6901276Z       ],
2026-08-28T09:54:48.6901538Z       "stages": {
2026-08-28T09:54:48.6901801Z         "doc": {
2026-08-28T09:54:48.6902082Z           "complete": false,
2026-08-28T09:54:48.6902369Z           "evidence": []
2026-08-28T09:54:48.6902616Z         },
2026-08-28T09:54:48.6902878Z         "impl": {
2026-08-28T09:54:48.6903163Z           "complete": true,
2026-08-28T09:54:48.6903433Z           "evidence": [
2026-08-28T09:54:48.6903691Z             {
2026-08-28T09:54:48.6904067Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.6904401Z               "line": 28
2026-08-28T09:54:48.6904663Z             },
2026-08-28T09:54:48.6904921Z             {
2026-08-28T09:54:48.6905288Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.6905565Z               "line": 104
2026-08-28T09:54:48.6905822Z             },
2026-08-28T09:54:48.6906078Z             {
2026-08-28T09:54:48.6906481Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.6906752Z               "line": 343
2026-08-28T09:54:48.6907057Z             },
2026-08-28T09:54:48.6907306Z             {
2026-08-28T09:54:48.6907673Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.6907944Z               "line": 22
2026-08-28T09:54:48.6908340Z             },
2026-08-28T09:54:48.6908668Z             {
2026-08-28T09:54:48.6909110Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.6909377Z               "line": 212
2026-08-28T09:54:48.6909619Z             },
2026-08-28T09:54:48.6909868Z             {
2026-08-28T09:54:48.6910229Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.6910507Z               "line": 320
2026-08-28T09:54:48.6910755Z             },
2026-08-28T09:54:48.6911004Z             {
2026-08-28T09:54:48.6911380Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.6911650Z               "line": 377
2026-08-28T09:54:48.6911912Z             },
2026-08-28T09:54:48.6912165Z             {
2026-08-28T09:54:48.6912522Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:48.6912794Z               "line": 37
2026-08-28T09:54:48.6913057Z             }
2026-08-28T09:54:48.6913314Z           ]
2026-08-28T09:54:48.6913564Z         },
2026-08-28T09:54:48.6913828Z         "int": {
2026-08-28T09:54:48.6914111Z           "complete": true,
2026-08-28T09:54:48.6914393Z           "evidence": [
2026-08-28T09:54:48.6914650Z             {
2026-08-28T09:54:48.6915041Z               "path": "crates/spt-daemon/tests/dispatch.rs",
2026-08-28T09:54:48.6915399Z               "line": 231
2026-08-28T09:54:48.6915661Z             },
2026-08-28T09:54:48.6915919Z             {
2026-08-28T09:54:48.6916310Z               "path": "crates/spt-daemon/tests/twohost.rs",
2026-08-28T09:54:48.6916581Z               "line": 2115
2026-08-28T09:54:48.6916842Z             }
2026-08-28T09:54:48.6917098Z           ]
2026-08-28T09:54:48.6917355Z         },
2026-08-28T09:54:48.6917622Z         "unit": {
2026-08-28T09:54:48.6917904Z           "complete": true,
2026-08-28T09:54:48.6918190Z           "evidence": [
2026-08-28T09:54:48.6918448Z             {
2026-08-28T09:54:48.6918872Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.6919223Z               "line": 558
2026-08-28T09:54:48.6922506Z             },
2026-08-28T09:54:48.6922763Z             {
2026-08-28T09:54:48.6923136Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.6923421Z               "line": 684
2026-08-28T09:54:48.6923678Z             },
2026-08-28T09:54:48.6923940Z             {
2026-08-28T09:54:48.6924336Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:48.6924605Z               "line": 371
2026-08-28T09:54:48.6924864Z             },
2026-08-28T09:54:48.6925116Z             {
2026-08-28T09:54:48.6925478Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:48.6925751Z               "line": 124
2026-08-28T09:54:48.6926012Z             },
2026-08-28T09:54:48.6926274Z             {
2026-08-28T09:54:48.6926638Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:48.6926913Z               "line": 200
2026-08-28T09:54:48.6927165Z             }
2026-08-28T09:54:48.6927420Z           ]
2026-08-28T09:54:48.6927673Z         }
2026-08-28T09:54:48.6927960Z       }
2026-08-28T09:54:48.6928216Z     },
2026-08-28T09:54:48.6928464Z     {
2026-08-28T09:54:48.6928746Z       "id": "REQ-UPD-2",
2026-08-28T09:54:48.6929360Z       "title": "All binaries signature-verified before handoff",
2026-08-28T09:54:48.6929652Z       "requiredStages": [
2026-08-28T09:54:48.6929917Z         "impl",
2026-08-28T09:54:48.6930168Z         "unit"
2026-08-28T09:54:48.6930429Z       ],
2026-08-28T09:54:48.6930687Z       "stages": {
2026-08-28T09:54:48.6930950Z         "doc": {
2026-08-28T09:54:48.6931232Z           "complete": false,
2026-08-28T09:54:48.6931509Z           "evidence": []
2026-08-28T09:54:48.6931766Z         },
2026-08-28T09:54:48.6932022Z         "impl": {
2026-08-28T09:54:48.6932304Z           "complete": true,
2026-08-28T09:54:48.6932637Z           "evidence": [
2026-08-28T09:54:48.6932890Z             {
2026-08-28T09:54:48.6933275Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.6933553Z               "line": 344
2026-08-28T09:54:48.6933805Z             },
2026-08-28T09:54:48.6934068Z             {
2026-08-28T09:54:48.6934463Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.6934731Z               "line": 511
2026-08-28T09:54:48.6934991Z             },
2026-08-28T09:54:48.6935246Z             {
2026-08-28T09:54:48.6935604Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6935866Z               "line": 29
2026-08-28T09:54:48.6936123Z             },
2026-08-28T09:54:48.6936377Z             {
2026-08-28T09:54:48.6936739Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6937015Z               "line": 358
2026-08-28T09:54:48.6937269Z             },
2026-08-28T09:54:48.6937527Z             {
2026-08-28T09:54:48.6937887Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6938157Z               "line": 375
2026-08-28T09:54:48.6938409Z             },
2026-08-28T09:54:48.6938666Z             {
2026-08-28T09:54:48.6939173Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6939440Z               "line": 495
2026-08-28T09:54:48.6939702Z             },
2026-08-28T09:54:48.6939949Z             {
2026-08-28T09:54:48.6940315Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6940660Z               "line": 645
2026-08-28T09:54:48.6940919Z             },
2026-08-28T09:54:48.6941172Z             {
2026-08-28T09:54:48.6941539Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6941815Z               "line": 155
2026-08-28T09:54:48.6942064Z             }
2026-08-28T09:54:48.6942326Z           ]
2026-08-28T09:54:48.6942578Z         },
2026-08-28T09:54:48.6942840Z         "int": {
2026-08-28T09:54:48.6943126Z           "complete": false,
2026-08-28T09:54:48.6943408Z           "evidence": []
2026-08-28T09:54:48.6943660Z         },
2026-08-28T09:54:48.6943922Z         "unit": {
2026-08-28T09:54:48.6944213Z           "complete": true,
2026-08-28T09:54:48.6944576Z           "evidence": [
2026-08-28T09:54:48.6944832Z             {
2026-08-28T09:54:48.6945195Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6945470Z               "line": 945
2026-08-28T09:54:48.6945730Z             },
2026-08-28T09:54:48.6945989Z             {
2026-08-28T09:54:48.6946355Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6946632Z               "line": 1006
2026-08-28T09:54:48.6946894Z             },
2026-08-28T09:54:48.6947147Z             {
2026-08-28T09:54:48.6947505Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6947777Z               "line": 1020
2026-08-28T09:54:48.6948039Z             },
2026-08-28T09:54:48.6948285Z             {
2026-08-28T09:54:48.6948659Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6948926Z               "line": 1036
2026-08-28T09:54:48.6949274Z             },
2026-08-28T09:54:48.6949537Z             {
2026-08-28T09:54:48.6949899Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.6950175Z               "line": 1127
2026-08-28T09:54:48.6950424Z             },
2026-08-28T09:54:48.6950739Z             {
2026-08-28T09:54:48.6951093Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6951370Z               "line": 415
2026-08-28T09:54:48.6951627Z             },
2026-08-28T09:54:48.6951879Z             {
2026-08-28T09:54:48.6952242Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6952504Z               "line": 428
2026-08-28T09:54:48.6952766Z             },
2026-08-28T09:54:48.6953042Z             {
2026-08-28T09:54:48.6953424Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:48.6953757Z               "line": 504
2026-08-28T09:54:48.6954015Z             }
2026-08-28T09:54:48.6954273Z           ]
2026-08-28T09:54:48.6954526Z         }
2026-08-28T09:54:48.6954787Z       }
2026-08-28T09:54:48.6955035Z     },
2026-08-28T09:54:48.6955283Z     {
2026-08-28T09:54:48.6955560Z       "id": "REQ-UPD-3",
2026-08-28T09:54:48.6956097Z       "title": "No endpoint process terminates/suspends during self-update",
2026-08-28T09:54:48.6956390Z       "requiredStages": [
2026-08-28T09:54:48.6956652Z         "impl",
2026-08-28T09:54:48.6956911Z         "unit",
2026-08-28T09:54:48.6957154Z         "int"
2026-08-28T09:54:48.6957402Z       ],
2026-08-28T09:54:48.6957659Z       "stages": {
2026-08-28T09:54:48.6957916Z         "doc": {
2026-08-28T09:54:48.6958208Z           "complete": false,
2026-08-28T09:54:48.6958483Z           "evidence": []
2026-08-28T09:54:48.6958738Z         },
2026-08-28T09:54:48.6959083Z         "impl": {
2026-08-28T09:54:48.6959364Z           "complete": true,
2026-08-28T09:54:48.6959635Z           "evidence": [
2026-08-28T09:54:48.6959892Z             {
2026-08-28T09:54:48.6960264Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6960531Z               "line": 40
2026-08-28T09:54:48.6960783Z             },
2026-08-28T09:54:48.6961040Z             {
2026-08-28T09:54:48.6961417Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6961686Z               "line": 301
2026-08-28T09:54:48.6961944Z             },
2026-08-28T09:54:48.6962268Z             {
2026-08-28T09:54:48.6962626Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.6962893Z               "line": 2179
2026-08-28T09:54:48.6963156Z             },
2026-08-28T09:54:48.6963412Z             {
2026-08-28T09:54:48.6963771Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.6964042Z               "line": 8811
2026-08-28T09:54:48.6964298Z             },
2026-08-28T09:54:48.6964551Z             {
2026-08-28T09:54:48.6964913Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6965247Z               "line": 26
2026-08-28T09:54:48.6965576Z             },
2026-08-28T09:54:48.6965829Z             {
2026-08-28T09:54:48.6966200Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6966552Z               "line": 114
2026-08-28T09:54:48.6966817Z             },
2026-08-28T09:54:48.6967071Z             {
2026-08-28T09:54:48.6967437Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6967705Z               "line": 246
2026-08-28T09:54:48.6967958Z             },
2026-08-28T09:54:48.6968214Z             {
2026-08-28T09:54:48.6968519Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.6968805Z               "line": 9249
2026-08-28T09:54:48.6969149Z             }
2026-08-28T09:54:48.6969410Z           ]
2026-08-28T09:54:48.6969661Z         },
2026-08-28T09:54:48.6969919Z         "int": {
2026-08-28T09:54:48.6970200Z           "complete": true,
2026-08-28T09:54:48.6970481Z           "evidence": [
2026-08-28T09:54:48.6970737Z             {
2026-08-28T09:54:48.6971105Z               "path": "crates/spt/tests/brain_survive.rs",
2026-08-28T09:54:48.6971377Z               "line": 58
2026-08-28T09:54:48.6971629Z             }
2026-08-28T09:54:48.6971888Z           ]
2026-08-28T09:54:48.6972134Z         },
2026-08-28T09:54:48.6972394Z         "unit": {
2026-08-28T09:54:48.6972670Z           "complete": true,
2026-08-28T09:54:48.6973009Z           "evidence": [
2026-08-28T09:54:48.6973261Z             {
2026-08-28T09:54:48.6973634Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6973905Z               "line": 799
2026-08-28T09:54:48.6974158Z             },
2026-08-28T09:54:48.6974412Z             {
2026-08-28T09:54:48.6974783Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6975059Z               "line": 884
2026-08-28T09:54:48.6975473Z             },
2026-08-28T09:54:48.6975731Z             {
2026-08-28T09:54:48.6976184Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6976451Z               "line": 1041
2026-08-28T09:54:48.6976713Z             },
2026-08-28T09:54:48.6976967Z             {
﻿2026-08-28T09:54:48.6980037Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.6980315Z               "line": 1342
2026-08-28T09:54:48.6980569Z             },
2026-08-28T09:54:48.6980827Z             {
2026-08-28T09:54:48.6981194Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6981470Z               "line": 271
2026-08-28T09:54:48.6981724Z             },
2026-08-28T09:54:48.6981985Z             {
2026-08-28T09:54:48.6982339Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6982617Z               "line": 295
2026-08-28T09:54:48.6982868Z             },
2026-08-28T09:54:48.6983136Z             {
2026-08-28T09:54:48.6983497Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6983775Z               "line": 316
2026-08-28T09:54:48.6984037Z             },
2026-08-28T09:54:48.6984290Z             {
2026-08-28T09:54:48.6984648Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.6984920Z               "line": 332
2026-08-28T09:54:48.6985192Z             }
2026-08-28T09:54:48.6985452Z           ]
2026-08-28T09:54:48.6985709Z         }
2026-08-28T09:54:48.6985957Z       }
2026-08-28T09:54:48.6986211Z     },
2026-08-28T09:54:48.6986463Z     {
2026-08-28T09:54:48.6986831Z       "id": "REQ-UPD-4",
2026-08-28T09:54:48.6987621Z       "title": "Update gated on user confirmation by default; opt-in full-auto",
2026-08-28T09:54:48.6987966Z       "requiredStages": [
2026-08-28T09:54:48.6988220Z         "impl",
2026-08-28T09:54:48.6988482Z         "unit"
2026-08-28T09:54:48.6988734Z       ],
2026-08-28T09:54:48.6989102Z       "stages": {
2026-08-28T09:54:48.6989354Z         "doc": {
2026-08-28T09:54:48.6989630Z           "complete": false,
2026-08-28T09:54:48.6989897Z           "evidence": []
2026-08-28T09:54:48.6990149Z         },
2026-08-28T09:54:48.6990413Z         "impl": {
2026-08-28T09:54:48.6990698Z           "complete": true,
2026-08-28T09:54:48.6990971Z           "evidence": [
2026-08-28T09:54:48.6991223Z             {
2026-08-28T09:54:48.6991697Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6991964Z               "line": 41
2026-08-28T09:54:48.6992221Z             },
2026-08-28T09:54:48.6992478Z             {
2026-08-28T09:54:48.6992846Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6993116Z               "line": 125
2026-08-28T09:54:48.6993372Z             },
2026-08-28T09:54:48.6993625Z             {
2026-08-28T09:54:48.6993992Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6994259Z               "line": 302
2026-08-28T09:54:48.6994512Z             },
2026-08-28T09:54:48.6994759Z             {
2026-08-28T09:54:48.6995127Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.6995398Z               "line": 383
2026-08-28T09:54:48.6995656Z             },
2026-08-28T09:54:48.6995908Z             {
2026-08-28T09:54:48.6996274Z               "path": "crates/spt-daemon/src/consent.rs",
2026-08-28T09:54:48.6996547Z               "line": 23
2026-08-28T09:54:48.6996800Z             },
2026-08-28T09:54:48.6997052Z             {
2026-08-28T09:54:48.6997405Z               "path": "crates/spt-daemon/src/consent.rs",
2026-08-28T09:54:48.6997734Z               "line": 56
2026-08-28T09:54:48.6997991Z             },
2026-08-28T09:54:48.6998247Z             {
2026-08-28T09:54:48.6998597Z               "path": "crates/spt-daemon/src/consent.rs",
2026-08-28T09:54:48.6998864Z               "line": 77
2026-08-28T09:54:48.6999213Z             },
2026-08-28T09:54:48.6999466Z             {
2026-08-28T09:54:48.6999837Z               "path": "crates/spt-daemon/src/lifecycle.rs",
2026-08-28T09:54:48.7000105Z               "line": 859
2026-08-28T09:54:48.7000362Z             },
2026-08-28T09:54:48.7000616Z             {
2026-08-28T09:54:48.7000973Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:48.7001243Z               "line": 132
2026-08-28T09:54:48.7001493Z             },
2026-08-28T09:54:48.7001851Z             {
2026-08-28T09:54:48.7002200Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.7002471Z               "line": 486
2026-08-28T09:54:48.7002733Z             },
2026-08-28T09:54:48.7002990Z             {
2026-08-28T09:54:48.7003300Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7003573Z               "line": 9248
2026-08-28T09:54:48.7003833Z             }
2026-08-28T09:54:48.7004084Z           ]
2026-08-28T09:54:48.7004336Z         },
2026-08-28T09:54:48.7004594Z         "int": {
2026-08-28T09:54:48.7004885Z           "complete": false,
2026-08-28T09:54:48.7005157Z           "evidence": []
2026-08-28T09:54:48.7005411Z         },
2026-08-28T09:54:48.7005668Z         "unit": {
2026-08-28T09:54:48.7005948Z           "complete": true,
2026-08-28T09:54:48.7006235Z           "evidence": [
2026-08-28T09:54:48.7006487Z             {
2026-08-28T09:54:48.7006858Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7007131Z               "line": 880
2026-08-28T09:54:48.7007393Z             },
2026-08-28T09:54:48.7007641Z             {
2026-08-28T09:54:48.7008013Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7008285Z               "line": 1094
2026-08-28T09:54:48.7008614Z             },
2026-08-28T09:54:48.7008869Z             {
2026-08-28T09:54:48.7009316Z               "path": "crates/spt-daemon/src/config.rs",
2026-08-28T09:54:48.7009593Z               "line": 490
2026-08-28T09:54:48.7009845Z             },
2026-08-28T09:54:48.7010102Z             {
2026-08-28T09:54:48.7010459Z               "path": "crates/spt-daemon/src/consent.rs",
2026-08-28T09:54:48.7010736Z               "line": 102
2026-08-28T09:54:48.7010994Z             },
2026-08-28T09:54:48.7011256Z             {
2026-08-28T09:54:48.7011618Z               "path": "crates/spt-daemon/src/consent.rs",
2026-08-28T09:54:48.7011883Z               "line": 123
2026-08-28T09:54:48.7012145Z             },
2026-08-28T09:54:48.7012402Z             {
2026-08-28T09:54:48.7012831Z               "path": "crates/spt-daemon/src/consent.rs",
2026-08-28T09:54:48.7013099Z               "line": 142
2026-08-28T09:54:48.7013361Z             },
2026-08-28T09:54:48.7013613Z             {
2026-08-28T09:54:48.7013956Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.7014227Z               "line": 1279
2026-08-28T09:54:48.7014478Z             },
2026-08-28T09:54:48.7014736Z             {
2026-08-28T09:54:48.7015079Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.7015346Z               "line": 1080
2026-08-28T09:54:48.7015598Z             },
2026-08-28T09:54:48.7015855Z             {
2026-08-28T09:54:48.7016170Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7016442Z               "line": 30928
2026-08-28T09:54:48.7016699Z             }
2026-08-28T09:54:48.7016958Z           ]
2026-08-28T09:54:48.7017208Z         }
2026-08-28T09:54:48.7017456Z       }
2026-08-28T09:54:48.7017709Z     },
2026-08-28T09:54:48.7017963Z     {
2026-08-28T09:54:48.7018253Z       "id": "REQ-UPD-5",
2026-08-28T09:54:48.7018678Z       "title": "spt-core ripple-updates registered adapters",
2026-08-28T09:54:48.7019121Z       "requiredStages": [
2026-08-28T09:54:48.7019382Z         "impl",
2026-08-28T09:54:48.7019637Z         "unit"
2026-08-28T09:54:48.7019896Z       ],
2026-08-28T09:54:48.7020158Z       "stages": {
2026-08-28T09:54:48.7020415Z         "doc": {
2026-08-28T09:54:48.7020700Z           "complete": false,
2026-08-28T09:54:48.7020981Z           "evidence": []
2026-08-28T09:54:48.7021235Z         },
2026-08-28T09:54:48.7021492Z         "impl": {
2026-08-28T09:54:48.7021765Z           "complete": true,
2026-08-28T09:54:48.7022027Z           "evidence": [
2026-08-28T09:54:48.7022291Z             {
2026-08-28T09:54:48.7022690Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7022972Z               "line": 27
2026-08-28T09:54:48.7023229Z             },
2026-08-28T09:54:48.7023486Z             {
2026-08-28T09:54:48.7023950Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7024226Z               "line": 87
2026-08-28T09:54:48.7024488Z             },
2026-08-28T09:54:48.7024735Z             {
2026-08-28T09:54:48.7025147Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7025519Z               "line": 145
2026-08-28T09:54:48.7025776Z             },
2026-08-28T09:54:48.7026053Z             {
2026-08-28T09:54:48.7026416Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7026683Z               "line": 579
2026-08-28T09:54:48.7026935Z             },
2026-08-28T09:54:48.7027185Z             {
2026-08-28T09:54:48.7027551Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7027817Z               "line": 633
2026-08-28T09:54:48.7028069Z             }
2026-08-28T09:54:48.7028340Z           ]
2026-08-28T09:54:48.7028589Z         },
2026-08-28T09:54:48.7028842Z         "int": {
2026-08-28T09:54:48.7029218Z           "complete": false,
2026-08-28T09:54:48.7029476Z           "evidence": []
2026-08-28T09:54:48.7029721Z         },
2026-08-28T09:54:48.7029980Z         "unit": {
2026-08-28T09:54:48.7030283Z           "complete": true,
2026-08-28T09:54:48.7030640Z           "evidence": [
2026-08-28T09:54:48.7030897Z             {
2026-08-28T09:54:48.7031295Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7031571Z               "line": 278
2026-08-28T09:54:48.7031828Z             },
2026-08-28T09:54:48.7032076Z             {
2026-08-28T09:54:48.7032476Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7032743Z               "line": 292
2026-08-28T09:54:48.7033008Z             },
2026-08-28T09:54:48.7033255Z             {
2026-08-28T09:54:48.7033656Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7033928Z               "line": 306
2026-08-28T09:54:48.7034190Z             },
2026-08-28T09:54:48.7034447Z             {
2026-08-28T09:54:48.7034892Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7035197Z               "line": 320
2026-08-28T09:54:48.7035452Z             },
2026-08-28T09:54:48.7035812Z             {
2026-08-28T09:54:48.7036247Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7036518Z               "line": 354
2026-08-28T09:54:48.7036781Z             },
2026-08-28T09:54:48.7037038Z             {
2026-08-28T09:54:48.7037411Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.7037683Z               "line": 1579
2026-08-28T09:54:48.7037944Z             }
2026-08-28T09:54:48.7038195Z           ]
2026-08-28T09:54:48.7038454Z         }
2026-08-28T09:54:48.7038697Z       }
2026-08-28T09:54:48.7039040Z     },
2026-08-28T09:54:48.7039292Z     {
2026-08-28T09:54:48.7039573Z       "id": "REQ-UPD-6",
2026-08-28T09:54:48.7042231Z       "title": "Platform-targeted update sets and debug rollout: signed multi-platform update metadata, recipient platform selection, channel-scoped monotonic counters, debug-channel opt-in via release-key overlay, local staging plus pull-based peer propagation, and maintainer-only convergence tooling (ADR-0016)",
2026-08-28T09:54:48.7042607Z       "requiredStages": [
2026-08-28T09:54:48.7042866Z         "doc",
2026-08-28T09:54:48.7043128Z         "impl",
2026-08-28T09:54:48.7043388Z         "unit",
2026-08-28T09:54:48.7043644Z         "int"
2026-08-28T09:54:48.7043897Z       ],
2026-08-28T09:54:48.7044164Z       "stages": {
2026-08-28T09:54:48.7044422Z         "doc": {
2026-08-28T09:54:48.7044711Z           "complete": true,
2026-08-28T09:54:48.7044983Z           "evidence": [
2026-08-28T09:54:48.7045241Z             {
2026-08-28T09:54:48.7045589Z               "path": "docs/DEBUG-CONVERGE-PLAN.md",
2026-08-28T09:54:48.7045855Z               "line": 3
2026-08-28T09:54:48.7046121Z             },
2026-08-28T09:54:48.7046372Z             {
2026-08-28T09:54:48.7046798Z               "path": "docs/DEBUG-ROLLOUT.md",
2026-08-28T09:54:48.7047150Z               "line": 3
2026-08-28T09:54:48.7047402Z             },
2026-08-28T09:54:48.7047647Z             {
2026-08-28T09:54:48.7048103Z               "path": "docs/adr/0016-platform-targeted-update-sets.md",
2026-08-28T09:54:48.7048366Z               "line": 3
2026-08-28T09:54:48.7048610Z             }
2026-08-28T09:54:48.7048889Z           ]
2026-08-28T09:54:48.7049213Z         },
2026-08-28T09:54:48.7049480Z         "impl": {
2026-08-28T09:54:48.7049747Z           "complete": true,
2026-08-28T09:54:48.7050029Z           "evidence": [
2026-08-28T09:54:48.7050277Z             {
2026-08-28T09:54:48.7050662Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7050934Z               "line": 85
2026-08-28T09:54:48.7051191Z             },
2026-08-28T09:54:48.7051446Z             {
2026-08-28T09:54:48.7051819Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7052095Z               "line": 253
2026-08-28T09:54:48.7052352Z             },
2026-08-28T09:54:48.7052610Z             {
2026-08-28T09:54:48.7052977Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7053254Z               "line": 279
2026-08-28T09:54:48.7053587Z             },
2026-08-28T09:54:48.7053844Z             {
2026-08-28T09:54:48.7054213Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7054476Z               "line": 70
2026-08-28T09:54:48.7054739Z             },
2026-08-28T09:54:48.7054987Z             {
2026-08-28T09:54:48.7055353Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7055626Z               "line": 134
2026-08-28T09:54:48.7055882Z             },
2026-08-28T09:54:48.7056140Z             {
2026-08-28T09:54:48.7056510Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7056789Z               "line": 244
2026-08-28T09:54:48.7057038Z             },
2026-08-28T09:54:48.7057296Z             {
2026-08-28T09:54:48.7057734Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7057991Z               "line": 441
2026-08-28T09:54:48.7058254Z             },
2026-08-28T09:54:48.7058507Z             {
2026-08-28T09:54:48.7058889Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7059250Z               "line": 569
2026-08-28T09:54:48.7059507Z             },
2026-08-28T09:54:48.7059759Z             {
2026-08-28T09:54:48.7060137Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7060418Z               "line": 583
2026-08-28T09:54:48.7060670Z             },
2026-08-28T09:54:48.7060918Z             {
2026-08-28T09:54:48.7061289Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7061556Z               "line": 638
2026-08-28T09:54:48.7061803Z             },
2026-08-28T09:54:48.7062059Z             {
2026-08-28T09:54:48.7062431Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7062704Z               "line": 669
2026-08-28T09:54:48.7062970Z             },
2026-08-28T09:54:48.7063227Z             {
2026-08-28T09:54:48.7068331Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:48.7068728Z               "line": 271
2026-08-28T09:54:48.7069091Z             },
2026-08-28T09:54:48.7069358Z             {
2026-08-28T09:54:48.7069754Z               "path": "crates/spt-daemon/src/pump/update.rs",
2026-08-28T09:54:48.7070033Z               "line": 318
2026-08-28T09:54:48.7070286Z             },
2026-08-28T09:54:48.7070543Z             {
2026-08-28T09:54:48.7070915Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7071187Z               "line": 83
2026-08-28T09:54:48.7071439Z             },
2026-08-28T09:54:48.7071684Z             {
2026-08-28T09:54:48.7072064Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7072356Z               "line": 119
2026-08-28T09:54:48.7072607Z             },
2026-08-28T09:54:48.7072929Z             {
2026-08-28T09:54:48.7073296Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7073559Z               "line": 190
2026-08-28T09:54:48.7073815Z             },
2026-08-28T09:54:48.7074063Z             {
2026-08-28T09:54:48.7074436Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7074712Z               "line": 265
2026-08-28T09:54:48.7074964Z             },
2026-08-28T09:54:48.7075221Z             {
2026-08-28T09:54:48.7075705Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7076112Z               "line": 329
2026-08-28T09:54:48.7076358Z             },
2026-08-28T09:54:48.7076611Z             {
2026-08-28T09:54:48.7076969Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7077236Z               "line": 360
2026-08-28T09:54:48.7077494Z             },
2026-08-28T09:54:48.7077741Z             {
2026-08-28T09:54:48.7078106Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7078382Z               "line": 383
2026-08-28T09:54:48.7078644Z             },
2026-08-28T09:54:48.7078896Z             {
2026-08-28T09:54:48.7079355Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7079779Z               "line": 425
2026-08-28T09:54:48.7080032Z             },
2026-08-28T09:54:48.7080286Z             {
2026-08-28T09:54:48.7080656Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7080927Z               "line": 435
2026-08-28T09:54:48.7081184Z             },
2026-08-28T09:54:48.7081442Z             {
2026-08-28T09:54:48.7081809Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7082081Z               "line": 447
2026-08-28T09:54:48.7082342Z             },
2026-08-28T09:54:48.7082597Z             {
2026-08-28T09:54:48.7082965Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7083232Z               "line": 457
2026-08-28T09:54:48.7083494Z             },
2026-08-28T09:54:48.7083829Z             {
2026-08-28T09:54:48.7084195Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7084467Z               "line": 476
2026-08-28T09:54:48.7084725Z             },
2026-08-28T09:54:48.7084981Z             {
2026-08-28T09:54:48.7085340Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7085601Z               "line": 486
2026-08-28T09:54:48.7085851Z             },
2026-08-28T09:54:48.7086109Z             {
2026-08-28T09:54:48.7086467Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7086738Z               "line": 94
2026-08-28T09:54:48.7087001Z             },
2026-08-28T09:54:48.7087252Z             {
2026-08-28T09:54:48.7087606Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7087868Z               "line": 120
2026-08-28T09:54:48.7088124Z             },
2026-08-28T09:54:48.7088371Z             {
2026-08-28T09:54:48.7088742Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7089104Z               "line": 135
2026-08-28T09:54:48.7089367Z             },
2026-08-28T09:54:48.7089624Z             {
2026-08-28T09:54:48.7090048Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7090329Z               "line": 181
2026-08-28T09:54:48.7090587Z             },
2026-08-28T09:54:48.7090841Z             {
2026-08-28T09:54:48.7091197Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7091473Z               "line": 193
2026-08-28T09:54:48.7091725Z             },
2026-08-28T09:54:48.7091988Z             {
2026-08-28T09:54:48.7092355Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7092622Z               "line": 264
2026-08-28T09:54:48.7092884Z             },
2026-08-28T09:54:48.7093133Z             {
2026-08-28T09:54:48.7093502Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7093774Z               "line": 538
2026-08-28T09:54:48.7094093Z             },
2026-08-28T09:54:48.7094346Z             {
2026-08-28T09:54:48.7094718Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7094990Z               "line": 682
2026-08-28T09:54:48.7095246Z             },
2026-08-28T09:54:48.7095504Z             {
2026-08-28T09:54:48.7095876Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.7096146Z               "line": 171
2026-08-28T09:54:48.7096402Z             },
2026-08-28T09:54:48.7096659Z             {
2026-08-28T09:54:48.7097027Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:48.7097289Z               "line": 65
2026-08-28T09:54:48.7097546Z             },
2026-08-28T09:54:48.7097799Z             {
2026-08-28T09:54:48.7098162Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:48.7098428Z               "line": 71
2026-08-28T09:54:48.7098684Z             },
2026-08-28T09:54:48.7099025Z             {
2026-08-28T09:54:48.7099392Z               "path": "crates/spt-net/src/net/update.rs",
2026-08-28T09:54:48.7099669Z               "line": 77
2026-08-28T09:54:48.7099918Z             },
2026-08-28T09:54:48.7100175Z             {
2026-08-28T09:54:48.7100499Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7100851Z               "line": 1625
2026-08-28T09:54:48.7101106Z             },
2026-08-28T09:54:48.7101363Z             {
2026-08-28T09:54:48.7101689Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7101966Z               "line": 1642
2026-08-28T09:54:48.7102224Z             },
2026-08-28T09:54:48.7102477Z             {
2026-08-28T09:54:48.7102806Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7103073Z               "line": 1696
2026-08-28T09:54:48.7103331Z             },
2026-08-28T09:54:48.7103583Z             {
2026-08-28T09:54:48.7103910Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7104180Z               "line": 1766
2026-08-28T09:54:48.7104438Z             },
2026-08-28T09:54:48.7104753Z             {
2026-08-28T09:54:48.7105072Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7105339Z               "line": 1914
2026-08-28T09:54:48.7105592Z             },
2026-08-28T09:54:48.7105860Z             {
2026-08-28T09:54:48.7106180Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7106451Z               "line": 2064
2026-08-28T09:54:48.7106716Z             }
2026-08-28T09:54:48.7106971Z           ]
2026-08-28T09:54:48.7107229Z         },
2026-08-28T09:54:48.7107482Z         "int": {
2026-08-28T09:54:48.7107773Z           "complete": true,
2026-08-28T09:54:48.7108039Z           "evidence": [
2026-08-28T09:54:48.7108283Z             {
2026-08-28T09:54:48.7108673Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:48.7109027Z               "line": 663
2026-08-28T09:54:48.7109283Z             },
2026-08-28T09:54:48.7109538Z             {
2026-08-28T09:54:48.7109881Z               "path": "docs/DEBUG-CONVERGE-PLAN.md",
2026-08-28T09:54:48.7110154Z               "line": 135
2026-08-28T09:54:48.7110411Z             }
2026-08-28T09:54:48.7110659Z           ]
2026-08-28T09:54:48.7110983Z         },
2026-08-28T09:54:48.7111245Z         "unit": {
2026-08-28T09:54:48.7111531Z           "complete": true,
2026-08-28T09:54:48.7111803Z           "evidence": [
2026-08-28T09:54:48.7112051Z             {
2026-08-28T09:54:48.7112431Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7112699Z               "line": 1014
2026-08-28T09:54:48.7112956Z             },
2026-08-28T09:54:48.7113209Z             {
2026-08-28T09:54:48.7113582Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7113848Z               "line": 1063
2026-08-28T09:54:48.7114110Z             },
2026-08-28T09:54:48.7114362Z             {
2026-08-28T09:54:48.7114730Z               "path": "crates/spt-daemon/src/propagate.rs",
2026-08-28T09:54:48.7115008Z               "line": 731
2026-08-28T09:54:48.7115317Z             },
2026-08-28T09:54:48.7115575Z             {
2026-08-28T09:54:48.7115937Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7116219Z               "line": 581
2026-08-28T09:54:48.7116472Z             },
2026-08-28T09:54:48.7116740Z             {
2026-08-28T09:54:48.7117106Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7117376Z               "line": 706
2026-08-28T09:54:48.7117636Z             },
2026-08-28T09:54:48.7117884Z             {
2026-08-28T09:54:48.7118255Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7118523Z               "line": 743
2026-08-28T09:54:48.7118781Z             },
2026-08-28T09:54:48.7119124Z             {
2026-08-28T09:54:48.7119486Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7119763Z               "line": 1142
2026-08-28T09:54:48.7120014Z             },
2026-08-28T09:54:48.7120270Z             {
2026-08-28T09:54:48.7120628Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7120909Z               "line": 1164
2026-08-28T09:54:48.7121161Z             },
2026-08-28T09:54:48.7121419Z             {
2026-08-28T09:54:48.7121791Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7122134Z               "line": 1181
2026-08-28T09:54:48.7122391Z             },
2026-08-28T09:54:48.7122639Z             {
2026-08-28T09:54:48.7123001Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7123274Z               "line": 1196
2026-08-28T09:54:48.7123531Z             },
2026-08-28T09:54:48.7123783Z             {
2026-08-28T09:54:48.7124147Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7124418Z               "line": 1222
2026-08-28T09:54:48.7124665Z             },
2026-08-28T09:54:48.7124917Z             {
2026-08-28T09:54:48.7125415Z               "path": "crates/spt-daemon/src/update.rs",
2026-08-28T09:54:48.7125711Z               "line": 458
2026-08-28T09:54:48.7126031Z             },
2026-08-28T09:54:48.7126282Z             {
2026-08-28T09:54:48.7126660Z               "path": "crates/spt-daemon/tests/propagate.rs",
2026-08-28T09:54:48.7126936Z               "line": 432
2026-08-28T09:54:48.7127222Z             },
2026-08-28T09:54:48.7127470Z             {
2026-08-28T09:54:48.7127784Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7128049Z               "line": 34562
2026-08-28T09:54:48.7128301Z             },
2026-08-28T09:54:48.7128554Z             {
2026-08-28T09:54:48.7128873Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7129237Z               "line": 1723
2026-08-28T09:54:48.7129493Z             },
2026-08-28T09:54:48.7129751Z             {
2026-08-28T09:54:48.7130061Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7130332Z               "line": 1745
2026-08-28T09:54:48.7130584Z             },
2026-08-28T09:54:48.7130840Z             {
2026-08-28T09:54:48.7131155Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7131430Z               "line": 2205
2026-08-28T09:54:48.7131692Z             },
2026-08-28T09:54:48.7131941Z             {
2026-08-28T09:54:48.7132360Z               "path": "docs/DEBUG-CONVERGE-PLAN.md",
2026-08-28T09:54:48.7132628Z               "line": 130
2026-08-28T09:54:48.7132889Z             }
2026-08-28T09:54:48.7133143Z           ]
2026-08-28T09:54:48.7133399Z         }
2026-08-28T09:54:48.7133656Z       }
2026-08-28T09:54:48.7133913Z     },
2026-08-28T09:54:48.7134163Z     {
2026-08-28T09:54:48.7134443Z       "id": "REQ-UPD-7",
2026-08-28T09:54:48.7140502Z       "title": "Origin-source update bootstrap (`spt update fetch`): pull the latest signed release directly from the GitHub release origin (`SaberMage/spt-releases`) — the per-platform artifact + its `<asset>.release.json` SignedRelease metadata — and stage it through the EXISTING verify→stage pipeline (the same `plan_verified` gate: two-key signature + channel + monotonic rollback floor + SHA-256), after which the normal consent-notif / `spt update apply` flow is unchanged. Closes the peer-only-discovery gap (REQ-UPD-1): a first-in-fleet / isolated node can update with no peer to pull from. The signed-release anchor keeps the GitHub transport untrusted-but-verified.",
2026-08-28T09:54:48.7140902Z       "requiredStages": [
2026-08-28T09:54:48.7141162Z         "impl",
2026-08-28T09:54:48.7141419Z         "unit"
2026-08-28T09:54:48.7141666Z       ],
2026-08-28T09:54:48.7141937Z       "stages": {
2026-08-28T09:54:48.7142191Z         "doc": {
2026-08-28T09:54:48.7142477Z           "complete": false,
2026-08-28T09:54:48.7142744Z           "evidence": []
2026-08-28T09:54:48.7143007Z         },
2026-08-28T09:54:48.7143264Z         "impl": {
2026-08-28T09:54:48.7143560Z           "complete": true,
2026-08-28T09:54:48.7143830Z           "evidence": [
2026-08-28T09:54:48.7144084Z             {
2026-08-28T09:54:48.7144403Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7144679Z               "line": 10523
2026-08-28T09:54:48.7144942Z             }
2026-08-28T09:54:48.7145309Z           ]
2026-08-28T09:54:48.7145586Z         },
2026-08-28T09:54:48.7145843Z         "int": {
2026-08-28T09:54:48.7146141Z           "complete": false,
2026-08-28T09:54:48.7146502Z           "evidence": []
2026-08-28T09:54:48.7146745Z         },
2026-08-28T09:54:48.7147007Z         "unit": {
2026-08-28T09:54:48.7147285Z           "complete": true,
2026-08-28T09:54:48.7147565Z           "evidence": [
2026-08-28T09:54:48.7147828Z             {
2026-08-28T09:54:48.7148148Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7148420Z               "line": 34480
2026-08-28T09:54:48.7148677Z             }
2026-08-28T09:54:48.7148928Z           ]
2026-08-28T09:54:48.7149278Z         }
2026-08-28T09:54:48.7149536Z       }
2026-08-28T09:54:48.7149784Z     },
2026-08-28T09:54:48.7150042Z     {
2026-08-28T09:54:48.7150318Z       "id": "REQ-UPD-8",
2026-08-28T09:54:48.7157572Z       "title": "Platform-safe `spt update fetch` + apply platform-guard (v0.3.1 cross-OS brick fix): `spt update fetch` stages the signed multi-platform `SignedUpdateSet` (`update-set.json` + every platform artifact it names), never a platform-blind single `SignedRelease`, so local apply selects `current_platform()` and P2P re-serve lets each peer select ITS own platform. Defense-in-depth: `apply_staged` REFUSES a staged single-release artifact unless it is platform-stamped for THIS node (an unstamped pre-v0.3.2 single, or a single stamped for another OS, fail-safe refuses — the guard that alone prevents the v0.3.1 brick where a Linux ELF was applied as `spt.exe`). UX: a friendly post-apply message (`Updated spt-core to vX.Y.Z.` + changelog URL) driven by an additive `product_version` metadata field, with a release-counter fallback when absent.",
2026-08-28T09:54:48.7157953Z       "requiredStages": [
2026-08-28T09:54:48.7158216Z         "impl",
2026-08-28T09:54:48.7158473Z         "unit"
2026-08-28T09:54:48.7158723Z       ],
2026-08-28T09:54:48.7159075Z       "stages": {
2026-08-28T09:54:48.7159343Z         "doc": {
2026-08-28T09:54:48.7159626Z           "complete": false,
2026-08-28T09:54:48.7159900Z           "evidence": []
2026-08-28T09:54:48.7160215Z         },
2026-08-28T09:54:48.7160477Z         "impl": {
2026-08-28T09:54:48.7160754Z           "complete": true,
2026-08-28T09:54:48.7161021Z           "evidence": [
2026-08-28T09:54:48.7161275Z             {
2026-08-28T09:54:48.7161803Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7162074Z               "line": 86
2026-08-28T09:54:48.7162320Z             },
2026-08-28T09:54:48.7162578Z             {
2026-08-28T09:54:48.7162945Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7163226Z               "line": 49
2026-08-28T09:54:48.7163479Z             },
2026-08-28T09:54:48.7163735Z             {
2026-08-28T09:54:48.7164109Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7164385Z               "line": 157
2026-08-28T09:54:48.7164714Z             },
2026-08-28T09:54:48.7164974Z             {
2026-08-28T09:54:48.7165341Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7165613Z               "line": 220
2026-08-28T09:54:48.7165876Z             },
2026-08-28T09:54:48.7166129Z             {
2026-08-28T09:54:48.7166510Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7166782Z               "line": 235
2026-08-28T09:54:48.7167035Z             },
2026-08-28T09:54:48.7167305Z             {
2026-08-28T09:54:48.7167665Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7167937Z               "line": 252
2026-08-28T09:54:48.7168194Z             },
2026-08-28T09:54:48.7168452Z             {
2026-08-28T09:54:48.7168818Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7169172Z               "line": 274
2026-08-28T09:54:48.7169439Z             },
2026-08-28T09:54:48.7169696Z             {
2026-08-28T09:54:48.7170067Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7170342Z               "line": 66
2026-08-28T09:54:48.7170599Z             },
2026-08-28T09:54:48.7170857Z             {
2026-08-28T09:54:48.7171224Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7171581Z               "line": 154
2026-08-28T09:54:48.7171840Z             },
2026-08-28T09:54:48.7172093Z             {
2026-08-28T09:54:48.7172408Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7172681Z               "line": 9103
2026-08-28T09:54:48.7172932Z             },
2026-08-28T09:54:48.7173186Z             {
2026-08-28T09:54:48.7173505Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7173781Z               "line": 9655
2026-08-28T09:54:48.7174034Z             },
2026-08-28T09:54:48.7174286Z             {
2026-08-28T09:54:48.7174606Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7174872Z               "line": 9665
2026-08-28T09:54:48.7175187Z             },
2026-08-28T09:54:48.7175439Z             {
2026-08-28T09:54:48.7175764Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7176031Z               "line": 10524
2026-08-28T09:54:48.7176284Z             },
2026-08-28T09:54:48.7176546Z             {
2026-08-28T09:54:48.7176855Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7177127Z               "line": 1260
2026-08-28T09:54:48.7177394Z             },
2026-08-28T09:54:48.7177651Z             {
2026-08-28T09:54:48.7177974Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7178245Z               "line": 1279
2026-08-28T09:54:48.7178497Z             }
2026-08-28T09:54:48.7178754Z           ]
2026-08-28T09:54:48.7179093Z         },
2026-08-28T09:54:48.7179350Z         "int": {
2026-08-28T09:54:48.7179637Z           "complete": false,
2026-08-28T09:54:48.7179909Z           "evidence": []
2026-08-28T09:54:48.7180157Z         },
2026-08-28T09:54:48.7180415Z         "unit": {
2026-08-28T09:54:48.7180708Z           "complete": true,
2026-08-28T09:54:48.7180977Z           "evidence": [
2026-08-28T09:54:48.7181231Z             {
2026-08-28T09:54:48.7181684Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7181960Z               "line": 740
2026-08-28T09:54:48.7182213Z             },
2026-08-28T09:54:48.7182466Z             {
2026-08-28T09:54:48.7182827Z               "path": "crates/spt-daemon/src/relcache.rs",
2026-08-28T09:54:48.7183091Z               "line": 648
2026-08-28T09:54:48.7183347Z             },
2026-08-28T09:54:48.7183597Z             {
2026-08-28T09:54:48.7183912Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7184183Z               "line": 34562
2026-08-28T09:54:48.7184432Z             }
2026-08-28T09:54:48.7184684Z           ]
2026-08-28T09:54:48.7184933Z         }
2026-08-28T09:54:48.7185185Z       }
2026-08-28T09:54:48.7185442Z     },
2026-08-28T09:54:48.7185694Z     {
2026-08-28T09:54:48.7185972Z       "id": "REQ-UPD-9",
2026-08-28T09:54:48.7193575Z       "title": "`gh_release` adapter [update] avenue (optional signing): an adapter declares `[update] avenue = \"gh_release\", repo = \"user/repo\"` (+ optional `asset`, default `adapter.spt`; + optional Ed25519 `signing_key`); spt-core's ripple compares the repo's LATEST GitHub release version against the installed adapter version and, when newer, auto-updates by fetching the release `.spt` archive (the REQ-INSTALL-9 `--release` fetch primitive) → verifies the `.spt` against `signing_key` if declared, else HTTPS+GitHub first-acquisition trust → re-extracts + re-registers the adapter root. Lets a harness adapter ship updates from its own GitHub releases with NO signing tooling or plugin coupling (removes the perri file_pull/delegated avenue blockers). Acquisition-trust mirrors `--release` + the installer first-fetch; does not alter spt-core self-update (REQ-UPD-1..8).",
2026-08-28T09:54:48.7193888Z       "requiredStages": [
2026-08-28T09:54:48.7194138Z         "doc",
2026-08-28T09:54:48.7194419Z         "impl",
2026-08-28T09:54:48.7194677Z         "unit"
2026-08-28T09:54:48.7194925Z       ],
2026-08-28T09:54:48.7195193Z       "stages": {
2026-08-28T09:54:48.7195455Z         "doc": {
2026-08-28T09:54:48.7195721Z           "complete": true,
2026-08-28T09:54:48.7196142Z           "evidence": [
2026-08-28T09:54:48.7196400Z             {
2026-08-28T09:54:48.7196692Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7197003Z               "line": 100
2026-08-28T09:54:48.7197255Z             },
2026-08-28T09:54:48.7197509Z             {
2026-08-28T09:54:48.7197814Z               "path": "docs/MANIFEST.md",
2026-08-28T09:54:48.7198077Z               "line": 643
2026-08-28T09:54:48.7198339Z             }
2026-08-28T09:54:48.7198586Z           ]
2026-08-28T09:54:48.7198847Z         },
2026-08-28T09:54:48.7199188Z         "impl": {
2026-08-28T09:54:48.7199469Z           "complete": true,
2026-08-28T09:54:48.7199747Z           "evidence": [
2026-08-28T09:54:48.7199999Z             {
2026-08-28T09:54:48.7200461Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7200729Z               "line": 128
2026-08-28T09:54:48.7200991Z             },
2026-08-28T09:54:48.7201240Z             {
2026-08-28T09:54:48.7201611Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7201886Z               "line": 620
2026-08-28T09:54:48.7202141Z             },
2026-08-28T09:54:48.7202394Z             {
2026-08-28T09:54:48.7202765Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.7203042Z               "line": 698
2026-08-28T09:54:48.7203295Z             },
2026-08-28T09:54:48.7203548Z             {
2026-08-28T09:54:48.7203915Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.7204211Z               "line": 830
2026-08-28T09:54:48.7204467Z             },
2026-08-28T09:54:48.7204717Z             {
2026-08-28T09:54:48.7205085Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.7205356Z               "line": 1315
2026-08-28T09:54:48.7205604Z             },
2026-08-28T09:54:48.7205857Z             {
2026-08-28T09:54:48.7206229Z               "path": "crates/spt-runtime/src/registry.rs",
2026-08-28T09:54:48.7206567Z               "line": 352
2026-08-28T09:54:48.7206834Z             },
2026-08-28T09:54:48.7207097Z             {
2026-08-28T09:54:48.7207402Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7207669Z               "line": 20680
2026-08-28T09:54:48.7207926Z             },
2026-08-28T09:54:48.7208182Z             {
2026-08-28T09:54:48.7208487Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7208756Z               "line": 21205
2026-08-28T09:54:48.7209099Z             },
2026-08-28T09:54:48.7209407Z             {
2026-08-28T09:54:48.7209715Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7209983Z               "line": 21797
2026-08-28T09:54:48.7210240Z             },
2026-08-28T09:54:48.7210493Z             {
2026-08-28T09:54:48.7210870Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7211137Z               "line": 21844
2026-08-28T09:54:48.7211393Z             },
2026-08-28T09:54:48.7211646Z             {
2026-08-28T09:54:48.7211961Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7212232Z               "line": 21867
2026-08-28T09:54:48.7212489Z             },
2026-08-28T09:54:48.7212739Z             {
2026-08-28T09:54:48.7213040Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7213316Z               "line": 21893
2026-08-28T09:54:48.7213564Z             }
2026-08-28T09:54:48.7213822Z           ]
2026-08-28T09:54:48.7214075Z         },
2026-08-28T09:54:48.7214323Z         "int": {
2026-08-28T09:54:48.7214599Z           "complete": false,
2026-08-28T09:54:48.7214870Z           "evidence": []
2026-08-28T09:54:48.7215125Z         },
2026-08-28T09:54:48.7215379Z         "unit": {
2026-08-28T09:54:48.7215660Z           "complete": true,
2026-08-28T09:54:48.7216069Z           "evidence": [
2026-08-28T09:54:48.7216351Z             {
2026-08-28T09:54:48.7216784Z               "path": "crates/spt-daemon/src/adapter_update.rs",
2026-08-28T09:54:48.7217051Z               "line": 265
2026-08-28T09:54:48.7217385Z             },
2026-08-28T09:54:48.7217634Z             {
2026-08-28T09:54:48.7217991Z               "path": "crates/spt-daemon/src/release.rs",
2026-08-28T09:54:48.7218263Z               "line": 810
2026-08-28T09:54:48.7218539Z             },
2026-08-28T09:54:48.7218786Z             {
2026-08-28T09:54:48.7219268Z               "path": "crates/spt-runtime/src/manifest.rs",
2026-08-28T09:54:48.7219545Z               "line": 1615
2026-08-28T09:54:48.7219793Z             },
2026-08-28T09:54:48.7220053Z             {
2026-08-28T09:54:48.7220370Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7220637Z               "line": 27776
2026-08-28T09:54:48.7220891Z             }
2026-08-28T09:54:48.7221148Z           ]
2026-08-28T09:54:48.7221396Z         }
2026-08-28T09:54:48.7221711Z       }
2026-08-28T09:54:48.7221963Z     },
2026-08-28T09:54:48.7222211Z     {
2026-08-28T09:54:48.7222540Z       "id": "REQ-UPDATE-ADAPTERS-VERB",
2026-08-28T09:54:48.7229800Z       "title": "THE-FORKENING W4 (operator-grilled 2026-07-14): `spt update adapters [<a>[,<b>...]]` = thin ALIAS over the existing `spt adapter update` engine (cli.rs:748 gh_release avenue; the old verb STAYS — published surface) + comma-list accepted on BOTH forms. Semantics: no names -> all gh_release-avenue registrations; names validated FAIL-FAST against the registry BEFORE any update starts (a typo must not leave a half-updated set); per-adapter failure ISOLATION (one failure doesn't stop the rest) with a per-adapter summary line; nonzero exit if any failed; local-path/dev registrations SKIP loud (not error). Gate: unit — name validation, list parsing, isolation + exit-code aggregation, local-path skip; doc — reference regen (drift-gated). Kin REQ-UPDATE-DEFAULT-COMPOSITE (the caller), REQ-ADAPTER-UPDATE-MESSAGE (per-adapter apply notices ride the summary).",
2026-08-28T09:54:48.7230133Z       "requiredStages": [
2026-08-28T09:54:48.7230396Z         "doc",
2026-08-28T09:54:48.7230733Z         "impl",
2026-08-28T09:54:48.7230993Z         "unit"
2026-08-28T09:54:48.7231255Z       ],
2026-08-28T09:54:48.7231531Z       "stages": {
2026-08-28T09:54:48.7231784Z         "doc": {
2026-08-28T09:54:48.7232132Z           "complete": true,
2026-08-28T09:54:48.7232414Z           "evidence": [
2026-08-28T09:54:48.7232672Z             {
2026-08-28T09:54:48.7232982Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7233249Z               "line": 682
2026-08-28T09:54:48.7233514Z             },
2026-08-28T09:54:48.7233764Z             {
2026-08-28T09:54:48.7234155Z               "path": "docs-site/src/self-update/overview.md",
2026-08-28T09:54:48.7234422Z               "line": 68
2026-08-28T09:54:48.7234680Z             }
2026-08-28T09:54:48.7234932Z           ]
2026-08-28T09:54:48.7235187Z         },
2026-08-28T09:54:48.7235520Z         "impl": {
2026-08-28T09:54:48.7235802Z           "complete": true,
2026-08-28T09:54:48.7236071Z           "evidence": [
2026-08-28T09:54:48.7236326Z             {
2026-08-28T09:54:48.7236646Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7236913Z               "line": 2428
2026-08-28T09:54:48.7237175Z             },
2026-08-28T09:54:48.7237429Z             {
2026-08-28T09:54:48.7237739Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7238015Z               "line": 21363
2026-08-28T09:54:48.7238349Z             },
2026-08-28T09:54:48.7238735Z             {
2026-08-28T09:54:48.7239238Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7239520Z               "line": 21382
2026-08-28T09:54:48.7239769Z             },
2026-08-28T09:54:48.7240026Z             {
2026-08-28T09:54:48.7240341Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7240604Z               "line": 21424
2026-08-28T09:54:48.7240860Z             },
2026-08-28T09:54:48.7241121Z             {
2026-08-28T09:54:48.7241433Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7241701Z               "line": 21448
2026-08-28T09:54:48.7241959Z             },
2026-08-28T09:54:48.7242221Z             {
2026-08-28T09:54:48.7242626Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7242898Z               "line": 21483
2026-08-28T09:54:48.7243147Z             }
2026-08-28T09:54:48.7243403Z           ]
2026-08-28T09:54:48.7243651Z         },
2026-08-28T09:54:48.7243946Z         "int": {
2026-08-28T09:54:48.7244221Z           "complete": false,
2026-08-28T09:54:48.7244488Z           "evidence": []
2026-08-28T09:54:48.7244769Z         },
2026-08-28T09:54:48.7245030Z         "unit": {
2026-08-28T09:54:48.7245297Z           "complete": true,
2026-08-28T09:54:48.7245551Z           "evidence": [
2026-08-28T09:54:48.7245799Z             {
2026-08-28T09:54:48.7246100Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7246367Z               "line": 25351
2026-08-28T09:54:48.7246674Z             },
2026-08-28T09:54:48.7246958Z             {
2026-08-28T09:54:48.7247273Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7247539Z               "line": 25377
2026-08-28T09:54:48.7247797Z             },
2026-08-28T09:54:48.7248045Z             {
2026-08-28T09:54:48.7248360Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7248623Z               "line": 25393
2026-08-28T09:54:48.7248881Z             },
2026-08-28T09:54:48.7249219Z             {
2026-08-28T09:54:48.7249570Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7249847Z               "line": 25567
2026-08-28T09:54:48.7250099Z             }
2026-08-28T09:54:48.7250361Z           ]
2026-08-28T09:54:48.7250610Z         }
2026-08-28T09:54:48.7250873Z       }
2026-08-28T09:54:48.7251121Z     },
2026-08-28T09:54:48.7251377Z     {
2026-08-28T09:54:48.7251729Z       "id": "REQ-UPDATE-APPLY-ALREADY-APPLIED",
2026-08-28T09:54:48.7258606Z       "title": "`spt update apply` classifies an already-staged / already-applied state as a friendly exit-0 no-op instead of dying at the binary-aside rename with 'Access is denied (os error 5)'. ROOT (F-025): a second apply on an already-applied staged version reaches the two-phase binary-aside rename and fails os-error-5, reading as a hard failure when the machine is simply up to date. FIX: apply gains the same pure classifier `fetch` got in v0.18.0 (REQ-UPDATE-FETCH-CURRENT-UX) — already-applied → clear message + exit 0, and the flow MUST short-circuit BEFORE the binary-aside rename in that state; mirror the classifier at ALL apply reject/entry sites the way the fetch fix covered its three. Genuine errors (bad signature, wrong platform, true downgrade, network) still propagate nonzero. (F-025)",
2026-08-28T09:54:48.7259063Z       "requiredStages": [
2026-08-28T09:54:48.7259326Z         "impl",
2026-08-28T09:54:48.7259592Z         "unit"
2026-08-28T09:54:48.7259856Z       ],
2026-08-28T09:54:48.7260203Z       "stages": {
2026-08-28T09:54:48.7260465Z         "doc": {
2026-08-28T09:54:48.7260751Z           "complete": false,
2026-08-28T09:54:48.7261027Z           "evidence": []
2026-08-28T09:54:48.7261288Z         },
2026-08-28T09:54:48.7261547Z         "impl": {
2026-08-28T09:54:48.7261841Z           "complete": true,
2026-08-28T09:54:48.7262119Z           "evidence": [
2026-08-28T09:54:48.7262375Z             {
2026-08-28T09:54:48.7262750Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7263022Z               "line": 61
2026-08-28T09:54:48.7263269Z             },
2026-08-28T09:54:48.7263526Z             {
2026-08-28T09:54:48.7263898Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7264170Z               "line": 157
2026-08-28T09:54:48.7264423Z             },
2026-08-28T09:54:48.7264681Z             {
2026-08-28T09:54:48.7265062Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7265331Z               "line": 411
2026-08-28T09:54:48.7265593Z             },
2026-08-28T09:54:48.7265845Z             {
2026-08-28T09:54:48.7266155Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7266426Z               "line": 9117
2026-08-28T09:54:48.7266680Z             },
2026-08-28T09:54:48.7267004Z             {
2026-08-28T09:54:48.7267429Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7267704Z               "line": 9189
2026-08-28T09:54:48.7268049Z             }
2026-08-28T09:54:48.7268407Z           ]
2026-08-28T09:54:48.7268842Z         },
2026-08-28T09:54:48.7269284Z         "int": {
2026-08-28T09:54:48.7269681Z           "complete": false,
2026-08-28T09:54:48.7270087Z           "evidence": []
2026-08-28T09:54:48.7270467Z         },
2026-08-28T09:54:48.7270857Z         "unit": {
2026-08-28T09:54:48.7271287Z           "complete": true,
2026-08-28T09:54:48.7271692Z           "evidence": [
2026-08-28T09:54:48.7272107Z             {
2026-08-28T09:54:48.7272651Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7273195Z               "line": 523
2026-08-28T09:54:48.7273445Z             },
2026-08-28T09:54:48.7273698Z             {
2026-08-28T09:54:48.7274185Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7274613Z               "line": 34593
2026-08-28T09:54:48.7275009Z             }
2026-08-28T09:54:48.7275276Z           ]
2026-08-28T09:54:48.7275530Z         }
2026-08-28T09:54:48.7275786Z       }
2026-08-28T09:54:48.7276021Z     },
2026-08-28T09:54:48.7276270Z     {
2026-08-28T09:54:48.7276627Z       "id": "REQ-UPDATE-APPLY-RESTART-NOTICE",
2026-08-28T09:54:48.7282529Z       "title": "`spt update apply` prints a LOUD restart-required notice whenever the surviving broker will keep running the pre-apply image (which, until broker-restart choreography exists, is ALWAYS on a successful apply). Public wording, no internal CODE:RESULT markers (composes with REQ-ADAPTER-UPDATE-MESSAGE / the update-apply-confident-message rule) — name the user-visible CONSEQUENCE ('daemon-coordinated features run the previous version until the daemon restarts'), not the broker/brain internals. Composes with REQ-UPDATE-RUNNING-IMAGE-SURFACE (the notice tells the user what the version-surface will then show, and how to clear it). (F-025)",
2026-08-28T09:54:48.7282948Z       "requiredStages": [
2026-08-28T09:54:48.7283211Z         "impl",
2026-08-28T09:54:48.7283471Z         "unit"
2026-08-28T09:54:48.7283726Z       ],
2026-08-28T09:54:48.7283998Z       "stages": {
2026-08-28T09:54:48.7284252Z         "doc": {
2026-08-28T09:54:48.7284537Z           "complete": false,
2026-08-28T09:54:48.7284810Z           "evidence": []
2026-08-28T09:54:48.7285062Z         },
2026-08-28T09:54:48.7285319Z         "impl": {
2026-08-28T09:54:48.7285605Z           "complete": true,
2026-08-28T09:54:48.7285872Z           "evidence": [
2026-08-28T09:54:48.7286125Z             {
2026-08-28T09:54:48.7286452Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7286723Z               "line": 9132
2026-08-28T09:54:48.7287052Z             }
2026-08-28T09:54:48.7287305Z           ]
2026-08-28T09:54:48.7287566Z         },
2026-08-28T09:54:48.7287829Z         "int": {
2026-08-28T09:54:48.7288119Z           "complete": false,
2026-08-28T09:54:48.7288396Z           "evidence": []
2026-08-28T09:54:48.7288659Z         },
2026-08-28T09:54:48.7288925Z         "unit": {
2026-08-28T09:54:48.7289309Z           "complete": true,
2026-08-28T09:54:48.7289585Z           "evidence": [
2026-08-28T09:54:48.7289838Z             {
2026-08-28T09:54:48.7290157Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7290433Z               "line": 34615
2026-08-28T09:54:48.7290748Z             }
2026-08-28T09:54:48.7291001Z           ]
2026-08-28T09:54:48.7291258Z         }
2026-08-28T09:54:48.7291517Z       }
2026-08-28T09:54:48.7291772Z     },
2026-08-28T09:54:48.7292025Z     {
2026-08-28T09:54:48.7292402Z       "id": "REQ-UPDATE-COMPOSITE-EXIT-PRECEDENCE",
2026-08-28T09:54:48.7316251Z       "title": "THE COMPOSITE UPDATE'S EXIT IS FOLDED BY PRECEDENCE, NEVER BY WRITE ORDER (releases#216): `cmd_update_composite` aggregated leg exits with `worst = code` — the LAST nonzero, not the worst — so under `--restart` (the only plan where a leg runs AFTER the isolated adapters leg) an Adapters FAILURE of 1 followed by a Finish REFUSAL of 3 reported 3, and a refusal MASKED a failure. That inverts REQ-UPDATE-REFUSAL-EXIT-DISTINCT's contract, whose 3 means refusal present AND no failure — the same class of misread as the releases#153 field report where a refused fleet roll recorded itself as rolled. THE TOTAL ORDER IS 0 < 3 < EVERY OTHER NONZERO, classed BY VALUE and never by which constant minted it (the tree holds TWO distinct 3s — `EXIT_NOT_ELEVATED` and `EXIT_REFUSED_NO_WORK` — and a fold that cared which one it saw would grow a second vocabulary to drift from). An UNKNOWN nonzero is FAILURE, not refusal (doyle ruling 1): mapping an unminted code to the polite class would re-create this very defect for a code nobody has designed yet, and clap's usage `2` therefore sits in the failure class too, which is what makes the fold TOTAL. WITHIN A CLASS THE FIRST-SEEN CODE SURVIVES (doyle ruling 2) — the earliest failure is the one whose diagnostics the operator has already read, and later-overwrites-earlier is the defect mechanism itself. THE AGGREGATION CONTRACT IS STATED WHERE BOTH AUDIENCES READ IT: in the function's own doc (it stated the abort-vs-isolate failure policy and said NOTHING about aggregation, which is how the face stayed invisible to a source reader) AND on the published self-update page, because callers SCRIPT on these codes and a consumer misreading this surface is the documented history. SCOPE DECLARED, NOT ASSUMED (doyle ruling 3): this requirement covers the FOLD and the LEG ORDER that makes the defect reachable. That the composite PLUMBING routes each real leg's exit into the fold against the real binary stays UNPROVEN by this lane — an end-to-end arm would have to manufacture an adapters failure and a finish refusal, and what it would add beyond the units is that two legs still return codes their own suites already pin; the gate reads the single fold call-site as the review-arm for it instead. Gate: doc — the published self-update clause naming the precedence and both classes; impl — the pure fold + its ONE call site in the composite loop; unit — BOTH DIRECTIONS asserted together (failure-then-refusal folds to the FAILURE and refusal-then-failure folds to the same failure, since a fold that merely reversed the write order passes either arm alone), an unknown nonzero outranking a refusal, first-seen surviving within the failure class, success never outranking anything, and the leg plan pinning that Adapters PRECEDES Finish under `--restart` (the ordering the defect needs — a later plan change would silently un-reach it and the fold's arms would keep passing).",
2026-08-28T09:54:48.7316862Z       "requiredStages": [
2026-08-28T09:54:48.7317120Z         "doc",
2026-08-28T09:54:48.7317387Z         "impl",
2026-08-28T09:54:48.7317697Z         "unit"
2026-08-28T09:54:48.7317962Z       ],
2026-08-28T09:54:48.7318235Z       "stages": {
2026-08-28T09:54:48.7318494Z         "doc": {
2026-08-28T09:54:48.7318790Z           "complete": true,
2026-08-28T09:54:48.7319147Z           "evidence": [
2026-08-28T09:54:48.7319409Z             {
2026-08-28T09:54:48.7319800Z               "path": "docs-site/src/self-update/overview.md",
2026-08-28T09:54:48.7320067Z               "line": 66
2026-08-28T09:54:48.7320321Z             }
2026-08-28T09:54:48.7320576Z           ]
2026-08-28T09:54:48.7320831Z         },
2026-08-28T09:54:48.7321089Z         "impl": {
2026-08-28T09:54:48.7326698Z           "complete": true,
2026-08-28T09:54:48.7327013Z           "evidence": [
2026-08-28T09:54:48.7327279Z             {
2026-08-28T09:54:48.7327603Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7327884Z               "line": 9426
2026-08-28T09:54:48.7328137Z             },
2026-08-28T09:54:48.7328394Z             {
2026-08-28T09:54:48.7328720Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7329101Z               "line": 9449
2026-08-28T09:54:48.7329364Z             }
2026-08-28T09:54:48.7329622Z           ]
2026-08-28T09:54:48.7329880Z         },
2026-08-28T09:54:48.7330256Z         "int": {
2026-08-28T09:54:48.7330547Z           "complete": false,
2026-08-28T09:54:48.7330824Z           "evidence": []
2026-08-28T09:54:48.7331079Z         },
2026-08-28T09:54:48.7331348Z         "unit": {
2026-08-28T09:54:48.7331626Z           "complete": true,
2026-08-28T09:54:48.7331897Z           "evidence": [
2026-08-28T09:54:48.7332146Z             {
2026-08-28T09:54:48.7332470Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7332742Z               "line": 25652
2026-08-28T09:54:48.7332994Z             },
2026-08-28T09:54:48.7333252Z             {
2026-08-28T09:54:48.7333566Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7333838Z               "line": 25674
2026-08-28T09:54:48.7334090Z             },
2026-08-28T09:54:48.7334405Z             {
2026-08-28T09:54:48.7334720Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7334991Z               "line": 25694
2026-08-28T09:54:48.7335248Z             },
2026-08-28T09:54:48.7335510Z             {
2026-08-28T09:54:48.7335815Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7336077Z               "line": 25707
2026-08-28T09:54:48.7336348Z             }
2026-08-28T09:54:48.7336599Z           ]
2026-08-28T09:54:48.7336861Z         }
2026-08-28T09:54:48.7337118Z       }
2026-08-28T09:54:48.7337376Z     },
2026-08-28T09:54:48.7337624Z     {
2026-08-28T09:54:48.7337958Z       "id": "REQ-UPDATE-DEFAULT-COMPOSITE",
2026-08-28T09:54:48.7346964Z       "title": "THE-FORKENING W4 (operator-grilled 2026-07-14): plain `spt update` = `update fetch --apply` THEN `update adapters` (core-first doctrine order); when core is already current the core leg no-ops and ONLY adapters update; `--core-only`/`-c` skips the adapters leg. GROUNDING (operator-corrected, code-confirmed): fetch --apply cycles the BRAIN only — broker + PTYs survive (apply_staged applyhost.rs:303; the restart-required text is a NOTICE, cli.rs:4615, not behavior) — so the composite's invoking process survives by construction and NO re-run machinery is needed; on a broker-side release the existing F-025 notice remains the composite's closing output. Gate: unit — composite sequencing incl. already-current -> adapters-only and --core-only skip; int — composite on a staged release applies core then updates a registered adapter in one invocation; doc — reference + self-update docs present plain `spt update` as the primary form. Kin REQ-UPDATE-ADAPTERS-VERB, REQ-UPDATE-RESTART-SAFE-SWAP, REQ-UPDATE-APPLY-RESTART-NOTICE.",
2026-08-28T09:54:48.7347359Z       "requiredStages": [
2026-08-28T09:54:48.7347617Z         "doc",
2026-08-28T09:54:48.7347884Z         "impl",
2026-08-28T09:54:48.7348138Z         "unit",
2026-08-28T09:54:48.7348399Z         "int"
2026-08-28T09:54:48.7348647Z       ],
2026-08-28T09:54:48.7349111Z       "stages": {
2026-08-28T09:54:48.7349387Z         "doc": {
2026-08-28T09:54:48.7349681Z           "complete": true,
2026-08-28T09:54:48.7349959Z           "evidence": [
2026-08-28T09:54:48.7350212Z             {
2026-08-28T09:54:48.7350526Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7350804Z               "line": 682
2026-08-28T09:54:48.7351066Z             },
2026-08-28T09:54:48.7351320Z             {
2026-08-28T09:54:48.7351715Z               "path": "docs-site/src/self-update/overview.md",
2026-08-28T09:54:48.7351983Z               "line": 32
2026-08-28T09:54:48.7352242Z             }
2026-08-28T09:54:48.7352497Z           ]
2026-08-28T09:54:48.7352755Z         },
2026-08-28T09:54:48.7353022Z         "impl": {
2026-08-28T09:54:48.7353304Z           "complete": true,
2026-08-28T09:54:48.7353585Z           "evidence": [
2026-08-28T09:54:48.7353847Z             {
2026-08-28T09:54:48.7354177Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7354453Z               "line": 2439
2026-08-28T09:54:48.7354715Z             },
2026-08-28T09:54:48.7354967Z             {
2026-08-28T09:54:48.7355291Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7355568Z               "line": 9335
2026-08-28T09:54:48.7355896Z             },
2026-08-28T09:54:48.7356155Z             {
2026-08-28T09:54:48.7356470Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7356746Z               "line": 9376
2026-08-28T09:54:48.7356998Z             },
2026-08-28T09:54:48.7357254Z             {
2026-08-28T09:54:48.7357576Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7357853Z               "line": 9462
2026-08-28T09:54:48.7358111Z             }
2026-08-28T09:54:48.7358359Z           ]
2026-08-28T09:54:48.7358620Z         },
2026-08-28T09:54:48.7358872Z         "int": {
2026-08-28T09:54:48.7359240Z           "complete": true,
2026-08-28T09:54:48.7359507Z           "evidence": [
2026-08-28T09:54:48.7359769Z             {
2026-08-28T09:54:48.7360197Z               "path": "crates/spt/tests/composite_e2e.rs",
2026-08-28T09:54:48.7360458Z               "line": 18
2026-08-28T09:54:48.7360716Z             }
2026-08-28T09:54:48.7360968Z           ]
2026-08-28T09:54:48.7361226Z         },
2026-08-28T09:54:48.7361487Z         "unit": {
2026-08-28T09:54:48.7361778Z           "complete": true,
2026-08-28T09:54:48.7362050Z           "evidence": [
2026-08-28T09:54:48.7362307Z             {
2026-08-28T09:54:48.7362627Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7362897Z               "line": 25587
2026-08-28T09:54:48.7363158Z             },
2026-08-28T09:54:48.7363405Z             {
2026-08-28T09:54:48.7363725Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7363992Z               "line": 25633
2026-08-28T09:54:48.7364250Z             }
2026-08-28T09:54:48.7364498Z           ]
2026-08-28T09:54:48.7364752Z         }
2026-08-28T09:54:48.7365008Z       }
2026-08-28T09:54:48.7365256Z     },
2026-08-28T09:54:48.7365513Z     {
2026-08-28T09:54:48.7365847Z       "id": "REQ-UPDATE-FETCH-APPLY-FLAG",
2026-08-28T09:54:48.7373570Z       "title": "`spt update fetch --apply` is the one-shot get-to-latest: fetch, then INSTALL the staged update REGARDLESS of whether the fetch itself staged anything new — so the brittle `fetch && apply` chain (which broke when fetch no-oped / exited nonzero on an already-staged latest, skipping the chained apply) is unnecessary. Composes with REQ-UPDATE-FETCH-CURRENT-UX: the end state is 'installed latest', reached idempotently from new-staged -> apply / already-staged (applied<candidate) -> STILL apply / already-applied -> noop+exit0 / genuine error (bad signature, no artifact for platform, true downgrade, network) -> do NOT apply, propagate the error + nonzero. Reuses the existing cmd_update_apply core (its own verify + two-phase + auto-rollback own correctness; no duplicated swap/respawn). Additive clap flag (plain doc-comment, no internal codes); reference.md regenerated. (v0.18.0)",
2026-08-28T09:54:48.7374043Z       "requiredStages": [
2026-08-28T09:54:48.7374294Z         "impl",
2026-08-28T09:54:48.7374562Z         "unit"
2026-08-28T09:54:48.7374810Z       ],
2026-08-28T09:54:48.7375082Z       "stages": {
2026-08-28T09:54:48.7375345Z         "doc": {
2026-08-28T09:54:48.7375626Z           "complete": false,
2026-08-28T09:54:48.7375913Z           "evidence": []
2026-08-28T09:54:48.7376163Z         },
2026-08-28T09:54:48.7376425Z         "impl": {
2026-08-28T09:54:48.7376707Z           "complete": true,
2026-08-28T09:54:48.7377027Z           "evidence": [
2026-08-28T09:54:48.7377265Z             {
2026-08-28T09:54:48.7377590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7377847Z               "line": 10579
2026-08-28T09:54:48.7378104Z             }
2026-08-28T09:54:48.7378361Z           ]
2026-08-28T09:54:48.7378607Z         },
2026-08-28T09:54:48.7378868Z         "int": {
2026-08-28T09:54:48.7379231Z           "complete": false,
2026-08-28T09:54:48.7379508Z           "evidence": []
2026-08-28T09:54:48.7379770Z         },
2026-08-28T09:54:48.7380031Z         "unit": {
2026-08-28T09:54:48.7380313Z           "complete": true,
2026-08-28T09:54:48.7380594Z           "evidence": [
2026-08-28T09:54:48.7380857Z             {
2026-08-28T09:54:48.7381242Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7381517Z               "line": 25316
2026-08-28T09:54:48.7381770Z             },
2026-08-28T09:54:48.7382031Z             {
2026-08-28T09:54:48.7382342Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7382613Z               "line": 25333
2026-08-28T09:54:48.7382865Z             }
2026-08-28T09:54:48.7383122Z           ]
2026-08-28T09:54:48.7383382Z         }
2026-08-28T09:54:48.7383634Z       }
2026-08-28T09:54:48.7383893Z     },
2026-08-28T09:54:48.7384140Z     {
2026-08-28T09:54:48.7384468Z       "id": "REQ-UPDATE-FETCH-CURRENT-UX",
2026-08-28T09:54:48.7393129Z       "title": "`spt update fetch` reports an already-staged / already-applied latest as an ACTIONABLE human outcome (exit 0), not a Debug-formatted error. ROOT: cmd_update_fetch (cli.rs) sets the rollback floor = staged_version, so when the published candidate == the already-staged version, verify_update_set_metadata returns Err(RejectReason::Rollback{current,candidate}) — printed as {reason:?} (Debug) at exit 1, reading as a FAILURE when the update is merely already downloaded and just needs `spt update apply` (this bit the operator: fetch kept 'failing', apply was the missing step). FIX: a PURE classifier (reason, applied, staged) -> {AlreadyStaged (latest downloaded, not yet installed) / AlreadyApplied (up to date) / GenuineError}; already-staged + already-applied print a friendly message and exit 0; genuine rejects use RejectReason's Display (release.rs, not Debug) + exit 1 — applied at ALL THREE fetch reject sites (metadata + artifact-verify + plan-verify). (v0.18.0)",
2026-08-28T09:54:48.7393541Z       "requiredStages": [
2026-08-28T09:54:48.7393802Z         "impl",
2026-08-28T09:54:48.7394074Z         "unit"
2026-08-28T09:54:48.7394336Z       ],
2026-08-28T09:54:48.7394611Z       "stages": {
2026-08-28T09:54:48.7394862Z         "doc": {
2026-08-28T09:54:48.7395216Z           "complete": false,
2026-08-28T09:54:48.7395483Z           "evidence": []
2026-08-28T09:54:48.7395754Z         },
2026-08-28T09:54:48.7396016Z         "impl": {
2026-08-28T09:54:48.7396293Z           "complete": true,
2026-08-28T09:54:48.7396564Z           "evidence": [
2026-08-28T09:54:48.7396818Z             {
2026-08-28T09:54:48.7397143Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7397412Z               "line": 10545
2026-08-28T09:54:48.7397664Z             }
2026-08-28T09:54:48.7397922Z           ]
2026-08-28T09:54:48.7398180Z         },
2026-08-28T09:54:48.7398442Z         "int": {
2026-08-28T09:54:48.7398734Z           "complete": false,
2026-08-28T09:54:48.7399086Z           "evidence": []
2026-08-28T09:54:48.7399340Z         },
2026-08-28T09:54:48.7399600Z         "unit": {
2026-08-28T09:54:48.7399941Z           "complete": true,
2026-08-28T09:54:48.7400217Z           "evidence": [
2026-08-28T09:54:48.7400465Z             {
2026-08-28T09:54:48.7400799Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7401075Z               "line": 25272
2026-08-28T09:54:48.7401333Z             }
2026-08-28T09:54:48.7401591Z           ]
2026-08-28T09:54:48.7401849Z         }
2026-08-28T09:54:48.7402106Z       }
2026-08-28T09:54:48.7402358Z     },
2026-08-28T09:54:48.7402613Z     {
2026-08-28T09:54:48.7402970Z       "id": "REQ-UPDATE-FINISH-COMMUNE-FLUSH",
2026-08-28T09:54:48.7416116Z       "title": "DEFERRED (post-LIFECYCLE-TRUTH, operator-ruled 2026-07-07 — mint now, impl a FUTURE milestone): make the update swap LOSSLESS for live hosted endpoints by flushing a final echo-commune per endpoint BEFORE the brain-subtree reap. ROOT (operator-surfaced probing --finish): `update apply --finish` = daemonless swap -> daemon RESTART; the graceful `daemon stop` path (daemon.rs:316-325) raises brain_stop then reaper.reap() KILLS the brain subtree (brain + shellwake watchers + detached Psyches) as one unit — there is NO per-endpoint final commune before the kill. ENDPOINT-SURVIVAL (REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL) then RESPAWNS each orphaned online spt-hosted endpoint, but from its LAST commune (whatever the ongoing per-event echo-commune cadence last saved), NOT an as-of-swap checkpoint — so mid-turn / uncommuned work is lost across the bounce. Today's mitigation is operator discipline: commune-before-swap. FIX (future): the stop/finish path, before reap, drives each LIVE hosted endpoint's final echo-commune (fire_echo final context save) so the respawn resumes from a swap-fresh checkpoint. Composes with ENDPOINT-SURVIVAL (commune -> reap -> respawn) and the W1 echo pipeline (REQ-ECHO-DROP-DIR-RESOLVE / REQ-PSYCHE-STAMP-CLEAR-ANY-SUCCESS). Bounded + loud per endpoint (a commune that hangs must not wedge the stop — timeout then reap anyway, never block the swap). Int: a live hosted endpoint with uncommuned state -> --finish -> respawned endpoint's digest/psyche reflects the pre-swap state (RED-first: without the flush the respawn shows only the last-cadence commune).",
2026-08-28T09:54:48.7416646Z       "requiredStages": [],
2026-08-28T09:54:48.7416923Z       "stages": {
2026-08-28T09:54:48.7417179Z         "doc": {
2026-08-28T09:54:48.7417475Z           "complete": false,
2026-08-28T09:54:48.7417756Z           "evidence": []
2026-08-28T09:54:48.7418014Z         },
2026-08-28T09:54:48.7418281Z         "impl": {
2026-08-28T09:54:48.7418562Z           "complete": false,
2026-08-28T09:54:48.7418843Z           "evidence": []
2026-08-28T09:54:48.7419177Z         },
2026-08-28T09:54:48.7419434Z         "int": {
2026-08-28T09:54:48.7419715Z           "complete": false,
2026-08-28T09:54:48.7419996Z           "evidence": []
2026-08-28T09:54:48.7420248Z         },
2026-08-28T09:54:48.7420503Z         "unit": {
2026-08-28T09:54:48.7420801Z           "complete": false,
2026-08-28T09:54:48.7421070Z           "evidence": []
2026-08-28T09:54:48.7421337Z         }
2026-08-28T09:54:48.7421590Z       }
2026-08-28T09:54:48.7421849Z     },
2026-08-28T09:54:48.7422096Z     {
2026-08-28T09:54:48.7422534Z       "id": "REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL",
2026-08-28T09:54:48.7428059Z       "title": "W3 (LIFECYCLE-TRUTH): daemon restart no longer massacres hosted endpoints — daemon start RE-RUNS previously-online spt-hosted endpoints. ROOT rig-proven: daemon stop+start (the apply notice's OWN instruction) kills every hosted endpoint; they stay OFFLINE after start (no resurrection) though records exist (info.json status + adapter + cwd). SCOPE RULING (doyle): re-run-on-start, marked start-reason=daemon-restart; agents' minds ride psyche re-host as today. Int: endpoint online -> daemon stop -> start -> endpoint back ONLINE, same id, harness respawned.",
2026-08-28T09:54:48.7428517Z       "requiredStages": [
2026-08-28T09:54:48.7428789Z         "impl",
2026-08-28T09:54:48.7429260Z         "unit",
2026-08-28T09:54:48.7429650Z         "int"
2026-08-28T09:54:48.7430018Z       ],
2026-08-28T09:54:48.7430284Z       "stages": {
2026-08-28T09:54:48.7430552Z         "doc": {
2026-08-28T09:54:48.7430832Z           "complete": false,
2026-08-28T09:54:48.7431119Z           "evidence": []
2026-08-28T09:54:48.7431385Z         },
2026-08-28T09:54:48.7431650Z         "impl": {
2026-08-28T09:54:48.7431936Z           "complete": true,
2026-08-28T09:54:48.7432222Z           "evidence": [
2026-08-28T09:54:48.7432479Z             {
2026-08-28T09:54:48.7432856Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7433137Z               "line": 428
2026-08-28T09:54:48.7433390Z             },
2026-08-28T09:54:48.7433648Z             {
2026-08-28T09:54:48.7434019Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7434299Z               "line": 520
2026-08-28T09:54:48.7434556Z             },
2026-08-28T09:54:48.7434822Z             {
2026-08-28T09:54:48.7435195Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7435471Z               "line": 528
2026-08-28T09:54:48.7435732Z             },
2026-08-28T09:54:48.7435980Z             {
2026-08-28T09:54:48.7436348Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7436685Z               "line": 566
2026-08-28T09:54:48.7436946Z             },
2026-08-28T09:54:48.7437203Z             {
2026-08-28T09:54:48.7437565Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7437842Z               "line": 1253
2026-08-28T09:54:48.7438095Z             }
2026-08-28T09:54:48.7438353Z           ]
2026-08-28T09:54:48.7438609Z         },
2026-08-28T09:54:48.7438876Z         "int": {
2026-08-28T09:54:48.7439254Z           "complete": true,
2026-08-28T09:54:48.7439533Z           "evidence": [
2026-08-28T09:54:48.7439791Z             {
2026-08-28T09:54:48.7440220Z               "path": "crates/spt-daemon/tests/endpoint_survival.rs",
2026-08-28T09:54:48.7440506Z               "line": 113
2026-08-28T09:54:48.7440759Z             }
2026-08-28T09:54:48.7441079Z           ]
2026-08-28T09:54:48.7441336Z         },
2026-08-28T09:54:48.7441599Z         "unit": {
2026-08-28T09:54:48.7441883Z           "complete": true,
2026-08-28T09:54:48.7442157Z           "evidence": [
2026-08-28T09:54:48.7442414Z             {
2026-08-28T09:54:48.7442787Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7443058Z               "line": 2652
2026-08-28T09:54:48.7443312Z             }
2026-08-28T09:54:48.7443569Z           ]
2026-08-28T09:54:48.7443818Z         }
2026-08-28T09:54:48.7444070Z       }
2026-08-28T09:54:48.7444322Z     },
2026-08-28T09:54:48.7444575Z     {
2026-08-28T09:54:48.7444896Z       "id": "REQ-UPDATE-GH-TRANSPORT",
2026-08-28T09:54:48.7456001Z       "title": "THE-FORKENING W1 (ADR-0036, operator-ruled 2026-07-14): the release channel is PRIVATE (`BigscreenVR/spt-bs-releases`) and the gh CLI is the mandated carrier — release discovery (`releases/latest`, cli.rs:9717) and asset download (cli.rs:4861 public browser URLs) move to deadline-wrapped `gh` subprocess calls (`gh api`, `gh release download`; run_git pattern). WHY gh not token+HTTP: private-repo `browser_download_url` 404s even with a valid token — the API asset-id dance is gh's job. Default repo flips via the existing SPT_INSTALL_REPO seam (cli.rs:5363) + xtask REPO const (main.rs:729) + notif.rs consent-changelog URL rider. Loud failure classes: gh missing -> UPDATE_FETCH_REJECTED:GhCliRequired with OS-SPECIFIC install hints (winget/apt/brew); gh unauthed -> distinct GhAuthRequired pointing at `gh auth login`. Signature verification unchanged — bytes verified after download, carrier-independent (update-set/counter/anchor continuity per ADR-0036 §2). release_verify_e2e reworked to the gh carrier. Gate: unit — url/invocation construction + both failure classes render OS-correct hints; int — fetch against a real gh-authed channel resolves latest + downloads and verifies an asset; doc — self-update docs name the gh prerequisite. Kin REQ-INSTALL-BOOTSTRAP-VERB (same carrier at first install), ADR-0036.",
2026-08-28T09:54:48.7456471Z       "requiredStages": [
2026-08-28T09:54:48.7456729Z         "doc",
2026-08-28T09:54:48.7456997Z         "impl",
2026-08-28T09:54:48.7457255Z         "unit",
2026-08-28T09:54:48.7457517Z         "int"
2026-08-28T09:54:48.7457773Z       ],
2026-08-28T09:54:48.7458042Z       "stages": {
2026-08-28T09:54:48.7458296Z         "doc": {
2026-08-28T09:54:48.7458586Z           "complete": true,
2026-08-28T09:54:48.7458853Z           "evidence": [
2026-08-28T09:54:48.7459192Z             {
2026-08-28T09:54:48.7459488Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7459764Z               "line": 675
2026-08-28T09:54:48.7460016Z             },
2026-08-28T09:54:48.7460273Z             {
2026-08-28T09:54:48.7460668Z               "path": "docs-site/src/self-update/overview.md",
2026-08-28T09:54:48.7460930Z               "line": 92
2026-08-28T09:54:48.7461169Z             }
2026-08-28T09:54:48.7461427Z           ]
2026-08-28T09:54:48.7461689Z         },
2026-08-28T09:54:48.7461951Z         "impl": {
2026-08-28T09:54:48.7462246Z           "complete": true,
2026-08-28T09:54:48.7462513Z           "evidence": [
2026-08-28T09:54:48.7462775Z             {
2026-08-28T09:54:48.7463206Z               "path": "crates/spt-daemon/src/notif.rs",
2026-08-28T09:54:48.7463478Z               "line": 586
2026-08-28T09:54:48.7463741Z             },
2026-08-28T09:54:48.7463994Z             {
2026-08-28T09:54:48.7464318Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7464590Z               "line": 9090
2026-08-28T09:54:48.7464851Z             },
2026-08-28T09:54:48.7465104Z             {
2026-08-28T09:54:48.7465424Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7465695Z               "line": 9744
2026-08-28T09:54:48.7466007Z             },
2026-08-28T09:54:48.7466341Z             {
2026-08-28T09:54:48.7466674Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7466951Z               "line": 9749
2026-08-28T09:54:48.7467304Z             },
2026-08-28T09:54:48.7467566Z             {
2026-08-28T09:54:48.7467881Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7468158Z               "line": 9769
2026-08-28T09:54:48.7468418Z             },
2026-08-28T09:54:48.7468678Z             {
2026-08-28T09:54:48.7469128Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7469404Z               "line": 9789
2026-08-28T09:54:48.7469665Z             },
2026-08-28T09:54:48.7469917Z             {
2026-08-28T09:54:48.7470232Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7470509Z               "line": 9802
2026-08-28T09:54:48.7470763Z             },
2026-08-28T09:54:48.7471016Z             {
2026-08-28T09:54:48.7471333Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7471615Z               "line": 9814
2026-08-28T09:54:48.7471867Z             },
2026-08-28T09:54:48.7472129Z             {
2026-08-28T09:54:48.7472439Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7472725Z               "line": 10597
2026-08-28T09:54:48.7472988Z             },
2026-08-28T09:54:48.7473242Z             {
2026-08-28T09:54:48.7473630Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7473905Z               "line": 10634
2026-08-28T09:54:48.7474162Z             },
2026-08-28T09:54:48.7474415Z             {
2026-08-28T09:54:48.7474734Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7475001Z               "line": 10717
2026-08-28T09:54:48.7475316Z             },
2026-08-28T09:54:48.7475650Z             {
2026-08-28T09:54:48.7475969Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.7476255Z               "line": 1420
2026-08-28T09:54:48.7476506Z             }
2026-08-28T09:54:48.7476763Z           ]
2026-08-28T09:54:48.7477020Z         },
2026-08-28T09:54:48.7477268Z         "int": {
2026-08-28T09:54:48.7477549Z           "complete": true,
2026-08-28T09:54:48.7477821Z           "evidence": [
2026-08-28T09:54:48.7478150Z             {
2026-08-28T09:54:48.7478531Z               "path": "crates/spt/tests/release_verify_e2e.rs",
2026-08-28T09:54:48.7478803Z               "line": 21
2026-08-28T09:54:48.7479158Z             }
2026-08-28T09:54:48.7479421Z           ]
2026-08-28T09:54:48.7479668Z         },
2026-08-28T09:54:48.7479930Z         "unit": {
2026-08-28T09:54:48.7480211Z           "complete": true,
2026-08-28T09:54:48.7480487Z           "evidence": [
2026-08-28T09:54:48.7480746Z             {
2026-08-28T09:54:48.7481064Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7481337Z               "line": 34496
2026-08-28T09:54:48.7481576Z             }
2026-08-28T09:54:48.7481841Z           ]
2026-08-28T09:54:48.7482093Z         }
2026-08-28T09:54:48.7482352Z       }
2026-08-28T09:54:48.7482599Z     },
2026-08-28T09:54:48.7482848Z     {
2026-08-28T09:54:48.7483172Z       "id": "REQ-UPDATE-ONE-SHOT-FINISH",
2026-08-28T09:54:48.7488467Z       "title": "W3 (LIFECYCLE-TRUTH): update apply works daemonless and one command finishes the cycle. ROOT (operator wart): update fetch/apply run ensure_daemon_announced (cli.rs:4386) -> on a stopped box they BOOT THE OLD broker pre-swap, guaranteeing the mixed old-broker/new-brain pair + a manual bounce. FIX: apply works daemonless (swap + record, next start runs new bytes); `update apply --finish` (name subject to docs-token gate) completes the cycle: swap -> brain cycle -> broker restart onto new bytes (rides REQ-UPDATE-FINISH-ENDPOINT-SURVIVAL so the restart is not a massacre). CLI change -> xtask docs gen, no internal codes in clap ///.",
2026-08-28T09:54:48.7488853Z       "requiredStages": [
2026-08-28T09:54:48.7489307Z         "impl",
2026-08-28T09:54:48.7489699Z         "unit"
2026-08-28T09:54:48.7489990Z       ],
2026-08-28T09:54:48.7490252Z       "stages": {
2026-08-28T09:54:48.7490510Z         "doc": {
2026-08-28T09:54:48.7490791Z           "complete": false,
2026-08-28T09:54:48.7491076Z           "evidence": []
2026-08-28T09:54:48.7491330Z         },
2026-08-28T09:54:48.7491682Z         "impl": {
2026-08-28T09:54:48.7491963Z           "complete": true,
2026-08-28T09:54:48.7492235Z           "evidence": [
2026-08-28T09:54:48.7492497Z             {
2026-08-28T09:54:48.7492874Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7493155Z               "line": 97
2026-08-28T09:54:48.7493398Z             },
2026-08-28T09:54:48.7493655Z             {
2026-08-28T09:54:48.7494028Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7494304Z               "line": 382
2026-08-28T09:54:48.7494565Z             },
2026-08-28T09:54:48.7494820Z             {
2026-08-28T09:54:48.7495130Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7495397Z               "line": 9144
2026-08-28T09:54:48.7495665Z             },
2026-08-28T09:54:48.7495917Z             {
2026-08-28T09:54:48.7496231Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7496503Z               "line": 9163
2026-08-28T09:54:48.7496761Z             },
2026-08-28T09:54:48.7497023Z             {
2026-08-28T09:54:48.7497333Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7497673Z               "line": 9181
2026-08-28T09:54:48.7497931Z             },
2026-08-28T09:54:48.7498198Z             {
2026-08-28T09:54:48.7498508Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7498779Z               "line": 9250
2026-08-28T09:54:48.7499133Z             },
2026-08-28T09:54:48.7499394Z             {
2026-08-28T09:54:48.7499714Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7499980Z               "line": 9563
2026-08-28T09:54:48.7500240Z             }
2026-08-28T09:54:48.7500607Z           ]
2026-08-28T09:54:48.7500865Z         },
2026-08-28T09:54:48.7501122Z         "int": {
2026-08-28T09:54:48.7501404Z           "complete": false,
2026-08-28T09:54:48.7501675Z           "evidence": []
2026-08-28T09:54:48.7501932Z         },
2026-08-28T09:54:48.7502194Z         "unit": {
2026-08-28T09:54:48.7502557Z           "complete": true,
2026-08-28T09:54:48.7502838Z           "evidence": [
2026-08-28T09:54:48.7503091Z             {
2026-08-28T09:54:48.7503481Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7503753Z               "line": 925
2026-08-28T09:54:48.7504006Z             },
2026-08-28T09:54:48.7504254Z             {
2026-08-28T09:54:48.7504636Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7504908Z               "line": 966
2026-08-28T09:54:48.7505163Z             },
2026-08-28T09:54:48.7505418Z             {
2026-08-28T09:54:48.7505728Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7505996Z               "line": 30929
2026-08-28T09:54:48.7506249Z             },
2026-08-28T09:54:48.7506502Z             {
2026-08-28T09:54:48.7506811Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7507087Z               "line": 34650
2026-08-28T09:54:48.7507345Z             },
2026-08-28T09:54:48.7507602Z             {
2026-08-28T09:54:48.7507912Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7508173Z               "line": 34683
2026-08-28T09:54:48.7508438Z             }
2026-08-28T09:54:48.7508686Z           ]
2026-08-28T09:54:48.7509107Z         }
2026-08-28T09:54:48.7509363Z       }
2026-08-28T09:54:48.7509620Z     },
2026-08-28T09:54:48.7509883Z     {
2026-08-28T09:54:48.7510216Z       "id": "REQ-UPDATE-PROMOTE-DRAINED",
2026-08-28T09:54:48.7520344Z       "title": "W3 (LIFECYCLE-TRUTH, mechanic-d MOVED FROM W2 per doyle gate verdict @e5ae7a9 — binding): the update-apply brain-generation promotion completes only when the OLD generation's broker subscriber connection is CLOSED or stall-EVICTED — never while blocked writes still pend on it. ROOT: `brain.ready` != subscribers drained; W2's stall-evict (REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE) only BOUNDS the false-promote window to BRAIN_WRITE_DEADLINE (15s), it does NOT close it — a new brain can signal ready inside that window while the old gen's conn is still wedged, so the apply 'promotes' onto a still-frozen control plane (the 22:47 incident-night false-promote). FIX: the promotion gate (ADR-0018 brain-trial, brainproc.rs) adds an explicit DRAINED precondition — promote only on ready AND old-gen-subscriber-drained (conn closed OR stall-evicted); the drained signal reads broker truth (the W2 stall-evict tally / the old conn's liveness), no brain round-trip. The residual W2 left open, now closed. Int = a FALSE-PROMOTE rig that exercises the promotion path itself: an old-gen subscriber conn held wedged past ready must NOT promote until it drains (RED-first: ready-alone promotes).",
2026-08-28T09:54:48.7520782Z       "requiredStages": [
2026-08-28T09:54:48.7521043Z         "impl",
2026-08-28T09:54:48.7521314Z         "unit",
2026-08-28T09:54:48.7521575Z         "int"
2026-08-28T09:54:48.7521827Z       ],
2026-08-28T09:54:48.7522089Z       "stages": {
2026-08-28T09:54:48.7522347Z         "doc": {
2026-08-28T09:54:48.7522642Z           "complete": false,
2026-08-28T09:54:48.7522933Z           "evidence": []
2026-08-28T09:54:48.7523192Z         },
2026-08-28T09:54:48.7523449Z         "impl": {
2026-08-28T09:54:48.7523798Z           "complete": true,
2026-08-28T09:54:48.7524086Z           "evidence": [
2026-08-28T09:54:48.7524343Z             {
2026-08-28T09:54:48.7524735Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7525006Z               "line": 662
2026-08-28T09:54:48.7525268Z             },
2026-08-28T09:54:48.7525517Z             {
2026-08-28T09:54:48.7525888Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7526160Z               "line": 2649
2026-08-28T09:54:48.7526417Z             },
2026-08-28T09:54:48.7526667Z             {
2026-08-28T09:54:48.7527040Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7527317Z               "line": 5497
2026-08-28T09:54:48.7527578Z             },
2026-08-28T09:54:48.7527835Z             {
2026-08-28T09:54:48.7528256Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7528532Z               "line": 5636
2026-08-28T09:54:48.7528785Z             }
2026-08-28T09:54:48.7529122Z           ]
2026-08-28T09:54:48.7529377Z         },
2026-08-28T09:54:48.7529640Z         "int": {
2026-08-28T09:54:48.7529926Z           "complete": true,
2026-08-28T09:54:48.7530198Z           "evidence": [
2026-08-28T09:54:48.7530455Z             {
2026-08-28T09:54:48.7530866Z               "path": "crates/spt-daemon/tests/false_promote.rs",
2026-08-28T09:54:48.7531148Z               "line": 231
2026-08-28T09:54:48.7531399Z             }
2026-08-28T09:54:48.7531660Z           ]
2026-08-28T09:54:48.7531916Z         },
2026-08-28T09:54:48.7532164Z         "unit": {
2026-08-28T09:54:48.7532460Z           "complete": true,
2026-08-28T09:54:48.7532731Z           "evidence": [
2026-08-28T09:54:48.7532992Z             {
2026-08-28T09:54:48.7533365Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7533646Z               "line": 1761
2026-08-28T09:54:48.7533899Z             },
2026-08-28T09:54:48.7534160Z             {
2026-08-28T09:54:48.7534532Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7534800Z               "line": 1809
2026-08-28T09:54:48.7535129Z             },
2026-08-28T09:54:48.7535381Z             {
2026-08-28T09:54:48.7535743Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7536011Z               "line": 12373
2026-08-28T09:54:48.7536269Z             }
2026-08-28T09:54:48.7536525Z           ]
2026-08-28T09:54:48.7536782Z         }
2026-08-28T09:54:48.7537042Z       }
2026-08-28T09:54:48.7537290Z     },
2026-08-28T09:54:48.7537557Z     {
2026-08-28T09:54:48.7537910Z       "id": "REQ-UPDATE-REFUSAL-EXIT-DISTINCT",
2026-08-28T09:54:48.7563479Z       "title": "A REFUSAL AND A FAILURE ARE DIFFERENT ANSWERS AND MUST NOT SHARE AN EXIT CODE OR A SUMMARY WORD (releases#153, doyle ruling 2026-08-21). A guard that DECLINED and did no work leaves the box exactly as it was; a failure means something broke and may have left work half-done. A caller gating on exit status therefore needs THREE answers: applied (0), refused-with-nothing-done (3), failed (1). CODIFICATION, NOT A NEW CONTRACT — the tree already answered refusals with 3 at three sites (EXIT_NOT_ELEVATED, DAEMON_STOP_REFUSED, UPDATE_FINISH_REFUSED) while cli.rs's own module doc called 1 a 'runtime refusal'; there is no migration to look for, and a fourth code would fork a convention that already reads consistently. WHAT THIS REQUIREMENT COVERS is the places the distinction was genuinely MISSING, which is not where the issue filed it: the adapter sweep's outcome type gains a REFUSED variant carrying the guard's own reason, so a declined release stops rendering FAILED and stops exiting 0 (a sweep that installed nothing must not report success — the filed field shape was a fleet roll recording itself as rolled on the majority of nodes); and the core apply's refused-class arm answers 3 rather than 1. PRECEDENCE: a sweep carrying both a failure and a refusal exits 1 — something broke, and a held rule must not mask it. THE DISCRIMINANT IS DECLINE VERSUS FAULT, NOT WHETHER BYTES MOVED (doyle ruling 2026-08-21, stated here because the tempting wrong rule will be re-litigated by the next reader of ApplyStagedOutcome's doc comments): 3 means policy declined, the system is healthy, change your intent or context and ask again. Rejected (at-rest re-verification — tamper, expiry, key trust) stays 1 even though its own doc says nothing was swapped, because that sentence is a statement about BLAST RADIUS and not about outcome class: what is on disk cannot be trusted, which is a fault. The asymmetry settles it independently of the taxonomy — an &&-gated caller reading 3 carries on, and carrying on is the one reading a tampered artifact must never receive, so filing a security-relevant integrity condition under the benign code would make this contract actively harmful at the site where being loud matters most. Quarantined stays 1 as well: a version rolled back after failing readiness had work happen. The UPDATE_FINISH_REFUSED site is explicitly OUT of scope: it already returns 3 (since 559632e0, shipped in v0.50.0) and is already pinned non-zero from an endpoint context by broker_stop_endpoint_deny_e2e, so the filed face was measured fixed before this lane opened. Gate: doc — the cli.rs exit-code contract sentence and the CONTEXT.md update-composite entry naming what a refusal exits; impl — the REFUSED outcome variant, the sweep's exit aggregation with its precedence, and the refused-class arm; unit — a refusal renders REFUSED with its reason and never FAILED, the sweep exits 3 for refused / 1 for failed / 0 for applied, the mixed sweep exits 1, and the refused apply class answers 3.",
2026-08-28T09:54:48.7564048Z       "requiredStages": [
2026-08-28T09:54:48.7564301Z         "doc",
2026-08-28T09:54:48.7564564Z         "impl",
2026-08-28T09:54:48.7564821Z         "unit"
2026-08-28T09:54:48.7565070Z       ],
2026-08-28T09:54:48.7565346Z       "stages": {
2026-08-28T09:54:48.7565589Z         "doc": {
2026-08-28T09:54:48.7565894Z           "complete": true,
2026-08-28T09:54:48.7566170Z           "evidence": [
2026-08-28T09:54:48.7566423Z             {
2026-08-28T09:54:48.7566809Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7567081Z               "line": 682
2026-08-28T09:54:48.7567329Z             }
2026-08-28T09:54:48.7567595Z           ]
2026-08-28T09:54:48.7567852Z         },
2026-08-28T09:54:48.7568109Z         "impl": {
2026-08-28T09:54:48.7568396Z           "complete": true,
2026-08-28T09:54:48.7568658Z           "evidence": [
2026-08-28T09:54:48.7568918Z             {
2026-08-28T09:54:48.7569314Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7569586Z               "line": 22
2026-08-28T09:54:48.7569838Z             },
2026-08-28T09:54:48.7570095Z             {
2026-08-28T09:54:48.7570414Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7570677Z               "line": 69
2026-08-28T09:54:48.7570996Z             },
2026-08-28T09:54:48.7571250Z             {
2026-08-28T09:54:48.7571562Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7571838Z               "line": 9230
2026-08-28T09:54:48.7572095Z             },
2026-08-28T09:54:48.7572357Z             {
2026-08-28T09:54:48.7572671Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7572948Z               "line": 21412
2026-08-28T09:54:48.7573201Z             },
2026-08-28T09:54:48.7573459Z             {
2026-08-28T09:54:48.7573774Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7574044Z               "line": 21455
2026-08-28T09:54:48.7574298Z             },
2026-08-28T09:54:48.7574556Z             {
2026-08-28T09:54:48.7574866Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7575143Z               "line": 21673
2026-08-28T09:54:48.7575401Z             }
2026-08-28T09:54:48.7575659Z           ]
2026-08-28T09:54:48.7575925Z         },
2026-08-28T09:54:48.7576187Z         "int": {
2026-08-28T09:54:48.7576469Z           "complete": false,
2026-08-28T09:54:48.7576744Z           "evidence": []
2026-08-28T09:54:48.7577064Z         },
2026-08-28T09:54:48.7577326Z         "unit": {
2026-08-28T09:54:48.7577613Z           "complete": true,
2026-08-28T09:54:48.7577889Z           "evidence": [
2026-08-28T09:54:48.7578146Z             {
2026-08-28T09:54:48.7578466Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7578732Z               "line": 25438
2026-08-28T09:54:48.7579075Z             },
2026-08-28T09:54:48.7579330Z             {
2026-08-28T09:54:48.7579645Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7579912Z               "line": 25467
2026-08-28T09:54:48.7580175Z             },
2026-08-28T09:54:48.7580432Z             {
2026-08-28T09:54:48.7580742Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7581018Z               "line": 25522
2026-08-28T09:54:48.7581266Z             }
2026-08-28T09:54:48.7581585Z           ]
2026-08-28T09:54:48.7581838Z         }
2026-08-28T09:54:48.7582094Z       }
2026-08-28T09:54:48.7582345Z     },
2026-08-28T09:54:48.7582602Z     {
2026-08-28T09:54:48.7582940Z       "id": "REQ-UPDATE-RESTART-SAFE-SWAP",
2026-08-28T09:54:48.7592828Z       "title": "THE-FORKENING W4 (operator-grilled 2026-07-14; RETIRES findings-backlog seed #12 REQ-UPDATE-ONE-STEP-SAFE-SWAP): `spt update --restart` = the one-step ergonomic path to the SAFE full-cycle swap — fetch -> `update adapters` -> `apply --finish` LAST (lethal-leg-last, ruled: apply --finish restarts the whole daemon incl. broker/PTYs, so it must be the final act — everything completes from ANY invoking context including an spt-hosted session whose PTY dies at that step; accepted cost: a finish FAILURE leaves updated adapters on old-activated core briefly — loud + operator-attended by nature of the flag). Composes with `-c/--core-only` (skip adapters leg). The 0.28.0 wedge lesson closes: the ergonomic one-step no longer picks the riskier path by default for operators who want the full cycle. Gate: unit — flag sequencing incl. lethal-leg-last ordering + -c compose; doc — self-update docs present --restart as the full-cycle form and name the finish-restart consequence. Kin REQ-UPDATE-DEFAULT-COMPOSITE, REQ-UPDATE-FINISH-COMMUNE-FLUSH (deferred commune-flush rides the same finish path when built), seed #12 (retired by this).",
2026-08-28T09:54:48.7593239Z       "requiredStages": [
2026-08-28T09:54:48.7593501Z         "doc",
2026-08-28T09:54:48.7593758Z         "impl",
2026-08-28T09:54:48.7594021Z         "unit"
2026-08-28T09:54:48.7594274Z       ],
2026-08-28T09:54:48.7594546Z       "stages": {
2026-08-28T09:54:48.7594809Z         "doc": {
2026-08-28T09:54:48.7595083Z           "complete": true,
2026-08-28T09:54:48.7595362Z           "evidence": [
2026-08-28T09:54:48.7595611Z             {
2026-08-28T09:54:48.7595911Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7596183Z               "line": 682
2026-08-28T09:54:48.7596445Z             },
2026-08-28T09:54:48.7596770Z             {
2026-08-28T09:54:48.7597169Z               "path": "docs-site/src/self-update/overview.md",
2026-08-28T09:54:48.7597461Z               "line": 41
2026-08-28T09:54:48.7597714Z             }
2026-08-28T09:54:48.7597978Z           ]
2026-08-28T09:54:48.7598231Z         },
2026-08-28T09:54:48.7598494Z         "impl": {
2026-08-28T09:54:48.7598761Z           "complete": true,
2026-08-28T09:54:48.7599109Z           "evidence": [
2026-08-28T09:54:48.7599367Z             {
2026-08-28T09:54:48.7599691Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7599969Z               "line": 2440
2026-08-28T09:54:48.7600223Z             },
2026-08-28T09:54:48.7600479Z             {
2026-08-28T09:54:48.7600793Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7601070Z               "line": 9336
2026-08-28T09:54:48.7601323Z             },
2026-08-28T09:54:48.7601581Z             {
2026-08-28T09:54:48.7601891Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7602162Z               "line": 9377
2026-08-28T09:54:48.7602419Z             }
2026-08-28T09:54:48.7602676Z           ]
2026-08-28T09:54:48.7602996Z         },
2026-08-28T09:54:48.7603252Z         "int": {
2026-08-28T09:54:48.7603542Z           "complete": false,
2026-08-28T09:54:48.7603814Z           "evidence": []
2026-08-28T09:54:48.7604071Z         },
2026-08-28T09:54:48.7604328Z         "unit": {
2026-08-28T09:54:48.7604610Z           "complete": true,
2026-08-28T09:54:48.7604886Z           "evidence": [
2026-08-28T09:54:48.7605135Z             {
2026-08-28T09:54:48.7605454Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7605705Z               "line": 25729
2026-08-28T09:54:48.7605955Z             }
2026-08-28T09:54:48.7606203Z           ]
2026-08-28T09:54:48.7606456Z         }
2026-08-28T09:54:48.7606705Z       }
2026-08-28T09:54:48.7606967Z     },
2026-08-28T09:54:48.7607219Z     {
2026-08-28T09:54:48.7607577Z       "id": "REQ-UPDATE-RUNNING-IMAGE-SURFACE",
2026-08-28T09:54:48.7627695Z       "title": "`spt` surfaces the RUNNING broker image version beside the on-disk version so an updated-looking node reveals broker-side dormancy. ROOT (F-025): `spt update apply` restarts the BRAIN only (ADR-0018 D3-3) — the BROKER process survives and keeps running its pre-apply compiled image, so every broker-side surface of a freshly-applied release (the F015B live-apply matcher, dispatch inject legs, etc.) is silently dormant until a full daemon bounce, with nothing in the CLI revealing the split. FIX: the running broker SELF-REPORTS its compiled image version over IPC (a new request KIND answered by the live broker process from its own compiled build constant) — HARD CONSTRAINT: the version comes FROM the running broker process, NEVER inferred from disk bytes, install manifest, or file timestamps, since the disk is exactly the half that is already ahead; a version-surface command (`spt version` and/or `spt daemon status`) prints the running-broker version beside the on-disk/product version and flags a mismatch. Keeps read-side truth independent of write-side claims (the field lesson from F015B). (F-025) AMENDED 2026-07-27 (FIELD-TRUTH W1 roll-in, operator-directed): (1) `spt daemon status` MUST also divulge the COORDINATOR (brain) image version — the process that executes daemon-coordinated features and the most relevant running version to a status reader; same HARD CONSTRAINT: sourced from the RUNNING brain process (self-report over the broker↔brain channel or equivalent live query), never inferred from disk. (2) The stale-daemon warning RE-KEYS to the coordinator image vs installed: it renders ONLY when the COORDINATOR is outdated — post-apply the brain restarts onto the new bytes while the broker legitimately stays old (ADR-0018 D3-3), so the broker-keyed warning fired exactly backwards on a healthy freshly-updated node. (3) The remedy line recommends solely `spt daemon refresh` (in-place coordinator cycle; hosted terminals and the net layer keep running), never `daemon stop` + `daemon start`; a broker-breaking release still forces its full bounce through the update machinery, not through status advice. (4) The broker image line stays, informational only — no warning, no remedy text. Coordinator-version query unanswered (older daemon) renders not-reported without the warning.",
2026-08-28T09:54:48.7628244Z       "requiredStages": [
2026-08-28T09:54:48.7628511Z         "impl",
2026-08-28T09:54:48.7628770Z         "unit",
2026-08-28T09:54:48.7629179Z         "int"
2026-08-28T09:54:48.7629470Z       ],
2026-08-28T09:54:48.7629731Z       "stages": {
2026-08-28T09:54:48.7630002Z         "doc": {
2026-08-28T09:54:48.7630274Z           "complete": false,
2026-08-28T09:54:48.7630546Z           "evidence": []
2026-08-28T09:54:48.7630794Z         },
2026-08-28T09:54:48.7631057Z         "impl": {
2026-08-28T09:54:48.7631339Z           "complete": true,
2026-08-28T09:54:48.7631615Z           "evidence": [
2026-08-28T09:54:48.7631871Z             {
2026-08-28T09:54:48.7632240Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7632526Z               "line": 1665
2026-08-28T09:54:48.7632774Z             },
2026-08-28T09:54:48.7633103Z             {
2026-08-28T09:54:48.7633446Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7633719Z               "line": 1705
2026-08-28T09:54:48.7633980Z             },
2026-08-28T09:54:48.7634239Z             {
2026-08-28T09:54:48.7634601Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7634867Z               "line": 1737
2026-08-28T09:54:48.7635174Z             },
2026-08-28T09:54:48.7635412Z             {
2026-08-28T09:54:48.7641398Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7641712Z               "line": 70
2026-08-28T09:54:48.7641975Z             },
2026-08-28T09:54:48.7642228Z             {
2026-08-28T09:54:48.7642625Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7642897Z               "line": 77
2026-08-28T09:54:48.7643253Z             },
2026-08-28T09:54:48.7643512Z             {
2026-08-28T09:54:48.7643892Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7644170Z               "line": 86
2026-08-28T09:54:48.7644423Z             },
2026-08-28T09:54:48.7644684Z             {
2026-08-28T09:54:48.7645062Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7645326Z               "line": 225
2026-08-28T09:54:48.7645586Z             },
2026-08-28T09:54:48.7645840Z             {
2026-08-28T09:54:48.7646215Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7646484Z               "line": 916
2026-08-28T09:54:48.7646750Z             },
2026-08-28T09:54:48.7647013Z             {
2026-08-28T09:54:48.7647371Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7647643Z               "line": 436
2026-08-28T09:54:48.7647897Z             },
2026-08-28T09:54:48.7648153Z             {
2026-08-28T09:54:48.7648510Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7648782Z               "line": 447
2026-08-28T09:54:48.7649116Z             },
2026-08-28T09:54:48.7649383Z             {
2026-08-28T09:54:48.7649741Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7650089Z               "line": 5096
2026-08-28T09:54:48.7650356Z             },
2026-08-28T09:54:48.7650609Z             {
2026-08-28T09:54:48.7650971Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7651233Z               "line": 5819
2026-08-28T09:54:48.7651491Z             },
2026-08-28T09:54:48.7651743Z             {
2026-08-28T09:54:48.7652101Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7652372Z               "line": 5821
2026-08-28T09:54:48.7652630Z             },
2026-08-28T09:54:48.7652887Z             {
2026-08-28T09:54:48.7653256Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7653528Z               "line": 8722
2026-08-28T09:54:48.7653843Z             },
2026-08-28T09:54:48.7654096Z             {
2026-08-28T09:54:48.7654458Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7654735Z               "line": 8749
2026-08-28T09:54:48.7655006Z             },
2026-08-28T09:54:48.7655254Z             {
2026-08-28T09:54:48.7655617Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7655886Z               "line": 8773
2026-08-28T09:54:48.7656146Z             },
2026-08-28T09:54:48.7656396Z             {
2026-08-28T09:54:48.7656734Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7657010Z               "line": 8250
2026-08-28T09:54:48.7657273Z             },
2026-08-28T09:54:48.7657530Z             {
2026-08-28T09:54:48.7657878Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7658150Z               "line": 8279
2026-08-28T09:54:48.7658401Z             },
2026-08-28T09:54:48.7658656Z             {
2026-08-28T09:54:48.7659047Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7659333Z               "line": 8571
2026-08-28T09:54:48.7659586Z             },
2026-08-28T09:54:48.7659910Z             {
2026-08-28T09:54:48.7660259Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7660539Z               "line": 8576
2026-08-28T09:54:48.7660799Z             },
2026-08-28T09:54:48.7661051Z             {
2026-08-28T09:54:48.7661368Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7661639Z               "line": 8718
2026-08-28T09:54:48.7661897Z             },
2026-08-28T09:54:48.7662151Z             {
2026-08-28T09:54:48.7662465Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7662742Z               "line": 8727
2026-08-28T09:54:48.7662996Z             }
2026-08-28T09:54:48.7663252Z           ]
2026-08-28T09:54:48.7663503Z         },
2026-08-28T09:54:48.7663759Z         "int": {
2026-08-28T09:54:48.7664041Z           "complete": true,
2026-08-28T09:54:48.7664403Z           "evidence": [
2026-08-28T09:54:48.7664661Z             {
2026-08-28T09:54:48.7665037Z               "path": "crates/spt-daemon/src/applyhost.rs",
2026-08-28T09:54:48.7665309Z               "line": 566
2026-08-28T09:54:48.7665567Z             },
2026-08-28T09:54:48.7665853Z             {
2026-08-28T09:54:48.7666268Z               "path": "crates/spt/tests/coordinator_image_e2e.rs",
2026-08-28T09:54:48.7666537Z               "line": 80
2026-08-28T09:54:48.7666792Z             }
2026-08-28T09:54:48.7667049Z           ]
2026-08-28T09:54:48.7667299Z         },
2026-08-28T09:54:48.7667561Z         "unit": {
2026-08-28T09:54:48.7667842Z           "complete": true,
2026-08-28T09:54:48.7668114Z           "evidence": [
2026-08-28T09:54:48.7668371Z             {
2026-08-28T09:54:48.7668725Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7669094Z               "line": 9692
2026-08-28T09:54:48.7669349Z             },
2026-08-28T09:54:48.7669602Z             {
2026-08-28T09:54:48.7670008Z               "path": "crates/spt-daemon/tests/pumpdeadline.rs",
2026-08-28T09:54:48.7670284Z               "line": 90
2026-08-28T09:54:48.7670542Z             },
2026-08-28T09:54:48.7670794Z             {
2026-08-28T09:54:48.7671118Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7671461Z               "line": 34717
2026-08-28T09:54:48.7671720Z             },
2026-08-28T09:54:48.7671972Z             {
2026-08-28T09:54:48.7672291Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7672563Z               "line": 34763
2026-08-28T09:54:48.7672815Z             }
2026-08-28T09:54:48.7673068Z           ]
2026-08-28T09:54:48.7673321Z         }
2026-08-28T09:54:48.7673580Z       }
2026-08-28T09:54:48.7673831Z     },
2026-08-28T09:54:48.7674087Z     {
2026-08-28T09:54:48.7674409Z       "id": "REQ-UPDATE-TRIAL-DRAIN-DRIVE",
2026-08-28T09:54:48.7705507Z       "title": "UPDATE-WEDGE (counter-54, doyle-ruled 2026-07-09 — regression of the v0.29.0 seamless brain-swap): a brain generation DRIVES the broker's controller-liveness reap (a KIND_SESSIONS poll) each heartbeat throughout its boot/trial loop, so a hard-KILLED prior generation's black-holed LOCAL controller conn (by:None) is stall-evicted within the trial window and can never permanently strand the promotion DRAINED gate. ROOT (2026-07-09 field freeze, `spt update fetch --apply` v0.30.0->v0.30.2 froze all 7 live PTYs ~30s then rolled back): the promote gate (run_trial, brainproc.rs:657-661) needs BOTH `ready_generation==gen` AND `old_gen_drained()`; `old_gen_drained()` = `!any_local_controller_wedged()` (brainproc.rs:534) is a PURE READ of `write_blocked_since` (broker.rs:2703) — it never DRIVES the evict. The evict (`stall_evict_controller`, broker.rs:1039, same 15s `brain_write_deadline` the wedge-read uses) only runs via `reap_dead_controller` (broker.rs:967, severed->drop ELSE stall-evict) inside the KIND_SESSIONS snapshot closure (broker.rs:2879). During the isolated brain-trial window NOTHING polls KIND_SESSIONS: the old brain was hard-killed (`child.kill()`, brainproc.rs:851) so its local controller conn black-holes (live PTYs keep writing to a dead Windows named pipe -> writer BLOCKS, never EOFs) -> `write_blocked_since=Some` -> wedged=true for the full 30s -> gate false -> `WindowElapsedAlive` -> kill+rollback. The candidate DID reach ready (write_ready, brainproc.rs:211, runs before the loop; the v53 log's NET_FAMILY_GATE/PAIR_MEET_UP prove the loop was entered) — so `BRAIN_TRIAL_TIMEOUT: candidate alive but never ready` is the MISLEADING ready-stamped-but-never-DRAINED case, NOT a resume_sessions hang. SECOND LEG (recovery): post-rollback the gen-2 brain's KIND_SESSIONS poll finally reaps -> `BRAIN_SUBSCRIBER_STALL_EVICT:1` fires >15s late -> a session stayed black-holed through recovery -> continued freeze. ONE root, BOTH legs. FIX (BRAIN-SIDE, self-applying — doyle ruled brain-side to AVOID a broker-side coordinated-restart flag): the boot/trial heartbeat loop (brainproc.rs run_brain, currently only `net_status` at :244) also issues `Brain::sessions()` (KIND_SESSIONS, brain.rs:1397 — already exists) every heartbeat, driving the LIVE older broker's ALREADY-SHIPPED reap (>=v0.29.0 LIFECYCLE-TRUTH; the field-stuck broker is v0.30.0 so it HAS it). The old-gen wedged conn is stall-evicted ~15s < the 30s window -> `old_gen_drained()` flips true -> PROMOTE; the same poll on the rollback/recovery brain reaps promptly -> no >15s black-hole -> kills the STALL_EVICT recovery leg. Drive it on the FIRST heartbeat (no one-tick wait) and on BOTH the trial candidate AND the recovery brain (one loop covers both). SELF-APPLIES because it drives the current broker's existing reap verb — v54's brain fixes the v0.30.0->v54 update with NO coordinated broker restart. Forward-compat: brokers <v0.29.0 have neither the DRAINED gate nor the reap, so older-broker updates never hit this path — no regression. Composes with REQ-UPDATE-PROMOTE-DRAINED (the gate this un-strands) + REQ-HAZARD-BROKER-VIEWER-BRAIN-DECOUPLE (the stall-evict it drives) + REQ-CONTROLLER-LIVENESS-REAP (the reap verb). Int = the brain-swap-under-live-sessions rig: (1) with a hard-killed prior gen holding a wedged by:None controller past 15s, the new brain PROMOTES within the window AND sessions stay served across the cycle (RED-first: without the drive, WindowElapsedAlive->rollback); (2) a deliberately-failing trial auto-rolls-back AND the restored brain re-drives EVERY session with NO BRAIN_SUBSCRIBER_STALL_EVICT.",
2026-08-28T09:54:48.7706171Z       "requiredStages": [
2026-08-28T09:54:48.7706438Z         "doc",
2026-08-28T09:54:48.7706695Z         "impl",
2026-08-28T09:54:48.7706987Z         "int"
2026-08-28T09:54:48.7707235Z       ],
2026-08-28T09:54:48.7707502Z       "stages": {
2026-08-28T09:54:48.7707754Z         "doc": {
2026-08-28T09:54:48.7708040Z           "complete": true,
2026-08-28T09:54:48.7708321Z           "evidence": [
2026-08-28T09:54:48.7708578Z             {
2026-08-28T09:54:48.7708881Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7709238Z               "line": 695
2026-08-28T09:54:48.7709557Z             }
2026-08-28T09:54:48.7709815Z           ]
2026-08-28T09:54:48.7710069Z         },
2026-08-28T09:54:48.7710331Z         "impl": {
2026-08-28T09:54:48.7710621Z           "complete": true,
2026-08-28T09:54:48.7710903Z           "evidence": [
2026-08-28T09:54:48.7711155Z             {
2026-08-28T09:54:48.7711538Z               "path": "crates/spt-daemon/src/brainproc.rs",
2026-08-28T09:54:48.7711810Z               "line": 361
2026-08-28T09:54:48.7712063Z             },
2026-08-28T09:54:48.7712311Z             {
2026-08-28T09:54:48.7712683Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7712950Z               "line": 1269
2026-08-28T09:54:48.7713217Z             }
2026-08-28T09:54:48.7713478Z           ]
2026-08-28T09:54:48.7713731Z         },
2026-08-28T09:54:48.7713993Z         "int": {
2026-08-28T09:54:48.7714270Z           "complete": true,
2026-08-28T09:54:48.7714541Z           "evidence": [
2026-08-28T09:54:48.7714794Z             {
2026-08-28T09:54:48.7715228Z               "path": "crates/spt/tests/trial_drain_drive_e2e.rs",
2026-08-28T09:54:48.7715643Z               "line": 332
2026-08-28T09:54:48.7715995Z             },
2026-08-28T09:54:48.7716257Z             {
2026-08-28T09:54:48.7716659Z               "path": "crates/spt/tests/trial_drain_drive_e2e.rs",
2026-08-28T09:54:48.7716931Z               "line": 518
2026-08-28T09:54:48.7717189Z             },
2026-08-28T09:54:48.7717452Z             {
2026-08-28T09:54:48.7717842Z               "path": "crates/spt/tests/trial_drain_drive_e2e.rs",
2026-08-28T09:54:48.7718119Z               "line": 540
2026-08-28T09:54:48.7718372Z             }
2026-08-28T09:54:48.7718624Z           ]
2026-08-28T09:54:48.7718881Z         },
2026-08-28T09:54:48.7719228Z         "unit": {
2026-08-28T09:54:48.7719512Z           "complete": false,
2026-08-28T09:54:48.7719784Z           "evidence": []
2026-08-28T09:54:48.7720042Z         }
2026-08-28T09:54:48.7720290Z       }
2026-08-28T09:54:48.7720605Z     },
2026-08-28T09:54:48.7720857Z     {
2026-08-28T09:54:48.7721181Z       "id": "REQ-USHER-LIFECYCLE-VERBS",
2026-08-28T09:54:48.7755162Z       "title": "THE ENDPOINT LIFECYCLE READS AS VERBS, AND `endpoint run` RETIRES WITHOUT A SHIM. One overloaded verb carried the whole lifecycle: `spt endpoint run` minted an endpoint, started a new session on an existing one, resumed a prior session, opened the interactive picker, and (with `--save`) set a startup default — the invocation's MEANING sat in which of nine flags were present, so the CLI could not be read and the picker's doors could not be named. The ratified surface (releases#5 bag grill, 2026-08-04) is: `endpoint create <new-id> [--subnet S] [--adapter A] [--cwd DIR]` = the ONLY mint, subnet immutable after it; `endpoint start <id> [--adapter A] [--cwd DIR]` = a NEW session on the endpoint's most-recent adapter in its most-recent project folder, NEVER the env cwd, and an UNKNOWN id REFUSES pointing at `create` so a typo cannot mint a phantom endpoint; `endpoint resume <id>` = its LATEST session; `endpoint auto-start <id> [--off]` = the standalone lever that was `run --save`; and top-level `go <id>` = the operator's take-me-to-this-endpoint ladder (online+uncontrolled -> rc; online+controlled -> interactive kick confirm over `rc --take`; suspended -> wake then rc; offline WITH sessions -> resume then rc; offline WITHOUT sessions -> mint the first session then rc; engine-room -> defers to the gated `rc engine-room` path). `go`'s offline discriminant reads the SESSION LEDGER (a non-provisional row) and NOT the record's `session_id`, which persists by design after a clean stop as the CAS identity anchor and is never a liveness claim. RETIREMENT IS A CLEAN BREAK: `endpoint run` is removed through a RAW-ARGV PRE-SCAN ahead of `Cli::command()` so its nine args never enter the derive tree, and it answers with a parse error naming the replacement verb — no hidden variant, no silent alias. TWO CAPABILITY NARROWINGS ARE DELIBERATE AND MUST NOT BE RE-ADDED QUIETLY: specific-session resume (`run --resume <session>`) retires with the verb and has no replacement, `resume` being latest-only; and the picker's two argv prefill quadrants (`--adapter`-only pre-select, `--id`-only create-new prefill) retire with their verb, the id-only case's replacement being `start <unknown-id>`'s refusal. `create` MINTS ONLY — skeleton perch, permanent home, recorded adapter/cwd defaults — and does NOT start a session; the first session is `start` (or `go`, which also attaches), so a fresh bringup is TWO commands where `run --start` was one. That is a shape change to every bringup script rather than a lost capability, and it rides the release notes beside the resume narrowing. It was decided rather than read off the table (todlando, ratified by doyle 2026-08-04) on the ladder's own evidence: a first-class offline-WITHOUT-sessions rung is near-unreachable unless zero-session endpoints are routine, so create cannot be starting one. The picker's own door is BARE `spt` on an interactive terminal and this requirement does not touch it, nor does it add a `pick` verb. Generated launcher shortcuts bake the retired argv, so the generated body becomes `spt go <id>` (the launcher's intent IS `go`'s ladder, and it opens a console so the kick confirm has its TTY), the shortcut SENTINEL is bumped so a stale launcher is detectable rather than merely broken, and the refusal text names BOTH the new verb and shortcut regeneration. REGISTRY SUPERSESSION: this requirement is the authority on the bringup SPELLING, and it supersedes every earlier title in this file that names `endpoint run`. Those were swept where they state a CURRENT contract or a CURRENT gate's invocation; where they narrate a PAST failure or a past field observation they are left verbatim, because a failure record rewritten into a spelling that did not exist when it happened stops being a record. Arg budget: the ratified surface is the MIN spelling at 11 leaf args against the retired 9, a net +2 that is only affordable because the pre-scan keeps the retired args out of the tree — and it rides on REQ-CLI-STACK-HEADROOM having deleted the ceiling rather than budgeted under it.",
2026-08-28T09:54:48.7755905Z       "requiredStages": [
2026-08-28T09:54:48.7756174Z         "doc",
2026-08-28T09:54:48.7756434Z         "impl",
2026-08-28T09:54:48.7756691Z         "unit"
2026-08-28T09:54:48.7756943Z       ],
2026-08-28T09:54:48.7757207Z       "stages": {
2026-08-28T09:54:48.7757464Z         "doc": {
2026-08-28T09:54:48.7757760Z           "complete": true,
2026-08-28T09:54:48.7758037Z           "evidence": [
2026-08-28T09:54:48.7758289Z             {
2026-08-28T09:54:48.7758592Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7758862Z               "line": 415
2026-08-28T09:54:48.7759210Z             }
2026-08-28T09:54:48.7759458Z           ]
2026-08-28T09:54:48.7759711Z         },
2026-08-28T09:54:48.7759969Z         "impl": {
2026-08-28T09:54:48.7760259Z           "complete": true,
2026-08-28T09:54:48.7760530Z           "evidence": [
2026-08-28T09:54:48.7760788Z             {
2026-08-28T09:54:48.7761122Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7761393Z               "line": 268
2026-08-28T09:54:48.7761658Z             },
2026-08-28T09:54:48.7761911Z             {
2026-08-28T09:54:48.7762302Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7762574Z               "line": 506
2026-08-28T09:54:48.7762826Z             },
2026-08-28T09:54:48.7763083Z             {
2026-08-28T09:54:48.7763393Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7763660Z               "line": 534
2026-08-28T09:54:48.7763913Z             },
2026-08-28T09:54:48.7764169Z             {
2026-08-28T09:54:48.7764482Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7764759Z               "line": 554
2026-08-28T09:54:48.7765001Z             },
2026-08-28T09:54:48.7765264Z             {
2026-08-28T09:54:48.7765593Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7765860Z               "line": 566
2026-08-28T09:54:48.7766179Z             },
2026-08-28T09:54:48.7766423Z             {
2026-08-28T09:54:48.7766734Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7767003Z               "line": 2219
2026-08-28T09:54:48.7767265Z             },
2026-08-28T09:54:48.7767517Z             {
2026-08-28T09:54:48.7767828Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7768100Z               "line": 2396
2026-08-28T09:54:48.7768358Z             },
2026-08-28T09:54:48.7768611Z             {
2026-08-28T09:54:48.7768926Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7769293Z               "line": 2408
2026-08-28T09:54:48.7769549Z             },
2026-08-28T09:54:48.7769813Z             {
2026-08-28T09:54:48.7770127Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7770399Z               "line": 2941
2026-08-28T09:54:48.7770658Z             },
2026-08-28T09:54:48.7770915Z             {
2026-08-28T09:54:48.7771234Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7771512Z               "line": 2962
2026-08-28T09:54:48.7771769Z             },
2026-08-28T09:54:48.7772020Z             {
2026-08-28T09:54:48.7772418Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7772694Z               "line": 2995
2026-08-28T09:54:48.7772947Z             },
2026-08-28T09:54:48.7773205Z             {
2026-08-28T09:54:48.7773519Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7773796Z               "line": 3664
2026-08-28T09:54:48.7774045Z             },
2026-08-28T09:54:48.7774307Z             {
2026-08-28T09:54:48.7774624Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7774898Z               "line": 3688
2026-08-28T09:54:48.7775161Z             },
2026-08-28T09:54:48.7775419Z             {
2026-08-28T09:54:48.7775729Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7776001Z               "line": 3884
2026-08-28T09:54:48.7776263Z             },
2026-08-28T09:54:48.7776573Z             {
2026-08-28T09:54:48.7776893Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7777164Z               "line": 3911
2026-08-28T09:54:48.7777420Z             },
2026-08-28T09:54:48.7777683Z             {
2026-08-28T09:54:48.7777993Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7778270Z               "line": 3935
2026-08-28T09:54:48.7778523Z             },
2026-08-28T09:54:48.7778779Z             {
2026-08-28T09:54:48.7779171Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7779452Z               "line": 4021
2026-08-28T09:54:48.7779713Z             },
2026-08-28T09:54:48.7779968Z             {
2026-08-28T09:54:48.7780287Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7780550Z               "line": 4050
2026-08-28T09:54:48.7780818Z             },
2026-08-28T09:54:48.7781070Z             {
2026-08-28T09:54:48.7781385Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7781656Z               "line": 4100
2026-08-28T09:54:48.7781922Z             },
2026-08-28T09:54:48.7782175Z             {
2026-08-28T09:54:48.7782490Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7782765Z               "line": 4249
2026-08-28T09:54:48.7783021Z             },
2026-08-28T09:54:48.7783346Z             {
2026-08-28T09:54:48.7783661Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7783937Z               "line": 4300
2026-08-28T09:54:48.7784189Z             },
2026-08-28T09:54:48.7784461Z             {
2026-08-28T09:54:48.7784771Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7785052Z               "line": 4313
2026-08-28T09:54:48.7785350Z             },
2026-08-28T09:54:48.7785598Z             {
2026-08-28T09:54:48.7785927Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7786184Z               "line": 4406
2026-08-28T09:54:48.7786445Z             },
2026-08-28T09:54:48.7786689Z             {
2026-08-28T09:54:48.7787052Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.7787386Z               "line": 96
2026-08-28T09:54:48.7787638Z             },
2026-08-28T09:54:48.7787900Z             {
2026-08-28T09:54:48.7788267Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.7788548Z               "line": 155
2026-08-28T09:54:48.7788801Z             }
2026-08-28T09:54:48.7789154Z           ]
2026-08-28T09:54:48.7789407Z         },
2026-08-28T09:54:48.7789664Z         "int": {
2026-08-28T09:54:48.7789945Z           "complete": true,
2026-08-28T09:54:48.7790216Z           "evidence": [
2026-08-28T09:54:48.7790481Z             {
2026-08-28T09:54:48.7790848Z               "path": "crates/spt/tests/cli_stack_smoke.rs",
2026-08-28T09:54:48.7791125Z               "line": 108
2026-08-28T09:54:48.7791373Z             }
2026-08-28T09:54:48.7791626Z           ]
2026-08-28T09:54:48.7791882Z         },
2026-08-28T09:54:48.7792140Z         "unit": {
2026-08-28T09:54:48.7792430Z           "complete": true,
2026-08-28T09:54:48.7792698Z           "evidence": [
2026-08-28T09:54:48.7792961Z             {
2026-08-28T09:54:48.7793278Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7793625Z               "line": 3075
2026-08-28T09:54:48.7793877Z             },
2026-08-28T09:54:48.7794143Z             {
2026-08-28T09:54:48.7794449Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7794725Z               "line": 3318
2026-08-28T09:54:48.7794982Z             },
2026-08-28T09:54:48.7795232Z             {
2026-08-28T09:54:48.7795547Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7795816Z               "line": 3424
2026-08-28T09:54:48.7796076Z             },
2026-08-28T09:54:48.7796329Z             {
2026-08-28T09:54:48.7796643Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7796911Z               "line": 3508
2026-08-28T09:54:48.7797173Z             },
2026-08-28T09:54:48.7797427Z             {
2026-08-28T09:54:48.7797737Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7798071Z               "line": 3541
2026-08-28T09:54:48.7798324Z             },
2026-08-28T09:54:48.7798578Z             {
2026-08-28T09:54:48.7798889Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7799245Z               "line": 3594
2026-08-28T09:54:48.7799494Z             },
2026-08-28T09:54:48.7799747Z             {
2026-08-28T09:54:48.7800062Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7800329Z               "line": 3731
2026-08-28T09:54:48.7800592Z             },
2026-08-28T09:54:48.7800843Z             {
2026-08-28T09:54:48.7801150Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7801418Z               "line": 3780
2026-08-28T09:54:48.7801675Z             },
2026-08-28T09:54:48.7801923Z             {
2026-08-28T09:54:48.7802286Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.7802557Z               "line": 205
2026-08-28T09:54:48.7802810Z             },
2026-08-28T09:54:48.7803071Z             {
2026-08-28T09:54:48.7803454Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.7803738Z               "line": 243
2026-08-28T09:54:48.7803993Z             },
2026-08-28T09:54:48.7804252Z             {
2026-08-28T09:54:48.7804694Z               "path": "crates/spt/src/picker/shortcut.rs",
2026-08-28T09:54:48.7804966Z               "line": 280
2026-08-28T09:54:48.7805219Z             }
2026-08-28T09:54:48.7805477Z           ]
2026-08-28T09:54:48.7805730Z         }
2026-08-28T09:54:48.7805982Z       }
2026-08-28T09:54:48.7806238Z     },
2026-08-28T09:54:48.7806489Z     {
2026-08-28T09:54:48.7806846Z       "id": "REQ-VIEWER-SKIP-TO-LIVE-ON-EVICT",
2026-08-28T09:54:48.7821958Z       "title": "A `rc --view` VIEWER that overflows its broker subscription queue and is EVICTED (OutputLog::append try_send Full → viewers.remove, REQ-HAZARD-VIEWER-ISOLATION session-protection) must SKIP TO LIVE, not die silently. ROOT (v0.13.0, b4 JIT item 2 = p0_paste + post-b4 a_journaled-Linux, ONE root): serve_attach forwards each frame (read_event→b64decode→re-encode AttachRecord→net_stream_send) SLOWER than the drain fans out under flood → its VIEWER_CHANNEL_DEPTH(256) channel overflows → the drain evicts (viewers.remove drops the ViewerSink → drops tx → viewer_writer's rx.recv() Err → the writer returns WRITING NOTHING) → serve_attach's brain.read_event() just STOPS getting Output (no EOF, no error) → serve_attach blocks forever → the operator receives nothing (attach_received_output=FALSE). Eviction-of-a-hopelessly-behind-viewer is CORRECT session-protection (keep it); SILENT+PERMANENT eviction is the bug. VIEWER-only → B2-SAFE (a viewer never advances delivered_through / is not authoritative / exposes no resume cursor). FIX (doyle-gated, skip-to-live = tail -f reconnect): (1) explicit broker→viewer EVICTION SIGNAL (KIND_VIEWER_EVICTED, written in the viewer_writer thread OFF the log lock, DISTINCT from session-exit EOF so serve must NOT tear down on it); (2) serve_attach re-subscribes from the CURRENT ring floor (skip-to-live, replays nothing, sees the next live burst) — resetting the cold serve-brain's next_seq so the post-eviction forward-jump replay is accepted (the legacy reject-gap path, brain.rs:618-626, would otherwise FATAL the forward jump); (3) HARD constraint NO evict→resubscribe busy-loop: serve_attach rate-limits re-subscribes (RESUBSCRIBE_INTERVAL) so under max-flood the operator sees intermittent LIVE bursts, never a CPU spin. (v0.13.0)",
2026-08-28T09:54:48.7822476Z       "requiredStages": [
2026-08-28T09:54:48.7822734Z         "doc",
2026-08-28T09:54:48.7822991Z         "impl",
2026-08-28T09:54:48.7823252Z         "unit",
2026-08-28T09:54:48.7823510Z         "int"
2026-08-28T09:54:48.7823763Z       ],
2026-08-28T09:54:48.7824030Z       "stages": {
2026-08-28T09:54:48.7824284Z         "doc": {
2026-08-28T09:54:48.7824570Z           "complete": true,
2026-08-28T09:54:48.7824834Z           "evidence": [
2026-08-28T09:54:48.7825095Z             {
2026-08-28T09:54:48.7825390Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7825743Z               "line": 405
2026-08-28T09:54:48.7825996Z             }
2026-08-28T09:54:48.7826244Z           ]
2026-08-28T09:54:48.7826512Z         },
2026-08-28T09:54:48.7826773Z         "impl": {
2026-08-28T09:54:48.7827064Z           "complete": true,
2026-08-28T09:54:48.7827335Z           "evidence": [
2026-08-28T09:54:48.7827586Z             {
2026-08-28T09:54:48.7827939Z               "path": "crates/spt-daemon/src/attach.rs",
2026-08-28T09:54:48.7828215Z               "line": 797
2026-08-28T09:54:48.7828473Z             },
2026-08-28T09:54:48.7828730Z             {
2026-08-28T09:54:48.7829183Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7829451Z               "line": 1223
2026-08-28T09:54:48.7829713Z             },
2026-08-28T09:54:48.7829965Z             {
2026-08-28T09:54:48.7830331Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7830602Z               "line": 1472
2026-08-28T09:54:48.7830860Z             },
2026-08-28T09:54:48.7831123Z             {
2026-08-28T09:54:48.7831476Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7831751Z               "line": 3556
2026-08-28T09:54:48.7832006Z             },
2026-08-28T09:54:48.7832344Z             {
2026-08-28T09:54:48.7832680Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.7832960Z               "line": 1778
2026-08-28T09:54:48.7833217Z             }
2026-08-28T09:54:48.7833469Z           ]
2026-08-28T09:54:48.7833727Z         },
2026-08-28T09:54:48.7833980Z         "int": {
2026-08-28T09:54:48.7834257Z           "complete": true,
2026-08-28T09:54:48.7834525Z           "evidence": [
2026-08-28T09:54:48.7834781Z             {
2026-08-28T09:54:48.7835220Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:48.7835490Z               "line": 2906
2026-08-28T09:54:48.7835745Z             }
2026-08-28T09:54:48.7835993Z           ]
2026-08-28T09:54:48.7836251Z         },
2026-08-28T09:54:48.7836566Z         "unit": {
2026-08-28T09:54:48.7836852Z           "complete": true,
2026-08-28T09:54:48.7837124Z           "evidence": [
2026-08-28T09:54:48.7837382Z             {
2026-08-28T09:54:48.7837731Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7838014Z               "line": 2661
2026-08-28T09:54:48.7838273Z             },
2026-08-28T09:54:48.7838522Z             {
2026-08-28T09:54:48.7838880Z               "path": "crates/spt-daemon/src/brain.rs",
2026-08-28T09:54:48.7839236Z               "line": 2952
2026-08-28T09:54:48.7839490Z             },
2026-08-28T09:54:48.7839743Z             {
2026-08-28T09:54:48.7840114Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7840382Z               "line": 10043
2026-08-28T09:54:48.7840635Z             },
2026-08-28T09:54:48.7840891Z             {
2026-08-28T09:54:48.7841258Z               "path": "crates/spt-daemon/src/broker.rs",
2026-08-28T09:54:48.7841525Z               "line": 10110
2026-08-28T09:54:48.7841787Z             },
2026-08-28T09:54:48.7842041Z             {
2026-08-28T09:54:48.7842379Z               "path": "crates/spt-daemon/src/msg.rs",
2026-08-28T09:54:48.7842717Z               "line": 2096
2026-08-28T09:54:48.7842988Z             }
2026-08-28T09:54:48.7843240Z           ]
2026-08-28T09:54:48.7843491Z         }
2026-08-28T09:54:48.7843743Z       }
2026-08-28T09:54:48.7843996Z     },
2026-08-28T09:54:48.7844250Z     {
2026-08-28T09:54:48.7844574Z       "id": "REQ-VIS-REMOTE-NOT-HIDE-NEW",
2026-08-28T09:54:48.7864204Z       "title": "A REMOTE ENDPOINT'S VISIBILITY IS ITS OWN NODE'S BUSINESS, AND THE ASKING NODE'S `hide_new_endpoints` POSTURE GOVERNS ITS OWN ENDPOINTS ONLY. `VisibilityStore::hidden` resolves an explicit per-(endpoint, subnet) override first and otherwise falls through to `subnet_hide_new || default_hide`; a REMOTE id never has an override or a default-hide row in the ASKING node's local store, so on any node whose subnet has `hide_new_endpoints` ON that fall-through evaluates true for EVERY remote id and the resolve-side exclusion vetoes them all -- `resolve_across_visible` returns NotFound and every remote wan target is refused on that node. IT IS NOT CONSERVATIVE, IT IS BACKWARDS: `hide_new_endpoints` is the OWNING node's advertisement policy, captured at join and enforced at the advertisement/sync gate on the owning side, so a hidden remote endpoint has no registry row on the asking node at all. The asker-side re-application therefore gates nothing the owner has not already gated, and vetoes exactly the rows the owner deliberately advertised. THE OWNING-SIDE GATE IS UNTOUCHED -- this is a resolve-side scoping fix, not a relaxation of who advertises what -- AND EXPLICIT PER-ENDPOINT OVERRIDES KEEP WORKING IN BOTH DIRECTIONS, including on remote ids, because an operator who named a specific endpoint said something the default never said. Gate: impl -- the resolve-side default applying only to ids the local node owns, at one shared seam rather than re-decided per call site (the call-site count is grep-swept, not estimated); unit -- with `hide_new` ON, a remote id with no local rows RESOLVES while a LOCAL id with no local rows is still HIDDEN (the pair asserted together, since either alone passes an implementation that scopes everything one way), an explicit override still HIDES a remote id and still REVEALS a locally-owned one, and -- the vacuity guard, since a fixture whose rows are uniform in the asserted property proves nothing -- the same fixture with `hide_new` OFF is shown resolving both, so the ON-case difference is the posture answering and not the fixture.",
2026-08-28T09:54:48.7864727Z       "requiredStages": [
2026-08-28T09:54:48.7865008Z         "doc",
2026-08-28T09:54:48.7865275Z         "impl",
2026-08-28T09:54:48.7865527Z         "unit",
2026-08-28T09:54:48.7865788Z         "int"
2026-08-28T09:54:48.7866037Z       ],
2026-08-28T09:54:48.7866304Z       "stages": {
2026-08-28T09:54:48.7866562Z         "doc": {
2026-08-28T09:54:48.7866849Z           "complete": true,
2026-08-28T09:54:48.7867199Z           "evidence": [
2026-08-28T09:54:48.7867460Z             {
2026-08-28T09:54:48.7867759Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7868031Z               "line": 768
2026-08-28T09:54:48.7868289Z             }
2026-08-28T09:54:48.7868537Z           ]
2026-08-28T09:54:48.7868805Z         },
2026-08-28T09:54:48.7869153Z         "impl": {
2026-08-28T09:54:48.7869435Z           "complete": true,
2026-08-28T09:54:48.7869709Z           "evidence": [
2026-08-28T09:54:48.7869968Z             {
2026-08-28T09:54:48.7870322Z               "path": "crates/spt-store/src/perch.rs",
2026-08-28T09:54:48.7870598Z               "line": 786
2026-08-28T09:54:48.7870860Z             },
2026-08-28T09:54:48.7871127Z             {
2026-08-28T09:54:48.7871447Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7871761Z               "line": 6427
2026-08-28T09:54:48.7872020Z             },
2026-08-28T09:54:48.7872268Z             {
2026-08-28T09:54:48.7872590Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7872867Z               "line": 6689
2026-08-28T09:54:48.7873119Z             },
2026-08-28T09:54:48.7873458Z             {
2026-08-28T09:54:48.7873773Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7874054Z               "line": 6824
2026-08-28T09:54:48.7874312Z             },
2026-08-28T09:54:48.7874565Z             {
2026-08-28T09:54:48.7874906Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.7875177Z               "line": 315
2026-08-28T09:54:48.7875438Z             },
2026-08-28T09:54:48.7875691Z             {
2026-08-28T09:54:48.7876020Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7876282Z               "line": 131
2026-08-28T09:54:48.7876540Z             },
2026-08-28T09:54:48.7876793Z             {
2026-08-28T09:54:48.7877118Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7877385Z               "line": 144
2026-08-28T09:54:48.7877707Z             },
2026-08-28T09:54:48.7877981Z             {
2026-08-28T09:54:48.7878329Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7878630Z               "line": 170
2026-08-28T09:54:48.7878930Z             }
2026-08-28T09:54:48.7879699Z           ]
2026-08-28T09:54:48.7880103Z         },
2026-08-28T09:54:48.7880429Z         "int": {
2026-08-28T09:54:48.7880862Z           "complete": true,
2026-08-28T09:54:48.7881255Z           "evidence": [
2026-08-28T09:54:48.7881659Z             {
2026-08-28T09:54:48.7882194Z               "path": "crates/spt/tests/hide_new_remote_rows_e2e.rs",
2026-08-28T09:54:48.7882528Z               "line": 160
2026-08-28T09:54:48.7882833Z             },
2026-08-28T09:54:48.7883146Z             {
2026-08-28T09:54:48.7883684Z               "path": "crates/spt/tests/hide_new_remote_rows_e2e.rs",
2026-08-28T09:54:48.7884023Z               "line": 169
2026-08-28T09:54:48.7884337Z             },
2026-08-28T09:54:48.7884657Z             {
2026-08-28T09:54:48.7885186Z               "path": "crates/spt/tests/hide_new_remote_rows_e2e.rs",
2026-08-28T09:54:48.7885513Z               "line": 190
2026-08-28T09:54:48.7885828Z             }
2026-08-28T09:54:48.7886142Z           ]
2026-08-28T09:54:48.7886647Z         },
2026-08-28T09:54:48.7886962Z         "unit": {
2026-08-28T09:54:48.7887301Z           "complete": true,
2026-08-28T09:54:48.7887640Z           "evidence": [
2026-08-28T09:54:48.7887945Z             {
2026-08-28T09:54:48.7888352Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7888685Z               "line": 1783
2026-08-28T09:54:48.7889151Z             },
2026-08-28T09:54:48.7889543Z             {
2026-08-28T09:54:48.7889963Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7890292Z               "line": 1807
2026-08-28T09:54:48.7890612Z             },
2026-08-28T09:54:48.7890929Z             {
2026-08-28T09:54:48.7891337Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7891675Z               "line": 1826
2026-08-28T09:54:48.7892081Z             },
2026-08-28T09:54:48.7892395Z             {
2026-08-28T09:54:48.7892797Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7893141Z               "line": 1850
2026-08-28T09:54:48.7893446Z             },
2026-08-28T09:54:48.7893739Z             {
2026-08-28T09:54:48.7894064Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.7894426Z               "line": 1880
2026-08-28T09:54:48.7894684Z             }
2026-08-28T09:54:48.7894936Z           ]
2026-08-28T09:54:48.7895188Z         }
2026-08-28T09:54:48.7895441Z       }
2026-08-28T09:54:48.7895696Z     },
2026-08-28T09:54:48.7895941Z     {
2026-08-28T09:54:48.7896254Z       "id": "REQ-VOCAB-ANCHOR-SUBNET",
2026-08-28T09:54:48.7929313Z       "title": "THE UBIQUITOUS LANGUAGE FOR AN ENDPOINT'S DEFAULT-SCOPE SUBNET IS `anchor subnet`, NOT `home subnet`. Operator-requested (discord:reavo) and GREENLIT as releases#176: `home` reads as a place the endpoint lives, which is precisely the reading the concept must not carry — identity is node-global and advertised into EVERY subnet the node belongs to, and the subnet in question anchors DEFAULTS (sync scope, bare-name qualification) rather than bounding where the endpoint exists. The glossary body already used the word `anchor` to explain what `home` meant, which is the tell: the definition needed a second word to undo the first. THIS INVERTS A RATIFIED GLOSSARY AVOID AND MUST SAY SO INLINE. CONTEXT.md carried an `_Avoid_` line forbidding the term `anchor subnet`, ratified at the 2026-07-28 access-control grill; that line becomes current-truth `anchor subnet` CARRYING A DATED SUPERSEDE NOTE naming both dates and the greenlight, because a bare inversion is what a future grill re-derives as drift (doyle, 2026-08-19). It is an ALIGNMENT rather than a reversal in spirit: operator vocabulary had already drifted this way — SPT_MANTLE was called the engine-room ANCHOR on 2026-08-05 — and the note is what stops the next reader re-litigating it. THE RENAME STOPS AT THE SERIALIZATION BOUNDARY, and that boundary is the whole risk of this requirement. `PerchInfo.home_subnet` is an ON-DISK serde key in every perch `info.json` and rides the pairing/wire path; renaming it would make every existing perch read as anchor-less and every N-1 daemon lose the key. The field KEEPS ITS NAME so the key keeps its spelling by identity — no `#[serde(rename)]` to maintain and no chance of a later rename silently changing the wire (an `alias` would have been WORSE THAN NOTHING: it is READ-compat only and would still WRITE the new spelling — doyle's correction, 2026-08-19). The freeze is stated AT the field, so the next reader meets the reason where the exception lives. DATED RECORDS ARE NOT REWRITTEN: ADR filenames and titles stay (ADR-0010 `immutable-home-subnet`, ADR-0026 `multi-subnet-home`), and their BODIES keep their words too, each gaining a short dated vocabulary note instead — a decision record states what was decided when, and re-spelling its prose would leave the project unable to tell an amended record from an original one. REQ ids carrying HOME (REQ-RUN-PICKER-HOME) are identifiers on the same footing as ADR filenames and do not move. RECORDS ARE NOT SWEPT, and the ROADMAP's delivered-milestone log and the dated `docs/F-0xx` design notes are records on the same footing as the ADRs — they state what was delivered or designed when, under the word in use at the time. WHAT DOES MOVE: every LIVE surface a person reads — CONTEXT.md, PRD, docs/MANIFEST.md, the docs-site operator prose, CLI help and doc comments, picker titles and legends, and ALL THREE user-visible diagnostic tokens, which become `ANCHOR_NOT_MEMBER`, `NO_ANCHOR_SUBNET` and `ANCHOR_REFUSED` — a diagnostic is the loudest vocabulary the CLI has and would otherwise teach the retired word at exactly the moment an operator is looking the concept up, and renaming two of three would read as a typo rather than as a decision. `ANCHOR_REFUSED` is asserted by two e2e files, whose assertions move in the same change. Gate: doc — the CONTEXT.md glossary term renamed with its inline dated supersede, the docs-site/PRD/MANIFEST prose, and the dated vocabulary notes on ADR-0010 and ADR-0026; impl — the CLI/help/picker text, the three diagnostic tokens, and the stated freeze at the serde field; unit — the renamed tokens and picker text are asserted at their own seats AND the retired spellings are asserted ABSENT, because a partial sweep that leaves one surface behind reads as a typo rather than as the boundary this requirement draws.",
2026-08-28T09:54:48.7930290Z       "requiredStages": [
2026-08-28T09:54:48.7930617Z         "doc",
2026-08-28T09:54:48.7930935Z         "impl",
2026-08-28T09:54:48.7931254Z         "unit"
2026-08-28T09:54:48.7931555Z       ],
2026-08-28T09:54:48.7931884Z       "stages": {
2026-08-28T09:54:48.7932194Z         "doc": {
2026-08-28T09:54:48.7932542Z           "complete": true,
2026-08-28T09:54:48.7932866Z           "evidence": [
2026-08-28T09:54:48.7933183Z             {
2026-08-28T09:54:48.7933563Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.7933841Z               "line": 784
2026-08-28T09:54:48.7934098Z             }
2026-08-28T09:54:48.7934413Z           ]
2026-08-28T09:54:48.7934685Z         },
2026-08-28T09:54:48.7934956Z         "impl": {
2026-08-28T09:54:48.7935242Z           "complete": true,
2026-08-28T09:54:48.7935514Z           "evidence": [
2026-08-28T09:54:48.7935770Z             {
2026-08-28T09:54:48.7936128Z               "path": "crates/spt/src/api/startup.rs",
2026-08-28T09:54:48.7936405Z               "line": 1212
2026-08-28T09:54:48.7936653Z             }
2026-08-28T09:54:48.7936905Z           ]
2026-08-28T09:54:48.7937157Z         },
2026-08-28T09:54:48.7937415Z         "int": {
2026-08-28T09:54:48.7937696Z           "complete": false,
2026-08-28T09:54:48.7937974Z           "evidence": []
2026-08-28T09:54:48.7938225Z         },
2026-08-28T09:54:48.7938479Z         "unit": {
2026-08-28T09:54:48.7938761Z           "complete": true,
2026-08-28T09:54:48.7939158Z           "evidence": [
2026-08-28T09:54:48.7939414Z             {
2026-08-28T09:54:48.7939729Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7940001Z               "line": 30980
2026-08-28T09:54:48.7940263Z             }
2026-08-28T09:54:48.7940521Z           ]
2026-08-28T09:54:48.7940779Z         }
2026-08-28T09:54:48.7941034Z       }
2026-08-28T09:54:48.7941289Z     },
2026-08-28T09:54:48.7941538Z     {
2026-08-28T09:54:48.7941839Z       "id": "REQ-WAKE-RESUME-LEG",
2026-08-28T09:54:48.7957873Z       "title": "A-2 (REMOTE-TRUTH triage §A-2 + ADR-0033): the daemon reconcile gains a WAKE-RESUME LEG — an endpoint whose rest INTENT is Active but whose harness session is COLD (status != online) is resumed by the daemon via the adapter's [session.resume] template using the LAST LEDGER session id, so a bare `spt wake <id>` on a suspended live agent actually brings it back (today: reconcile_once start-arm hosts ONLY status==online (livehost.rs:199), so a woken-but-unbound endpoint is skipped forever — neither status reaches online nor does reconcile re-host). This is the ADR-0033 LIFT: the thin `spt wake` edge writes rest intent, the DAEMON does the work. Mirrors shellwake::resolve_wake (read rest state, live-pid double-launch guard, launch, NEVER flip status — the harness self-binds → online). The leg reads the recorded adapter (D-2, REQ-SESSION-ADAPTER-RECORDED); an UNREGISTERED recorded adapter is the Q5 daemon-variant refuse: do NOT spawn, record a LOUD host_error report (F-1 naming the adapter + `spt adapter add`), never silent, never fallback-spawn on a different adapter. BINDS: (1) status=online is set ONLY by a real bind — the resume leg NEVER stamps it (CONTEXT liveness truth; the A-1 effective-state derivation depends on this staying honest). (2) host_error is a REPORT of the most recent host-level failure, NEVER a liveness input — neither liveness nor advertised_status reads it (host_error + online still derives Active); cleared on a successful host/bind; the existing silent `continue` on a deregistered online adapter (livehost.rs:205) folds into the same field. (3) the resume-pid guard marker is CUSTODY-ONLY (F-030 nested-record discipline) — never a liveness input. cold-with-no-ledger-row degrades benign (loud-logged skip, no crash, today's behavior). Single-node; C-2 picker Wake-now unblocks after. --wait is a SEPARATE rider (REQ-WAKE-WAIT).",
2026-08-28T09:54:48.7958459Z       "requiredStages": [
2026-08-28T09:54:48.7958737Z         "impl",
2026-08-28T09:54:48.7959273Z         "unit",
2026-08-28T09:54:48.7959672Z         "int"
2026-08-28T09:54:48.7959997Z       ],
2026-08-28T09:54:48.7960325Z       "stages": {
2026-08-28T09:54:48.7960645Z         "doc": {
2026-08-28T09:54:48.7960993Z           "complete": false,
2026-08-28T09:54:48.7961336Z           "evidence": []
2026-08-28T09:54:48.7961651Z         },
2026-08-28T09:54:48.7961966Z         "impl": {
2026-08-28T09:54:48.7962311Z           "complete": true,
2026-08-28T09:54:48.7962644Z           "evidence": [
2026-08-28T09:54:48.7962978Z             {
2026-08-28T09:54:48.7963459Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7963794Z               "line": 217
2026-08-28T09:54:48.7964265Z             },
2026-08-28T09:54:48.7964570Z             {
2026-08-28T09:54:48.7965029Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7965372Z               "line": 324
2026-08-28T09:54:48.7965692Z             },
2026-08-28T09:54:48.7966007Z             {
2026-08-28T09:54:48.7966465Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7966794Z               "line": 361
2026-08-28T09:54:48.7967113Z             },
2026-08-28T09:54:48.7967423Z             {
2026-08-28T09:54:48.7967841Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.7968175Z               "line": 272
2026-08-28T09:54:48.7968485Z             },
2026-08-28T09:54:48.7968809Z             {
2026-08-28T09:54:48.7969316Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.7969738Z               "line": 794
2026-08-28T09:54:48.7970051Z             },
2026-08-28T09:54:48.7970356Z             {
2026-08-28T09:54:48.7970756Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.7971090Z               "line": 7567
2026-08-28T09:54:48.7971405Z             }
2026-08-28T09:54:48.7971720Z           ]
2026-08-28T09:54:48.7972029Z         },
2026-08-28T09:54:48.7972340Z         "int": {
2026-08-28T09:54:48.7972686Z           "complete": true,
2026-08-28T09:54:48.7973012Z           "evidence": [
2026-08-28T09:54:48.7973342Z             {
2026-08-28T09:54:48.7973795Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7974063Z               "line": 2535
2026-08-28T09:54:48.7974320Z             },
2026-08-28T09:54:48.7974563Z             {
2026-08-28T09:54:48.7974930Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7975196Z               "line": 2565
2026-08-28T09:54:48.7975452Z             },
2026-08-28T09:54:48.7975705Z             {
2026-08-28T09:54:48.7976071Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7976343Z               "line": 2594
2026-08-28T09:54:48.7976587Z             },
2026-08-28T09:54:48.7976921Z             {
2026-08-28T09:54:48.7977297Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7977570Z               "line": 2617
2026-08-28T09:54:48.7977822Z             },
2026-08-28T09:54:48.7978077Z             {
2026-08-28T09:54:48.7978425Z               "path": "crates/spt/tests/twohost_cli.rs",
2026-08-28T09:54:48.7978688Z               "line": 735
2026-08-28T09:54:48.7979017Z             },
2026-08-28T09:54:48.7979269Z             {
2026-08-28T09:54:48.7979670Z               "path": "crates/spt/tests/wake_resume_bind_e2e.rs",
2026-08-28T09:54:48.7979955Z               "line": 40
2026-08-28T09:54:48.7980210Z             }
2026-08-28T09:54:48.7980460Z           ]
2026-08-28T09:54:48.7980710Z         },
2026-08-28T09:54:48.7980973Z         "unit": {
2026-08-28T09:54:48.7981311Z           "complete": true,
2026-08-28T09:54:48.7981583Z           "evidence": [
2026-08-28T09:54:48.7981832Z             {
2026-08-28T09:54:48.7988420Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.7988762Z               "line": 2487
2026-08-28T09:54:48.7989201Z             },
2026-08-28T09:54:48.7989463Z             {
2026-08-28T09:54:48.7989883Z               "path": "crates/spt-daemon/src/registryhost.rs",
2026-08-28T09:54:48.7990168Z               "line": 2297
2026-08-28T09:54:48.7990422Z             },
2026-08-28T09:54:48.7990684Z             {
2026-08-28T09:54:48.7991032Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.7991317Z               "line": 1669
2026-08-28T09:54:48.7991566Z             }
2026-08-28T09:54:48.7991824Z           ]
2026-08-28T09:54:48.7992077Z         }
2026-08-28T09:54:48.7992335Z       }
2026-08-28T09:54:48.7992588Z     },
2026-08-28T09:54:48.7992840Z     {
2026-08-28T09:54:48.7993145Z       "id": "REQ-WAKE-WAIT",
2026-08-28T09:54:48.7998536Z       "title": "A-2 rider (REMOTE-TRUTH triage §A-2): `spt endpoint wake --wait` blocks on the REAL bind (status reaches online) after the daemon wake-resume lift (REQ-WAKE-RESUME-LEG), instead of the DEFAULT accepted-not-bound print (thin edge writes intent, daemon lifts async — ADR-0033). Reuses the F-027 bind-await machinery if/when it lands, else a bounded poll on status==online with a plain-language timeout (no core lingo, F-1). Default wake is UNCHANGED (accepted-not-bound truth). Separate chunk from the core leg (doyle A-2 ruling: C-2 needs the core leg, not --wait); F-027 bind-await stays design-only until this activates.",
2026-08-28T09:54:48.7999117Z       "requiredStages": [],
2026-08-28T09:54:48.7999385Z       "stages": {
2026-08-28T09:54:48.7999642Z         "doc": {
2026-08-28T09:54:48.7999927Z           "complete": false,
2026-08-28T09:54:48.8000194Z           "evidence": []
2026-08-28T09:54:48.8000452Z         },
2026-08-28T09:54:48.8000800Z         "impl": {
2026-08-28T09:54:48.8001085Z           "complete": false,
2026-08-28T09:54:48.8001362Z           "evidence": []
2026-08-28T09:54:48.8001642Z         },
2026-08-28T09:54:48.8001903Z         "int": {
2026-08-28T09:54:48.8002189Z           "complete": false,
2026-08-28T09:54:48.8002475Z           "evidence": []
2026-08-28T09:54:48.8002723Z         },
2026-08-28T09:54:48.8002981Z         "unit": {
2026-08-28T09:54:48.8003252Z           "complete": false,
2026-08-28T09:54:48.8003530Z           "evidence": []
2026-08-28T09:54:48.8003773Z         }
2026-08-28T09:54:48.8004029Z       }
2026-08-28T09:54:48.8004281Z     },
2026-08-28T09:54:48.8004528Z     {
2026-08-28T09:54:48.8004890Z       "id": "REQ-WAN-DENY-PRECEDES-EXISTENCE",
2026-08-28T09:54:48.8021792Z       "title": "At the WAN ingress, an ACCESS DENIAL and an ABSENT PERCH are DISTINCT OUTCOMES, and the denial arm runs FIRST. `receive_wan` consults the gate before it asks whether the target's perch exists, so a refused arrival returns `WanOutcome::Refused` whether or not the target is there, and `WanOutcome::NoPerch` is reserved for an ADMITTED arrival with nothing to deliver to. The ordering is the load-bearing half and it is not an accident of layout: reversed, a denied message to an absent perch would report absence, which both mislabels the refusal AND is the precise shape that would make a later `DENIED`-style reword of the NO_PERCH line leak the existence of an endpoint deliberately hidden from the asker (the DISCOVER-denial seam, where `Existence is not advertised` is ratified three times over in `wansend.rs`). The distinctness half is what the two outcomes MEAN downstream: `Refused` rides the wire as `refused` and renders `WAN_REFUSED` at the sender, `NoPerch` rides as `no_perch` and renders the absence line, and an operator diagnosing a silent peer acts differently on each. TWO LANDED UNITS ALREADY LEAN ON THIS UNNAMED � `the_stamp_not_the_from_is_the_sender_subject` and `an_admitted_arrival_records_contact_and_a_refused_one_does_not` both seed NO perch and both assert `Refused` (and its absence) at the ingress, so their green depends entirely on the deny arm preceding the existence test while nothing states that it must. This requirement names the dependency and pins it. MEASURED 2026-08-19 (releases#171 measurement, todlando): with the perch ABSENT in both arms and the deny rule as the only variable, denied-msg => `Refused` and allowed-msg => `NoPerch`. Gate: impl � the deny arm at the head of `receive_wan`, ahead of the perch-existence test; unit � the one-variable both-arms measurement, which fails if either the ordering or the distinctness is broken. Kin REQ-MSG-SENDER-STAMP (whose tier-1 subject decides the deny), REQ-ACL-DISCOVER-DEFAULT-ON (the seam whose camouflage this ordering protects).",
2026-08-28T09:54:48.8022311Z       "requiredStages": [
2026-08-28T09:54:48.8022586Z         "impl",
2026-08-28T09:54:48.8022837Z         "unit"
2026-08-28T09:54:48.8023096Z       ],
2026-08-28T09:54:48.8023362Z       "stages": {
2026-08-28T09:54:48.8023634Z         "doc": {
2026-08-28T09:54:48.8023920Z           "complete": false,
2026-08-28T09:54:48.8024196Z           "evidence": []
2026-08-28T09:54:48.8024506Z         },
2026-08-28T09:54:48.8024763Z         "impl": {
2026-08-28T09:54:48.8025059Z           "complete": true,
2026-08-28T09:54:48.8025525Z           "evidence": [
2026-08-28T09:54:48.8025909Z             {
2026-08-28T09:54:48.8026315Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8026592Z               "line": 915
2026-08-28T09:54:48.8026845Z             }
2026-08-28T09:54:48.8027101Z           ]
2026-08-28T09:54:48.8027359Z         },
2026-08-28T09:54:48.8027611Z         "int": {
2026-08-28T09:54:48.8027898Z           "complete": false,
2026-08-28T09:54:48.8028168Z           "evidence": []
2026-08-28T09:54:48.8028429Z         },
2026-08-28T09:54:48.8028685Z         "unit": {
2026-08-28T09:54:48.8029063Z           "complete": true,
2026-08-28T09:54:48.8029339Z           "evidence": [
2026-08-28T09:54:48.8029682Z             {
2026-08-28T09:54:48.8030036Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8030312Z               "line": 1398
2026-08-28T09:54:48.8030579Z             }
2026-08-28T09:54:48.8030831Z           ]
2026-08-28T09:54:48.8031104Z         }
2026-08-28T09:54:48.8031370Z       }
2026-08-28T09:54:48.8031627Z     },
2026-08-28T09:54:48.8031879Z     {
2026-08-28T09:54:48.8032189Z       "id": "REQ-WAN-SEND-DELIVERY",
2026-08-28T09:54:48.8039550Z       "title": "Bug #9/#10: cross-node spt send reports SENT(WAN) but does not deliver, even on stable-IP pairs. Real root: spt send resolves the dial with id-only addr_for_node_hex (endpoint.rs:538) which forces a fresh iroh discovery round-trip every send, while the gossip pump uses cached direct addresses (dial_seeded/PeerAddrStore) so gossip stays green but send rides a marginal discovery path that cannot carry the fire-and-forget payload; the handshake completes so SENT(WAN) prints falsely. Fix: (1) route the WAN dial through the pump seeded-direct-address resolution (PeerAddrStore first, id-only fallback); (2) receiver writes its WanOutcome back so the sender confirms delivery under the QUIC deadline and only reports SENT on confirmed delivery, honest failure otherwise. Access-gate/perch/spool all verified correct (ruled out). See docs/NEXT-MILESTONE-BUG-TRIAGE.md #9-10.",
2026-08-28T09:54:48.8039948Z       "requiredStages": [
2026-08-28T09:54:48.8040204Z         "impl",
2026-08-28T09:54:48.8040467Z         "unit",
2026-08-28T09:54:48.8040724Z         "int"
2026-08-28T09:54:48.8040987Z       ],
2026-08-28T09:54:48.8041250Z       "stages": {
2026-08-28T09:54:48.8041509Z         "doc": {
2026-08-28T09:54:48.8041800Z           "complete": false,
2026-08-28T09:54:48.8042081Z           "evidence": []
2026-08-28T09:54:48.8042345Z         },
2026-08-28T09:54:48.8042602Z         "impl": {
2026-08-28T09:54:48.8042889Z           "complete": true,
2026-08-28T09:54:48.8043161Z           "evidence": [
2026-08-28T09:54:48.8043422Z             {
2026-08-28T09:54:48.8043831Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8044105Z               "line": 156
2026-08-28T09:54:48.8044367Z             },
2026-08-28T09:54:48.8044620Z             {
2026-08-28T09:54:48.8044977Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8045245Z               "line": 195
2026-08-28T09:54:48.8045493Z             },
2026-08-28T09:54:48.8045775Z             {
2026-08-28T09:54:48.8046113Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8046376Z               "line": 280
2026-08-28T09:54:48.8046636Z             },
2026-08-28T09:54:48.8046877Z             {
2026-08-28T09:54:48.8047234Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:48.8047516Z               "line": 164
2026-08-28T09:54:48.8047807Z             },
2026-08-28T09:54:48.8048074Z             {
2026-08-28T09:54:48.8048431Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.8048722Z               "line": 210
2026-08-28T09:54:48.8049060Z             },
2026-08-28T09:54:48.8049307Z             {
2026-08-28T09:54:48.8049635Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.8049978Z               "line": 808
2026-08-28T09:54:48.8050236Z             }
2026-08-28T09:54:48.8050546Z           ]
2026-08-28T09:54:48.8050808Z         },
2026-08-28T09:54:48.8051069Z         "int": {
2026-08-28T09:54:48.8051356Z           "complete": true,
2026-08-28T09:54:48.8051627Z           "evidence": [
2026-08-28T09:54:48.8051881Z             {
2026-08-28T09:54:48.8052219Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.8052486Z               "line": 2279
2026-08-28T09:54:48.8052743Z             }
2026-08-28T09:54:48.8053033Z           ]
2026-08-28T09:54:48.8053290Z         },
2026-08-28T09:54:48.8053558Z         "unit": {
2026-08-28T09:54:48.8053848Z           "complete": true,
2026-08-28T09:54:48.8054116Z           "evidence": [
2026-08-28T09:54:48.8054443Z             {
2026-08-28T09:54:48.8054796Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8055124Z               "line": 1262
2026-08-28T09:54:48.8055391Z             },
2026-08-28T09:54:48.8055658Z             {
2026-08-28T09:54:48.8056025Z               "path": "crates/spt-net/src/net/wanmsg.rs",
2026-08-28T09:54:48.8056302Z               "line": 399
2026-08-28T09:54:48.8056554Z             },
2026-08-28T09:54:48.8056811Z             {
2026-08-28T09:54:48.8057148Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.8057428Z               "line": 2079
2026-08-28T09:54:48.8057681Z             },
2026-08-28T09:54:48.8057938Z             {
2026-08-28T09:54:48.8058262Z               "path": "crates/spt/src/wansend.rs",
2026-08-28T09:54:48.8058554Z               "line": 2178
2026-08-28T09:54:48.8058811Z             }
2026-08-28T09:54:48.8059212Z           ]
2026-08-28T09:54:48.8059469Z         }
2026-08-28T09:54:48.8059719Z       }
2026-08-28T09:54:48.8059975Z     },
2026-08-28T09:54:48.8060234Z     {
2026-08-28T09:54:48.8060562Z       "id": "REQ-WAN-SPT-HOSTED-DELIVERY",
2026-08-28T09:54:48.8071565Z       "title": "A WAN-ARRIVED `spt send` is DELIVERED to an spt-hosted endpoint (broker holds its PTY, NO api-listen relay), not spooled-forever. Today receive_wan (spt-daemon/wan.rs:271-276) tries deliver_tcp (the harness-hosted relay leg) then falls to spool — it has NO spt-hosted broker-inject leg, which exists ONLY in local cmd_send (REQ-SEND-SPT-HOSTED, Brain::inject_endpoint → KIND_ENDPOINT_INPUT → broker dispatch_endpoint_input → translation-binary idle-inject). So a WAN arrival to an idle spt-hosted perch with a live translation binary ALWAYS sleeps in spool until an adapter hook polls (F-023: perch verifiably idle 7min, binary healthy, zero injection). FIX: factor cmd_send's spt-hosted delivery leg into a SHARED fn; receive_wan calls it after the replay-check (wan_seen_at) + restamp (restamp_wan_user_msg), BEFORE the spool fallback. Claim discipline UNCHANGED: inject delivered=true → wan_mark_seen_at then return the existing 'delivered' wire token (no wire change); delivered=false → the existing spool-with-claim transaction. v0.14.3 LAW: the shared leg is translation-binary-ONLY, NO raw-PTY fallback — a no-binary arrival SPOOLS LOUD, never writes the PTY. (F-023, BUILD-F023-WANIDLE)",
2026-08-28T09:54:48.8072100Z       "requiredStages": [
2026-08-28T09:54:48.8072366Z         "impl",
2026-08-28T09:54:48.8072630Z         "unit",
2026-08-28T09:54:48.8072883Z         "int"
2026-08-28T09:54:48.8073147Z       ],
2026-08-28T09:54:48.8073410Z       "stages": {
2026-08-28T09:54:48.8073672Z         "doc": {
2026-08-28T09:54:48.8073963Z           "complete": false,
2026-08-28T09:54:48.8074231Z           "evidence": []
2026-08-28T09:54:48.8074497Z         },
2026-08-28T09:54:48.8074759Z         "impl": {
2026-08-28T09:54:48.8075045Z           "complete": true,
2026-08-28T09:54:48.8075312Z           "evidence": [
2026-08-28T09:54:48.8075559Z             {
2026-08-28T09:54:48.8075938Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.8076225Z               "line": 35
2026-08-28T09:54:48.8076691Z             },
2026-08-28T09:54:48.8077112Z             {
2026-08-28T09:54:48.8077493Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.8077775Z               "line": 73
2026-08-28T09:54:48.8078033Z             },
2026-08-28T09:54:48.8078283Z             {
2026-08-28T09:54:48.8078658Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8078934Z               "line": 1062
2026-08-28T09:54:48.8079287Z             }
2026-08-28T09:54:48.8079544Z           ]
2026-08-28T09:54:48.8079807Z         },
2026-08-28T09:54:48.8080069Z         "int": {
2026-08-28T09:54:48.8080351Z           "complete": true,
2026-08-28T09:54:48.8080628Z           "evidence": [
2026-08-28T09:54:48.8080888Z             {
2026-08-28T09:54:48.8081345Z               "path": "crates/spt-daemon/tests/inject_control_wedge.rs",
2026-08-28T09:54:48.8081625Z               "line": 3002
2026-08-28T09:54:48.8081949Z             }
2026-08-28T09:54:48.8082203Z           ]
2026-08-28T09:54:48.8082454Z         },
2026-08-28T09:54:48.8082721Z         "unit": {
2026-08-28T09:54:48.8083003Z           "complete": true,
2026-08-28T09:54:48.8083279Z           "evidence": [
2026-08-28T09:54:48.8083538Z             {
2026-08-28T09:54:48.8083899Z               "path": "crates/spt-daemon/src/inject.rs",
2026-08-28T09:54:48.8084175Z               "line": 246
2026-08-28T09:54:48.8084418Z             },
2026-08-28T09:54:48.8084680Z             {
2026-08-28T09:54:48.8085018Z               "path": "crates/spt-daemon/src/wan.rs",
2026-08-28T09:54:48.8085305Z               "line": 1910
2026-08-28T09:54:48.8085697Z             }
2026-08-28T09:54:48.8085981Z           ]
2026-08-28T09:54:48.8086232Z         }
2026-08-28T09:54:48.8086494Z       }
2026-08-28T09:54:48.8086747Z     },
2026-08-28T09:54:48.8086995Z     {
2026-08-28T09:54:48.8087290Z       "id": "REQ-WHOAMI-1",
2026-08-28T09:54:48.8093964Z       "title": "The `endpoint list` SELF pin carries the Self endpoint's authored `endpoint description` (info::read_info(...).resources) when present, inline after the liveness state; whoami stays a top-level hot-path verb (parse unchanged, REQ-MSG-9) and renders the same description-carrying SELF pin. HISTORY: originally minted whoami as a thin ALIAS of `spt endpoint list` — that alias premise is SUPERSEDED by REQ-WHOAMI-IDENTITY-ONLY (PROJECT-INDEX W1, 2026-07-15): the alias inherited the list's O(perches x branches) git fanout onto hook paths (the 2026-07-15 message-delivery incident), so whoami is now identity-only over the shared render_self_pin. The pin render + parse evidence here stands; the full-roster surface lives solely on `endpoint list`.",
2026-08-28T09:54:48.8094407Z       "requiredStages": [
2026-08-28T09:54:48.8094668Z         "doc",
2026-08-28T09:54:48.8094921Z         "impl",
2026-08-28T09:54:48.8095187Z         "unit"
2026-08-28T09:54:48.8095441Z       ],
2026-08-28T09:54:48.8095718Z       "stages": {
2026-08-28T09:54:48.8096037Z         "doc": {
2026-08-28T09:54:48.8096315Z           "complete": true,
2026-08-28T09:54:48.8096593Z           "evidence": [
2026-08-28T09:54:48.8096853Z             {
2026-08-28T09:54:48.8097149Z               "path": "CONTEXT.md",
2026-08-28T09:54:48.8097430Z               "line": 1037
2026-08-28T09:54:48.8097693Z             }
2026-08-28T09:54:48.8097941Z           ]
2026-08-28T09:54:48.8098204Z         },
2026-08-28T09:54:48.8098465Z         "impl": {
2026-08-28T09:54:48.8098751Z           "complete": true,
2026-08-28T09:54:48.8099105Z           "evidence": [
2026-08-28T09:54:48.8099360Z             {
2026-08-28T09:54:48.8099682Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8099954Z               "line": 12153
2026-08-28T09:54:48.8100212Z             }
2026-08-28T09:54:48.8100465Z           ]
2026-08-28T09:54:48.8100722Z         },
2026-08-28T09:54:48.8100984Z         "int": {
2026-08-28T09:54:48.8101261Z           "complete": false,
2026-08-28T09:54:48.8101542Z           "evidence": []
2026-08-28T09:54:48.8101796Z         },
2026-08-28T09:54:48.8102061Z         "unit": {
2026-08-28T09:54:48.8102345Z           "complete": true,
2026-08-28T09:54:48.8102698Z           "evidence": [
2026-08-28T09:54:48.8102955Z             {
2026-08-28T09:54:48.8103284Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8103555Z               "line": 28586
2026-08-28T09:54:48.8103809Z             },
2026-08-28T09:54:48.8104066Z             {
2026-08-28T09:54:48.8104381Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8104659Z               "line": 28868
2026-08-28T09:54:48.8104899Z             }
2026-08-28T09:54:48.8105161Z           ]
2026-08-28T09:54:48.8105504Z         }
2026-08-28T09:54:48.8105776Z       }
2026-08-28T09:54:48.8106030Z     },
2026-08-28T09:54:48.8106278Z     {
2026-08-28T09:54:48.8106625Z       "id": "REQ-WHOAMI-EXPLICIT-SID-REFUSAL",
2026-08-28T09:54:48.8139567Z       "title": "RULED DESIGN, delivery unowned (doyle 2026-07-26): when a caller hands identity resolution an EXPLICIT non-empty $OWL_SESSION_ID that resolves to NO perch, core must REFUSE identity (unresolved, exit 1, loud distinct diagnostic) rather than fall through to an ambient/inherited one — today `detect_self_id` (roster.rs, legs a→b→b2→c) treats sid-UNMATCHED identically to sid-ABSENT, so the fallback chain re-adopts precisely the identity a sharper claim just failed to prove. MEASURED (perri, this node, 2026-07-26, three read-only whoami calls from a genuine descendant of the perri host process): (1) all SPT_*/OWL_* scrubbed → id null, exit 1 — ancestry resolved nothing (caveat honored from the probe: the perch's recorded pid was not in the caller's chain, so this run refutes lineage-as-the-mechanism for probe v1 without disproving a lineage path in general); (2) inherited SPT_ENDPOINT_ID=perri + explicit OWL_SESSION_ID matching no perch → perri, exit 0 — the mismatch datum was IN HAND (core had already scanned and failed to match the explicit sid) and the ambient id won anyway; (3) real OWL_SESSION_ID with endpoint id scrubbed → correct self — the healthy path any fix must leave untouched. SCOPE OF THE REFUSAL, ruled: only sid-PRESENT-AND-UNMATCHED poisons the fallback, and it poisons ALL weaker legs (b SPT_AGENT_ID, b2 SPT_ENDPOINT_ID, c pid-ancestry) — an explicit failed claim outranks every ambient claim below it; sid-ABSENT/empty keeps today's full chain unchanged, because the leg-b2 field root (live-repro'd 2026-07-10: the adapter surfaces OWL_SESSION_ID to the session shell as an UNEXPORTED var, so the child process legitimately carries endpoint id without sid) is exactly the flow the guard must not break — that flow is sid-absent, never sid-mismatched. WHY CORE AND NOT ONLY THE ADAPTER: the measured entry path is closed adapter-side (perri's REQ-HAZARD-INHERITED-IDENTITY-ADOPTION @ their a7558aa + claude-spt KNOWN-HAZARDS 7.4, shipped: whoami child calls scrub SPT_ENDPOINT_ID/SPT_AGENT_ID; rig discipline now detached AND env-scrubbed — the scrub is the operative half), but the inconsistency being fixed is CORE'S: the adapter fastpath's verified_env_id REFUSES an inherited SPT_ENDPOINT_ID on carrier-proof mismatch (carrier sid != payload sid) and core's fallback then RE-GRANTS what that layer just refused — one layer's refusal must not be another layer's grant, and every other harness/adapter gets the defense only if core holds it. SEVERITY UPGRADE recorded at mint: unlike the KH 7.1–7.3 shapes (lost reads), this adoption was WRITE-CAPABLE in the field — the adopting descendant re-pointed the ANCESTOR's session pin, so the ancestor went dark while the descendant looked healthy (perri's own pin, probe v1). KIN, same review same milestone: leg (b) SPT_AGENT_ID returns UNCONDITIONALLY today — not even perch-checked, weaker than leg b2's bound-perch gate; align it when this lands. MEASURED on the live node, not just code-read (perri, same probe run, reported 2026-07-26): SPT_AGENT_ID=nobody-xyz with a bogus OWL_SESSION_ID returned {'id':'nobody-xyz','ready':false,'alive':true,'unbound':false}, exit 0 — a phantom identity for an endpoint that does not exist, beating both the sid leg and ancestry; the returned shape has no state key and ready:false but a populated id, and the adapter parser takes .id first, so a whoami-trusting adapter writes state under the phantom — the same write-capable class as the inherited-adoption case, sourced from a made-up name instead of a real ancestor. perri's adapter scrub covers SPT_AGENT_ID as well as SPT_ENDPOINT_ID for exactly this reason. POSTURE UNCHANGED: whoami legs remain from-label/routing only, never authentication (KH 7.3/7.5, F-024 stays parked) — refusal tightens label discipline, it promotes nothing to auth. Gate at activation: unit — sid-unmatched + ambient endpoint id present → refusal with the distinct diagnostic (probe shape 2 goes loud); sid-absent + ambient endpoint id on a bound perch → still resolves (leg-b2 field root preserved); sid-matched → unchanged (probe shape 3).",
2026-08-28T09:54:48.8140362Z       "requiredStages": [],
2026-08-28T09:54:48.8140639Z       "stages": {
2026-08-28T09:54:48.8140905Z         "doc": {
2026-08-28T09:54:48.8141188Z           "complete": false,
2026-08-28T09:54:48.8141479Z           "evidence": []
2026-08-28T09:54:48.8141744Z         },
2026-08-28T09:54:48.8142009Z         "impl": {
2026-08-28T09:54:48.8142295Z           "complete": false,
2026-08-28T09:54:48.8142566Z           "evidence": []
2026-08-28T09:54:48.8142830Z         },
2026-08-28T09:54:48.8143092Z         "int": {
2026-08-28T09:54:48.8143383Z           "complete": false,
2026-08-28T09:54:48.8143660Z           "evidence": []
2026-08-28T09:54:48.8143912Z         },
2026-08-28T09:54:48.8144168Z         "unit": {
2026-08-28T09:54:48.8144447Z           "complete": false,
2026-08-28T09:54:48.8144720Z           "evidence": []
2026-08-28T09:54:48.8144972Z         }
2026-08-28T09:54:48.8145229Z       }
2026-08-28T09:54:48.8145477Z     },
2026-08-28T09:54:48.8145734Z     {
2026-08-28T09:54:48.8146054Z       "id": "REQ-WHOAMI-IDENTITY-ONLY",
2026-08-28T09:54:48.8154629Z       "title": "PROJECT-INDEX W1 (F-040, perri filing claude-spt docs/SPT-CORE-FINDINGS.md @d775b38; correctness-critical opener — the 2026-07-15 message-bodies incident root): a core IDENTITY-ONLY resolution — session -> endpoint|null — that touches NO list/registry/project/git/network path, and `spt whoami` DE-ALIASED from cmd_endpoint_list (cli.rs ~6609 aliases the full list = 100+ git children under hook deadlines). endpoint-info is DISQUALIFIED as the carrier (runs latest_project_ref). Adapters/hooks get a bounded-time identity verb; the harness-hosted adapter fallback stays deadline-vulnerable until this ships. Gate: impl — the resolver + whoami de-alias; unit — resolver returns endpoint|null with zero project derivation (assert no git spawn seam); int — whoami on a multi-perch home answers fast-path without touching context branches; doc — harness-contract api.md names the identity verb + its no-derivation bound. Kin REQ-PROJECT-INDEX-READER-CUTOVER (list-shaped verbs), REQ-WHOAMI-1, docs/PROJECT-INDEX-TRIAGE.md.",
2026-08-28T09:54:48.8155374Z       "requiredStages": [
2026-08-28T09:54:48.8155717Z         "doc",
2026-08-28T09:54:48.8156105Z         "impl",
2026-08-28T09:54:48.8156366Z         "unit",
2026-08-28T09:54:48.8156633Z         "int"
2026-08-28T09:54:48.8156890Z       ],
2026-08-28T09:54:48.8157149Z       "stages": {
2026-08-28T09:54:48.8157407Z         "doc": {
2026-08-28T09:54:48.8157686Z           "complete": true,
2026-08-28T09:54:48.8157962Z           "evidence": [
2026-08-28T09:54:48.8158224Z             {
2026-08-28T09:54:48.8158615Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:48.8158892Z               "line": 487
2026-08-28T09:54:48.8159284Z             }
2026-08-28T09:54:48.8159545Z           ]
2026-08-28T09:54:48.8159803Z         },
2026-08-28T09:54:48.8160114Z         "impl": {
2026-08-28T09:54:48.8160392Z           "complete": true,
2026-08-28T09:54:48.8160663Z           "evidence": [
2026-08-28T09:54:48.8160931Z             {
2026-08-28T09:54:48.8161260Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8161545Z               "line": 12249
2026-08-28T09:54:48.8161890Z             }
2026-08-28T09:54:48.8162146Z           ]
2026-08-28T09:54:48.8162399Z         },
2026-08-28T09:54:48.8162660Z         "int": {
2026-08-28T09:54:48.8162940Z           "complete": true,
2026-08-28T09:54:48.8163216Z           "evidence": [
2026-08-28T09:54:48.8163468Z             {
2026-08-28T09:54:48.8163864Z               "path": "crates/spt/tests/whoami_identity_e2e.rs",
2026-08-28T09:54:48.8164141Z               "line": 14
2026-08-28T09:54:48.8164398Z             }
2026-08-28T09:54:48.8164655Z           ]
2026-08-28T09:54:48.8164903Z         },
2026-08-28T09:54:48.8165166Z         "unit": {
2026-08-28T09:54:48.8165441Z           "complete": true,
2026-08-28T09:54:48.8165715Z           "evidence": [
2026-08-28T09:54:48.8165963Z             {
2026-08-28T09:54:48.8166393Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8166741Z               "line": 28870
2026-08-28T09:54:48.8166999Z             },
2026-08-28T09:54:48.8167260Z             {
2026-08-28T09:54:48.8167594Z               "path": "crates/spt/src/roster.rs",
2026-08-28T09:54:48.8167865Z               "line": 655
2026-08-28T09:54:48.8168103Z             }
2026-08-28T09:54:48.8168361Z           ]
2026-08-28T09:54:48.8168613Z         }
2026-08-28T09:54:48.8168890Z       }
2026-08-28T09:54:48.8169248Z     },
2026-08-28T09:54:48.8169495Z     {
2026-08-28T09:54:48.8169819Z       "id": "REQ-WORKER-LIST-VISIBILITY",
2026-08-28T09:54:48.8175558Z       "title": "V-1 (WORKER-TRUTH triage, operator rider): worker perches leave the DEFAULT `spt endpoint list` view — they are process-local machinery, not subnet citizens; leaked-or-live worker rows rendering as permanent OFFLINE endpoints is the operator-visible symptom root. A dedicated flag (--workers) reveals them (one command + flag per the --all/--detail precedent, NOT a separate list-working command — sister divergence deliberate). Applies to the human render, --json (additive default-absent filter), and the registry/projection legs; verify-and-stop any worker gossip into the subnet registry as peer endpoints.",
2026-08-28T09:54:48.8176170Z       "requiredStages": [
2026-08-28T09:54:48.8176438Z         "impl",
2026-08-28T09:54:48.8176691Z         "int"
2026-08-28T09:54:48.8176948Z       ],
2026-08-28T09:54:48.8177220Z       "stages": {
2026-08-28T09:54:48.8177486Z         "doc": {
2026-08-28T09:54:48.8177767Z           "complete": false,
2026-08-28T09:54:48.8178044Z           "evidence": []
2026-08-28T09:54:48.8178297Z         },
2026-08-28T09:54:48.8178560Z         "impl": {
2026-08-28T09:54:48.8178844Z           "complete": true,
2026-08-28T09:54:48.8179198Z           "evidence": [
2026-08-28T09:54:48.8179474Z             {
2026-08-28T09:54:48.8179803Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8180079Z               "line": 6334
2026-08-28T09:54:48.8180327Z             },
2026-08-28T09:54:48.8180675Z             {
2026-08-28T09:54:48.8180984Z               "path": "crates/spt/src/cli.rs",
2026-08-28T09:54:48.8181268Z               "line": 6349
2026-08-28T09:54:48.8181531Z             }
2026-08-28T09:54:48.8181783Z           ]
2026-08-28T09:54:48.8182046Z         },
2026-08-28T09:54:48.8182297Z         "int": {
2026-08-28T09:54:48.8182579Z           "complete": true,
2026-08-28T09:54:48.8182856Z           "evidence": [
2026-08-28T09:54:48.8183108Z             {
2026-08-28T09:54:48.8183533Z               "path": "crates/spt/tests/worker_visibility_e2e.rs",
2026-08-28T09:54:48.8183799Z               "line": 18
2026-08-28T09:54:48.8184051Z             },
2026-08-28T09:54:48.8184307Z             {
2026-08-28T09:54:48.8184718Z               "path": "crates/spt/tests/worker_visibility_e2e.rs",
2026-08-28T09:54:48.8184984Z               "line": 61
2026-08-28T09:54:48.8185242Z             }
2026-08-28T09:54:48.8185494Z           ]
2026-08-28T09:54:48.8185751Z         },
2026-08-28T09:54:48.8186013Z         "unit": {
2026-08-28T09:54:48.8186314Z           "complete": false,
2026-08-28T09:54:48.8186589Z           "evidence": []
2026-08-28T09:54:48.8186908Z         }
2026-08-28T09:54:48.8187170Z       }
2026-08-28T09:54:48.8187422Z     },
2026-08-28T09:54:48.8187674Z     {
2026-08-28T09:54:48.8187989Z       "id": "REQ-WORKER-MINTED-NAME",
2026-08-28T09:54:48.8192687Z       "title": "N-1 (WORKER-TRUTH triage, operator rider): worker perch identity is CORE-MINTED and parent-derived — `{parent}-w{N}` with a per-parent counter at registration (sister shape: claude_skill_owl hook_subagent_start.rs) — never the adapter-presented agent id (CC Task ids render as random-named rows). worker-start mints + echoes the id (WORKER_STARTED:{parent}-w{N}); the adapter's agent_id/agent_type ride the record as correlation METADATA, not identity. Verb-shape contract change — freeze with W-2 in ONE coordination with perri.",
2026-08-28T09:54:48.8192992Z       "requiredStages": [
2026-08-28T09:54:48.8193340Z         "doc",
2026-08-28T09:54:48.8193613Z         "impl",
2026-08-28T09:54:48.8193865Z         "unit",
2026-08-28T09:54:48.8194132Z         "int"
2026-08-28T09:54:48.8194383Z       ],
2026-08-28T09:54:48.8194657Z       "stages": {
2026-08-28T09:54:48.8194925Z         "doc": {
2026-08-28T09:54:48.8195206Z           "complete": true,
2026-08-28T09:54:48.8195488Z           "evidence": [
2026-08-28T09:54:48.8195739Z             {
2026-08-28T09:54:48.8196141Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:48.8196408Z               "line": 399
2026-08-28T09:54:48.8196670Z             }
2026-08-28T09:54:48.8196926Z           ]
2026-08-28T09:54:48.8197187Z         },
2026-08-28T09:54:48.8197448Z         "impl": {
2026-08-28T09:54:48.8197730Z           "complete": true,
2026-08-28T09:54:48.8198006Z           "evidence": [
2026-08-28T09:54:48.8198258Z             {
2026-08-28T09:54:48.8198640Z               "path": "crates/spt-store/src/worker_seq.rs",
2026-08-28T09:54:48.8198912Z               "line": 31
2026-08-28T09:54:48.8199270Z             },
2026-08-28T09:54:48.8199532Z             {
2026-08-28T09:54:48.8199897Z               "path": "crates/spt-store/src/worker_seq.rs",
2026-08-28T09:54:48.8200169Z               "line": 39
2026-08-28T09:54:48.8200493Z             },
2026-08-28T09:54:48.8200752Z             {
2026-08-28T09:54:48.8201095Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:48.8201367Z               "line": 45
2026-08-28T09:54:48.8201625Z             }
2026-08-28T09:54:48.8201883Z           ]
2026-08-28T09:54:48.8202133Z         },
2026-08-28T09:54:48.8202388Z         "int": {
2026-08-28T09:54:48.8202675Z           "complete": true,
2026-08-28T09:54:48.8202946Z           "evidence": [
2026-08-28T09:54:48.8203205Z             {
2026-08-28T09:54:48.8203604Z               "path": "crates/spt/tests/worker_lifecycle_e2e.rs",
2026-08-28T09:54:48.8203877Z               "line": 25
2026-08-28T09:54:48.8204139Z             },
2026-08-28T09:54:48.8204386Z             {
2026-08-28T09:54:48.8204859Z               "path": "crates/spt/tests/worker_lifecycle_e2e.rs",
2026-08-28T09:54:48.8205134Z               "line": 194
2026-08-28T09:54:48.8205389Z             }
2026-08-28T09:54:48.8205646Z           ]
2026-08-28T09:54:48.8205903Z         },
2026-08-28T09:54:48.8206172Z         "unit": {
2026-08-28T09:54:48.8206461Z           "complete": true,
2026-08-28T09:54:48.8206730Z           "evidence": [
2026-08-28T09:54:48.8206987Z             {
2026-08-28T09:54:48.8207336Z               "path": "crates/spt-store/src/info.rs",
2026-08-28T09:54:48.8207605Z               "line": 1167
2026-08-28T09:54:48.8207870Z             },
2026-08-28T09:54:48.8208122Z             {
2026-08-28T09:54:48.8208499Z               "path": "crates/spt-store/src/worker_seq.rs",
2026-08-28T09:54:48.8208747Z               "line": 74
2026-08-28T09:54:48.8209119Z             },
2026-08-28T09:54:48.8209372Z             {
2026-08-28T09:54:48.8209739Z               "path": "crates/spt-store/src/worker_seq.rs",
2026-08-28T09:54:48.8210049Z               "line": 88
2026-08-28T09:54:48.8210306Z             },
2026-08-28T09:54:48.8210558Z             {
2026-08-28T09:54:48.8210926Z               "path": "crates/spt-store/src/worker_seq.rs",
2026-08-28T09:54:48.8211264Z               "line": 111
2026-08-28T09:54:48.8211522Z             },
2026-08-28T09:54:48.8211779Z             {
2026-08-28T09:54:48.8212104Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.8212375Z               "line": 1310
2026-08-28T09:54:48.8212636Z             },
2026-08-28T09:54:48.8212887Z             {
2026-08-28T09:54:48.8213244Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:48.8213516Z               "line": 213
2026-08-28T09:54:48.8213774Z             }
2026-08-28T09:54:48.8214027Z           ]
2026-08-28T09:54:48.8214283Z         }
2026-08-28T09:54:48.8214536Z       }
2026-08-28T09:54:48.8214794Z     },
2026-08-28T09:54:48.8215047Z     {
2026-08-28T09:54:48.8215372Z       "id": "REQ-WORKER-PICKER-EXCLUDED",
2026-08-28T09:54:48.8219204Z       "title": "V-2 (WORKER-TRUTH triage, operator rider): non-drivable endpoint classes never render as picker rows — a worker perch cannot be driven, instantiated, or controlled; offering it is a lie the picker then fails on. Filter endpoint_type worker (and the psyche class if it ever surfaces — same non-drivable family) at every picker source leg, extend-not-multiply for future non-drivable classes.",
2026-08-28T09:54:48.8219669Z       "requiredStages": [
2026-08-28T09:54:48.8220060Z         "impl",
2026-08-28T09:54:48.8220337Z         "unit"
2026-08-28T09:54:48.8220594Z       ],
2026-08-28T09:54:48.8220880Z       "stages": {
2026-08-28T09:54:48.8221157Z         "doc": {
2026-08-28T09:54:48.8221438Z           "complete": false,
2026-08-28T09:54:48.8221710Z           "evidence": []
2026-08-28T09:54:48.8221966Z         },
2026-08-28T09:54:48.8222224Z         "impl": {
2026-08-28T09:54:48.8222506Z           "complete": true,
2026-08-28T09:54:48.8222778Z           "evidence": [
2026-08-28T09:54:48.8223050Z             {
2026-08-28T09:54:48.8223405Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.8223676Z               "line": 204
2026-08-28T09:54:48.8223947Z             },
2026-08-28T09:54:48.8224301Z             {
2026-08-28T09:54:48.8224649Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.8224916Z               "line": 336
2026-08-28T09:54:48.8225182Z             }
2026-08-28T09:54:48.8225435Z           ]
2026-08-28T09:54:48.8225683Z         },
2026-08-28T09:54:48.8225951Z         "int": {
2026-08-28T09:54:48.8226230Z           "complete": false,
2026-08-28T09:54:48.8226509Z           "evidence": []
2026-08-28T09:54:48.8226771Z         },
2026-08-28T09:54:48.8227038Z         "unit": {
2026-08-28T09:54:48.8227325Z           "complete": true,
2026-08-28T09:54:48.8227601Z           "evidence": [
2026-08-28T09:54:48.8227864Z             {
2026-08-28T09:54:48.8228203Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.8228541Z               "line": 707
2026-08-28T09:54:48.8228797Z             },
2026-08-28T09:54:48.8229143Z             {
2026-08-28T09:54:48.8229486Z               "path": "crates/spt/src/picker/data.rs",
2026-08-28T09:54:48.8229768Z               "line": 717
2026-08-28T09:54:48.8230026Z             }
2026-08-28T09:54:48.8230282Z           ]
2026-08-28T09:54:48.8230540Z         }
2026-08-28T09:54:48.8230788Z       }
2026-08-28T09:54:48.8231047Z     },
2026-08-28T09:54:48.8231295Z     {
2026-08-28T09:54:48.8231597Z       "id": "REQ-WORKER-REAP",
2026-08-28T09:54:48.8239908Z       "title": "W-3 (WORKER-TRUTH triage): worker records must not persist indefinitely past their useful life — 6 dead-pid workers leaked OFFLINE on flynn (kill-paths where SubagentStop never fires: parent killed, abort, timeout). The stored rec.pid is the ephemeral worker-start hook process (dead by design — the REQ-HAZARD-DEAD-REC-PID class; NEVER an alive-gate signal). Honest reap signals: (a) parent-session lifecycle — reap the parent's soft-stopped + orphaned workers at parent session-end/boundary and on parent-death detection (a worker cannot outlive its parent's live session); (b) a generous TTL floor since `created` as belt-and-braces. Soft-stop preservation semantics (REQ-HAZARD-SOFT-CLEANUP: results drain before reap) stay honored — reap after drain-or-expiry, never mid-flight hard-delete (cascade-wipe guard rationale stands). Sister shape: claude_skill_owl doctor D-21 orphan-worker GC.",
2026-08-28T09:54:48.8240347Z       "requiredStages": [
2026-08-28T09:54:48.8240609Z         "impl",
2026-08-28T09:54:48.8240862Z         "unit",
2026-08-28T09:54:48.8241119Z         "int"
2026-08-28T09:54:48.8241381Z       ],
2026-08-28T09:54:48.8241649Z       "stages": {
2026-08-28T09:54:48.8241902Z         "doc": {
2026-08-28T09:54:48.8242181Z           "complete": false,
2026-08-28T09:54:48.8242453Z           "evidence": []
2026-08-28T09:54:48.8242710Z         },
2026-08-28T09:54:48.8242969Z         "impl": {
2026-08-28T09:54:48.8243326Z           "complete": true,
2026-08-28T09:54:48.8243602Z           "evidence": [
2026-08-28T09:54:48.8243856Z             {
2026-08-28T09:54:48.8244231Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.8244526Z               "line": 276
2026-08-28T09:54:48.8244777Z             },
2026-08-28T09:54:48.8245039Z             {
2026-08-28T09:54:48.8245402Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8245668Z               "line": 59
2026-08-28T09:54:48.8245921Z             },
2026-08-28T09:54:48.8246174Z             {
2026-08-28T09:54:48.8246551Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8246817Z               "line": 87
2026-08-28T09:54:48.8247076Z             },
2026-08-28T09:54:48.8247327Z             {
2026-08-28T09:54:48.8247682Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.8247949Z               "line": 363
2026-08-28T09:54:48.8248206Z             }
2026-08-28T09:54:48.8248464Z           ]
2026-08-28T09:54:48.8248722Z         },
2026-08-28T09:54:48.8249069Z         "int": {
2026-08-28T09:54:48.8249351Z           "complete": true,
2026-08-28T09:54:48.8249619Z           "evidence": [
2026-08-28T09:54:48.8249960Z             {
2026-08-28T09:54:48.8250420Z               "path": "crates/spt-daemon/src/livehost.rs",
2026-08-28T09:54:48.8250950Z               "line": 1789
2026-08-28T09:54:48.8251369Z             }
2026-08-28T09:54:48.8251756Z           ]
2026-08-28T09:54:48.8252056Z         },
2026-08-28T09:54:48.8252323Z         "unit": {
2026-08-28T09:54:48.8252708Z           "complete": true,
2026-08-28T09:54:48.8252989Z           "evidence": [
2026-08-28T09:54:48.8253243Z             {
2026-08-28T09:54:48.8253633Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8253900Z               "line": 163
2026-08-28T09:54:48.8254162Z             },
2026-08-28T09:54:48.8254416Z             {
2026-08-28T09:54:48.8254792Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8255160Z               "line": 173
2026-08-28T09:54:48.8255419Z             },
2026-08-28T09:54:48.8255676Z             {
2026-08-28T09:54:48.8256062Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8256344Z               "line": 191
2026-08-28T09:54:48.8256596Z             },
2026-08-28T09:54:48.8256858Z             {
2026-08-28T09:54:48.8257231Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8257497Z               "line": 206
2026-08-28T09:54:48.8257758Z             },
2026-08-28T09:54:48.8258013Z             {
2026-08-28T09:54:48.8258390Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8258657Z               "line": 225
2026-08-28T09:54:48.8258924Z             },
2026-08-28T09:54:48.8259262Z             {
2026-08-28T09:54:48.8259639Z               "path": "crates/spt-store/src/worker_reap.rs",
2026-08-28T09:54:48.8259906Z               "line": 241
2026-08-28T09:54:48.8260170Z             },
2026-08-28T09:54:48.8260425Z             {
2026-08-28T09:54:48.8260786Z               "path": "crates/spt/src/api/reporting.rs",
2026-08-28T09:54:48.8261129Z               "line": 1688
2026-08-28T09:54:48.8261386Z             }
2026-08-28T09:54:48.8261647Z           ]
2026-08-28T09:54:48.8261896Z         }
2026-08-28T09:54:48.8262154Z       }
2026-08-28T09:54:48.8262407Z     },
2026-08-28T09:54:48.8262655Z     {
2026-08-28T09:54:48.8262994Z       "id": "REQ-WORKER-SID-SYMMETRIC-AUTH",
2026-08-28T09:54:48.8270649Z       "title": "W-2 (WORKER-TRUTH triage, operator-ruled 2026-07-06): worker verbs go sid-symmetric with every sibling id-scoped verb — worker-start mints NO token and worker-stop takes NONE (token custody is undue adapter burden, ruling via perri). Registration STORES the sid it authenticated (the parent's sid at start; today cmd_worker_start hardcodes session_id=\"\" — worker.rs:44 — so a sid-authed stop compares against empty and refuses 100%). Stop accepts the parent's CURRENT sid OR the stored registration sid (a /clear between start and stop rotates the parent's sid; either rotation endpoint is honest custody — the REQ-PSYCHE-SID-CUSTODY rotation reasoning). Under the ruling the field adapter's existing emission (worker-stop <id> --session-id <parent sid>) becomes contract-correct as-is. Publish the frozen verb shape to the docs-site with the landing wave (perri blind-builds from published docs).",
2026-08-28T09:54:48.8271057Z       "requiredStages": [
2026-08-28T09:54:48.8271312Z         "doc",
2026-08-28T09:54:48.8271578Z         "impl",
2026-08-28T09:54:48.8271836Z         "unit",
2026-08-28T09:54:48.8272094Z         "int"
2026-08-28T09:54:48.8272351Z       ],
2026-08-28T09:54:48.8272610Z       "stages": {
2026-08-28T09:54:48.8272866Z         "doc": {
2026-08-28T09:54:48.8273148Z           "complete": true,
2026-08-28T09:54:48.8273414Z           "evidence": [
2026-08-28T09:54:48.8273667Z             {
2026-08-28T09:54:48.8274058Z               "path": "docs-site/src/harness-contract/api.md",
2026-08-28T09:54:48.8274339Z               "line": 420
2026-08-28T09:54:48.8274597Z             }
2026-08-28T09:54:48.8274859Z           ]
2026-08-28T09:54:48.8275135Z         },
2026-08-28T09:54:48.8275392Z         "impl": {
2026-08-28T09:54:48.8275969Z           "complete": true,
2026-08-28T09:54:48.8276262Z           "evidence": [
2026-08-28T09:54:48.8276520Z             {
2026-08-28T09:54:48.8276853Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:48.8277126Z               "line": 236
2026-08-28T09:54:48.8277378Z             },
2026-08-28T09:54:48.8277629Z             {
2026-08-28T09:54:48.8277949Z               "path": "crates/spt/src/api/mod.rs",
2026-08-28T09:54:48.8278217Z               "line": 978
2026-08-28T09:54:48.8278479Z             },
2026-08-28T09:54:48.8278743Z             {
2026-08-28T09:54:48.8279181Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:48.8279449Z               "line": 46
2026-08-28T09:54:48.8279720Z             }
2026-08-28T09:54:48.8280049Z           ]
2026-08-28T09:54:48.8280307Z         },
2026-08-28T09:54:48.8280564Z         "int": {
2026-08-28T09:54:48.8280846Z           "complete": true,
2026-08-28T09:54:48.8281122Z           "evidence": [
2026-08-28T09:54:48.8281374Z             {
2026-08-28T09:54:48.8281781Z               "path": "crates/spt/tests/worker_lifecycle_e2e.rs",
2026-08-28T09:54:48.8282048Z               "line": 26
2026-08-28T09:54:48.8282306Z             },
2026-08-28T09:54:48.8282555Z             {
2026-08-28T09:54:48.8282964Z               "path": "crates/spt/tests/worker_lifecycle_e2e.rs",
2026-08-28T09:54:48.8283250Z               "line": 194
2026-08-28T09:54:48.8283499Z             }
2026-08-28T09:54:48.8283756Z           ]
2026-08-28T09:54:48.8284008Z         },
2026-08-28T09:54:48.8284274Z         "unit": {
2026-08-28T09:54:48.8284556Z           "complete": true,
2026-08-28T09:54:48.8284838Z           "evidence": [
2026-08-28T09:54:48.8285100Z             {
2026-08-28T09:54:48.8285434Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:48.8285753Z               "line": 543
2026-08-28T09:54:48.8286087Z             },
2026-08-28T09:54:48.8286439Z             {
2026-08-28T09:54:48.8286771Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:48.8287056Z               "line": 553
2026-08-28T09:54:48.8287308Z             },
2026-08-28T09:54:48.8287565Z             {
2026-08-28T09:54:48.8287889Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:48.8288162Z               "line": 576
2026-08-28T09:54:48.8288429Z             },
2026-08-28T09:54:48.8288682Z             {
2026-08-28T09:54:48.8289106Z               "path": "crates/spt/src/api/auth.rs",
2026-08-28T09:54:48.8289377Z               "line": 594
2026-08-28T09:54:48.8289634Z             },
2026-08-28T09:54:48.8289889Z             {
2026-08-28T09:54:48.8290233Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:48.8290505Z               "line": 213
2026-08-28T09:54:48.8290848Z             },
2026-08-28T09:54:48.8291105Z             {
2026-08-28T09:54:48.8291483Z               "path": "crates/spt/src/api/worker.rs",
2026-08-28T09:54:48.8291764Z               "line": 245
2026-08-28T09:54:48.8292020Z             }
2026-08-28T09:54:48.8292279Z           ]
2026-08-28T09:54:48.8292528Z         }
2026-08-28T09:54:48.8292786Z       }
2026-08-28T09:54:48.8293037Z     },
2026-08-28T09:54:48.8293290Z     {
2026-08-28T09:54:48.8293619Z       "id": "REQ-XTASK-SPT-BIN-TARGET-DIR",
2026-08-28T09:54:48.8305494Z       "title": "#13 (F026 micro, tooling): xtask `spt_bin()` (crates/xtask/src/main.rs) BUILDS `spt` via cargo (which honors CARGO_TARGET_DIR) but returns a HARDCODED `<root>/target/debug/spt` path — so under a redirected target dir (CI / isolated-gate rigs that set CARGO_TARGET_DIR to a throwaway) the binary lands in `$CARGO_TARGET_DIR/debug` while xtask looks in `<root>/target/debug` -> NotFound -> `xtask check` (docs-drift gate) spuriously fails. Workaround was running `xtask check` with CARGO_TARGET_DIR unset. FIX: a pure `target_debug_dir(root, CARGO_TARGET_DIR)` seam mirroring cargo's resolution — absolute override as-is, relative resolved against `root` (the dir cargo is invoked in), default `<root>/target` — join `debug`; `spt_bin` returns from it. See docs/NEXT-MILESTONE-PICKER-TRIAGE.md.",
2026-08-28T09:54:48.8305981Z       "requiredStages": [
2026-08-28T09:54:48.8306254Z         "impl",
2026-08-28T09:54:48.8306506Z         "unit"
2026-08-28T09:54:48.8306758Z       ],
2026-08-28T09:54:48.8307025Z       "stages": {
2026-08-28T09:54:48.8307287Z         "doc": {
2026-08-28T09:54:48.8307579Z           "complete": false,
2026-08-28T09:54:48.8307854Z           "evidence": []
2026-08-28T09:54:48.8308109Z         },
2026-08-28T09:54:48.8308370Z         "impl": {
2026-08-28T09:54:48.8308657Z           "complete": true,
2026-08-28T09:54:48.8308929Z           "evidence": [
2026-08-28T09:54:48.8309291Z             {
2026-08-28T09:54:48.8309625Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.8309988Z               "line": 238
2026-08-28T09:54:48.8310245Z             },
2026-08-28T09:54:48.8310497Z             {
2026-08-28T09:54:48.8310833Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.8311110Z               "line": 264
2026-08-28T09:54:48.8311368Z             }
2026-08-28T09:54:48.8311620Z           ]
2026-08-28T09:54:48.8311877Z         },
2026-08-28T09:54:48.8312140Z         "int": {
2026-08-28T09:54:48.8312425Z           "complete": false,
2026-08-28T09:54:48.8312703Z           "evidence": []
2026-08-28T09:54:48.8312961Z         },
2026-08-28T09:54:48.8313226Z         "unit": {
2026-08-28T09:54:48.8313509Z           "complete": true,
2026-08-28T09:54:48.8313795Z           "evidence": [
2026-08-28T09:54:48.8314058Z             {
2026-08-28T09:54:48.8314387Z               "path": "crates/xtask/src/main.rs",
2026-08-28T09:54:48.8314658Z               "line": 2252
2026-08-28T09:54:48.8314917Z             }
2026-08-28T09:54:48.8315179Z           ]
2026-08-28T09:54:48.8315446Z         }
2026-08-28T09:54:48.8315703Z       }
2026-08-28T09:54:48.8315955Z     }
2026-08-28T09:54:48.8316208Z   ],
2026-08-28T09:54:48.8316546Z   "findings": []
2026-08-28T09:54:48.8316804Z }
